onActivityResult 没有被 UnityPlayerActivity 调用

我没有很多为 Unity3d 创建 Java (.aar) 插件的经验,但我正在尝试使用此类插件的 firebase 设置 google 身份验证。举一个我的问题的例子,我首先打开一个统一的 android 应用程序,然后我运行下面的 c# 代码,并在我的显示器上弹出一个用谷歌登录的窗口。然后我选择正确的谷歌帐户,然后谷歌意图/活动消失,然后我没有收到任何指示“onActivityResult”已被调用。没有发生错误,我无法对我选择的谷歌帐户信息做任何事情。

在下图中,我单击提交 -> 它会在下一张图片中打开 google 登录活动 -> 然后它返回到提交屏幕(关闭 google 登录活动)。

http://img4.mukewang.com/629b291e0001ecc902970594.jpghttp://img2.mukewang.com/629b29250001924203100606.jpg

我认为我的问题出在这一行:


activity.startActivityForResult(signInIntent, RC_SIGN_IN);

本例中的“活动”是从下面的 c# unity 代码发送的 UnityPlayerActivity。我认为这是成功的,所以我的代码正在 C# 统一代码而不是 java 代码中寻找“onActivityResult”方法。任何帮助将不胜感激。如果您需要任何其他信息或屏幕截图,请告诉我。如果我是个白痴,请叫我出来。


这是我从 C# 和 Unity3d 调用 Google 登录插件的代码:


        AndroidJNIHelper.debug = true; 

        using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {

            activity_context = activityClass.GetStatic<AndroidJavaObject>("currentActivity");

        }

        using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.package.class")) {

            if (pluginClass != null) {

                GoogleSignInActivity = pluginClass.CallStatic<AndroidJavaObject>("instance");

                GoogleSignInActivity.Call("SetContext", activity_context);

                GoogleSignInActivity.Call("StartGoogleLogin", activity_context);


                activity_context.Call("runOnUiThread", new AndroidJavaRunnable(() => {

                    GoogleSignInActivity.Call("ShowMessage", "You signed in as " + display_name);

                }));

            }

        }

以下是创建 Google SignIn Activity 的代码:


public void StartGoogleLogin(UnityPlayerActivity activity) {

    gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

            .requestIdToken("some url")

            .requestEmail()

            .build();


    mGoogleSignInClient = GoogleSignIn.getClient(activity, gso);


    Intent signInIntent = mGoogleSignInClient.getSignInIntent();

    activity.startActivityForResult(signInIntent, RC_SIGN_IN);

    Log.d(TAG, "Activity Started; Waiting For Result");

}


感谢您的时间。


开心每一天1111
浏览 522回答 2
2回答

有只小跳蛙

当你从 UnityPlayerActivity 启动一个活动时,onActivityResult 将在完成时被调用,但会有它的默认返回值。您可以做的是在 Android 中创建一个新的 Activity,并扩展 UnityPlayerActivity。在 Android 中,创建一个新的 Activityimport com.unity3d.player.UnityPlayer;public class OverrideUnityPlayerActivity extends UnityPlayerActivity{&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void onCreate(Bundle savedInstanceState) {&nbsp; &nbsp; &nbsp; &nbsp; super.onCreate(savedInstanceState);&nbsp; &nbsp; }&nbsp; &nbsp; public Activity getCurrentActivity(){&nbsp; &nbsp; &nbsp; &nbsp; return mUnityPlayer.currentActivity;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onActivityResult(int requestCode, int resultCode, Intent data) {&nbsp; &nbsp; &nbsp; &nbsp; super.onActivityResult(requestCode, resultCode, data);&nbsp; &nbsp; &nbsp; &nbsp; if (requestCode == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch (resultCode) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case Activity.RESULT_OK:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //do something&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case Activity.RESULT_CANCELED:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //do something&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}您需要将此覆盖活动设置为 AndroidManifest.XML 中的启动端点<?xml version="1.0" encoding="utf-8"?><manifest&nbsp; &nbsp; xmlns:android="http://schemas.android.com/apk/res/android"&nbsp; &nbsp; package="com.unity3d.player"&nbsp; &nbsp; xmlns:tools="http://schemas.android.com/tools">&nbsp; &nbsp; <uses-permission android:name="android.permission.INTERNET" />&nbsp; &nbsp; <application&nbsp; &nbsp; &nbsp; &nbsp; android:allowBackup="false"&nbsp; &nbsp; &nbsp; &nbsp; tools:replace="android:allowBackup">&nbsp; &nbsp; &nbsp; &nbsp; <activity&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; android:name="com.example.unitylibrary.manager.OverrideUnityPlayerActivity">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <intent-filter>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <action android:name="android.intent.action.MAIN" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <category android:name="android.intent.category.LAUNCHER" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </intent-filter>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <meta-data android:name="app_name" android:value="app_value"/>&nbsp; &nbsp; &nbsp; &nbsp; </activity>&nbsp; &nbsp; </application></manifest>3.然后在Unity中,可以得到这个activity和context,也可以得到onActivityResultAndroidJavaObject overridePlayerActivity;AndroidJavaObject overrideActivity;public void init(){&nbsp; &nbsp; overridePlayerActivity = new AndroidJavaObject("com.example.unitylibrary.manager.OverrideUnityPlayerActivity");&nbsp; &nbsp; overrideActivity= overridePlayerActivity.Call<AndroidJavaObject>("getCurrentActivity");}public void startAct(){&nbsp; &nbsp; anonymousFunction.Call("StartActForRes", overrideActivity);}希望这能解决您的问题。

BIG阳

好吧,我解决了我自己的问题,即让 Google 身份验证在 Android .aar 插件和 Unity c# 之间工作。一直在不知疲倦地工作并找到了一些kickbutt资源。首先,我在这里引用了一个名为 cwgtech 的人编写的代码。我还浏览了他所有的视频。我没有使用 UnitySendMessage,而是使用类似于 CWGTech 所做的回调方法将 googleIdToken 发送回 Unity 并使用 Google 登录 Firebase。我认为我的错误在于以下陈述也是正确的:activity.startActivityForResult(signInIntent, RC_SIGN_IN);我没有这样做,而是按照 CWGTech 的建议删除了“活动”。部分。我在扩展 Activity 的 ResultCallback 类中运行 startActivityForResult。如果您仍然感到困惑,请 dm 我或评论此帖子。谢谢!这是我用来通过 Java 代理向 Unity 发送回调字符串的一些代码,用 C# 编写。有关编写 Java 代理的信息可以在上面的 cwgtech 信息中找到。如果您想获取从 Android 活动流向 Unity C# 的信息,则编写 java 代理非常重要。CWGTech 对 java 代理的复杂性的解释比我能做到的要好得多。public static final String LOGTAG = GoogleSignInActivity.TAG + "_OnResult";public static GoogleSignInActivity.ShareStringCallback shareStringCallback;private static final int RC_SIGN_IN = 9001;private GoogleSignInClient mGoogleSignInClient;private GoogleSignInOptions gso;private CallbackManager mCallbackManager;public void myFinish(String myresult) {&nbsp; &nbsp; if (shareStringCallback != null) {&nbsp; &nbsp; &nbsp; &nbsp; shareStringCallback.onLoginComplete(myresult);&nbsp; &nbsp; }&nbsp; &nbsp; shareStringCallback = null;&nbsp; &nbsp; finish();}@Overrideprotected void onCreate(Bundle savedInstanceState) {&nbsp; &nbsp; super.onCreate(savedInstanceState);&nbsp; &nbsp; Log.i(LOGTAG, "onCreateBundle");&nbsp; &nbsp; Intent intent = getIntent();&nbsp; &nbsp; setContentView(R.layout.login_activity);&nbsp; &nbsp; findViewById(R.id.buttonFacebookLogin).setOnClickListener(this);&nbsp; &nbsp; findViewById(R.id.signInButton).setOnClickListener(this);&nbsp; &nbsp; findViewById(R.id.buttonAnonymousSignIn).setOnClickListener(this);}/* GOOGLE SIGN-IN CODE */public Intent StartGoogleLogin() {&nbsp; &nbsp; /*&nbsp; &nbsp; Google Sign In Client Init Code Goes Here&nbsp; &nbsp; */&nbsp; &nbsp; Intent signInIntent = mGoogleSignInClient.getSignInIntent();&nbsp; &nbsp; return signInIntent;}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {&nbsp; &nbsp; //Detects some type of result from an activity, in this case Google&nbsp; &nbsp; String id_result = "Send This To Unity";&nbsp; &nbsp; myFinish(id_result);}这是来自不同 java 类文件的更多代码。'Login' 方法是从 Unity c# 调用的。/* INTERFACES FOR CALLBACK FUNCTIONAILITY */public interface ShareStringCallback {&nbsp; &nbsp; public void onLoginComplete(String result);}public void Login(final ShareStringCallback callback){&nbsp; &nbsp; mainActivity.runOnUiThread(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.i(TAG,"Starting Authentication");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Intent shareIntent = new Intent();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shareIntent.setAction(Intent.ACTION_SEND);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shareIntent.setClass(mainActivity,OnResultCallback.class);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnResultCallback.shareStringCallback = callback;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mainActivity.startActivity(shareIntent);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (Exception e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.i(TAG,"error sharing intent: " + e);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (Exception e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.i(TAG,"Error getting Uri: " + e);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (Exception e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.i(TAG,"Error writing file: " + e);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java