亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 499 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號