为了账号安全,请及时绑定邮箱和手机立即绑定

onActivityResult 没有被 UnityPlayerActivity 调用

onActivityResult 没有被 UnityPlayerActivity 调用

开心每一天1111 2022-06-04 17:42:30
我没有很多为 Unity3d 创建 Java (.aar) 插件的经验,但我正在尝试使用此类插件的 firebase 设置 google 身份验证。举一个我的问题的例子,我首先打开一个统一的 android 应用程序,然后我运行下面的 c# 代码,并在我的显示器上弹出一个用谷歌登录的窗口。然后我选择正确的谷歌帐户,然后谷歌意图/活动消失,然后我没有收到任何指示“onActivityResult”已被调用。没有发生错误,我无法对我选择的谷歌帐户信息做任何事情。在下图中,我单击提交 -> 它会在下一张图片中打开 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");}感谢您的时间。
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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


在 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;

            }

        }

    }

}

您需要将此覆盖活动设置为 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);

}

希望这能解决您的问题。


查看完整回答
反对 回复 2022-06-04
?
BIG阳

TA贡献1859条经验 获得超6个赞

好吧,我解决了我自己的问题,即让 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) {


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

            }

        }

    });

}


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 521 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号