【问题标题】:onActivityResult Not Being Called For UnityPlayerActivityonActivityResult 没有被 UnityPlayerActivity 调用
【发布时间】:2019-02-04 19:25:29
【问题描述】:

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

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

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

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");
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "Result Received!");

    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            // Google Sign In was successful
            GoogleSignInAccount account = task.getResult(ApiException.class);
            someMethod(account);
        } catch (ApiException e) {
            // Google Sign In failed, update UI appropriately
            Log.d(TAG, "Google sign in failed", e);
        }
        setResult(RESULT_OK);
    }
}

感谢您的宝贵时间。

【问题讨论】:

    标签: java c# android unity3d aar


    【解决方案1】:

    好吧,我自己解决了让 Google 身份验证在 Android .aar 插件和 Unity c# 之间工作的问题。一直在不知疲倦地工作,找到了一些kickbutt资源。

    首先,我引用了一个叫 cwgtech HERE 的人写的代码。

    我也浏览了他所有的videos

    我能够使用类似于 CWGTech 所做的回调方法将 googleIdToken 发送回 Unity 并使用 Google 登录 Firebase,而不是使用 UnitySendMessage。我也正确地认为我的错误在于以下陈述:

    activity.startActivityForResult(signInIntent, RC_SIGN_IN);
    

    我没有这样做,而是按照 CWGTech 的建议删除了“活动”。部分。我在扩展 Activity 的 ResultCallback 类中运行 startActivityForResult。如果您仍然感到困惑,请私信我或评论此帖子。谢谢!

    这是我用来通过 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) {
    
        if (shareStringCallback != null) {
            shareStringCallback.onLoginComplete(myresult);
        }
    
        shareStringCallback = null;
        finish();
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(LOGTAG, "onCreateBundle");
        Intent intent = getIntent();
    
        setContentView(R.layout.login_activity);
        findViewById(R.id.buttonFacebookLogin).setOnClickListener(this);
        findViewById(R.id.signInButton).setOnClickListener(this);
        findViewById(R.id.buttonAnonymousSignIn).setOnClickListener(this);
    }
    
    /* GOOGLE SIGN-IN CODE */
    public Intent StartGoogleLogin() {
        /*
        Google Sign In Client Init Code Goes Here
        */
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        return signInIntent;
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //Detects some type of result from an activity, in this case Google
        String id_result = "Send This To Unity";
        myFinish(id_result);
    }
    

    这里有一些来自不同 java 类文件的代码。 'Login' 方法是从 Unity c# 中调用的。

    /* INTERFACES FOR CALLBACK FUNCTIONAILITY */
    public interface ShareStringCallback {
        public void onLoginComplete(String result);
    }
    
    public void Login(final ShareStringCallback callback)
    {
        mainActivity.runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                try {
                    Log.i(TAG,"Starting Authentication");
    
                    try {
                        try {
                            Intent shareIntent = new Intent();
                            shareIntent.setAction(Intent.ACTION_SEND);
                            shareIntent.setClass(mainActivity,OnResultCallback.class);
                            OnResultCallback.shareStringCallback = callback;
                            mainActivity.startActivity(shareIntent);
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                            Log.i(TAG,"error sharing intent: " + e);
                        }
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                        Log.i(TAG,"Error getting Uri: " + e);
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    Log.i(TAG,"Error writing file: " + e);
                }
            }
        });
    }
    

    【讨论】:

    • 嘿...我一直在尝试使用 Android 语音插件来实现统一,但我的 onActivityResult 回调与您的不一样...。您能否给出详细的解释,我可以遵循。 ..请告诉我
    • @alamshahbaz16497 我在上面发布了更多代码来提供帮助。该代码用于从 Android studio java 代码回调到 c# Unity 端。我建议观看我在上面发布的 cwgtech 的视频。他们帮了我很多忙。让我知道这是否有帮助以及您遇到了什么类型的问题?
    【解决方案2】:

    当你从 UnityPlayerActivity 启动一个 Activity 时,onActivityResult 将在完成时被调用,但会有它的默认返回值。您可以做的是在 Android 中创建一个新的 Activity,并扩展 UnityPlayerActivity。

    1. 在 Android 中,创建一个新 Activity
    import com.unity3d.player.UnityPlayer;
    
    public class OverrideUnityPlayerActivity extends UnityPlayerActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        public Activity getCurrentActivity(){
            return mUnityPlayer.currentActivity;
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 0) {
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        //do something
                        break;
                    case Activity.RESULT_CANCELED:
                        //do something
                        break;
                }
            }
        }
    }
    
    1. 您需要将此覆盖活动设置为 AndroidManifest.XML 中的启动端点
    <?xml version="1.0" encoding="utf-8"?>
    <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.unity3d.player"
        xmlns:tools="http://schemas.android.com/tools">
        <uses-permission android:name="android.permission.INTERNET" />
        <application
            android:allowBackup="false"
            tools:replace="android:allowBackup">
            <activity 
                android:name="com.example.unitylibrary.manager.OverrideUnityPlayerActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                <meta-data android:name="app_name" android:value="app_value"/>
            </activity>
        </application>
    </manifest>
    
    

    3.然后在Unity中,可以得到这个activity和context,也可以得到onActivityResult

    AndroidJavaObject overridePlayerActivity;
    AndroidJavaObject overrideActivity;
    
    public void init(){
        overridePlayerActivity = new AndroidJavaObject("com.example.unitylibrary.manager.OverrideUnityPlayerActivity");
        overrideActivity= overridePlayerActivity.Call<AndroidJavaObject>("getCurrentActivity");
    }
    
    public void startAct(){
        anonymousFunction.Call("StartActForRes", overrideActivity);
    }
    

    希望这能解决您的问题。

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 2014-08-26
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多