没有为UnityPlayerActivity调用onActivityResult

问题描述 投票:0回答:1

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

在下面的图片中,我点击提交 - >它在下一张图片中打开谷歌登录活动 - >然后它返回到提交屏幕(关闭谷歌登录活动)。 enter image description hereenter image description here

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

activity.startActivityForResult(signInIntent, RC_SIGN_IN);

在这种情况下,“活动”是从下面的c#统一代码发送的UnityPlayerActivity。我认为这样做是因为我的代码在C#unity代码而不是java代码中寻找“onActivityResult”方法。任何帮助将不胜感激。如果您需要任何其他信息或屏幕截图,请与我们联系。如果我是个白痴,请叫我。

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

        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登录活动的代码:

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个回答
0
投票

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

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

我也经历了他所有的videos

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

activity.startActivityForResult(signInIntent, RC_SIGN_IN);

我没有这样做,而是遵循了CWGTech的建议并删除了“活动”。一部分。我在扩展Activity的ResultCallback类中运行了startActivityForResult。如果您仍然感到困惑,请跟我或评论这篇文章。谢谢!

以下是我用C#编写的Java代理向Unity发送回调字符串的一些代码。有关编写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类文件的更多代码。从Unity c#调用'Login'方法。

/* 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);
            }
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.