簡體   English   中英

未為 UnityPlayerActivity 調用 onActivityResult

[英]onActivityResult Not Being Called For UnityPlayerActivity

我沒有很多為 Unity3d 創建 Java (.aar) 插件的經驗,但我正在嘗試使用來自此類插件的 firebase 設置 google 身份驗證。 舉一個我的問題的例子,我首先打開一個統一的 android 應用程序,然后我運行下面的 c# 代碼,並在我的顯示器上彈出一個使用谷歌登錄的彈出窗口。 然后我選擇正確的谷歌帳戶,然后谷歌意圖/活動消失,然后我沒有收到“onActivityResult”被調用的指示。 沒有錯誤發生,我無法對我選擇的谷歌帳戶信息做任何事情。

在下圖中,我單擊提交 -> 它在下一張圖片中打開谷歌登錄活動 -> 然后返回到提交屏幕(關閉谷歌登錄活動)。 在此處輸入圖片說明 在此處輸入圖片說明

我認為我的問題出在這一行:

activity.startActivityForResult(signInIntent, RC_SIGN_IN);

在這種情況下,“活動”是從下面的 c# 統一代碼發送的 UnityPlayerActivity。 我認為這樣做是為了讓我的代碼在 C# 統一代碼而不是 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 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);
    }
}

感謝您的時間。

好吧,我自己解決了讓 Google 身份驗證在 Android .aar 插件和 Unity c# 之間工作的問題。 一直在不知疲倦地工作,並找到了一些 kickbutt 資源。

首先,我參考了一個叫 cwgtech HERE的人寫的代碼。

我還瀏覽了他所有的視頻

我沒有使用 UnitySendMessage,而是使用類似於 CWGTech 所做的回調方法將 googleIdToken 發送回 Unity 並使用 Google 登錄到 Firebase。 我認為我的錯誤在於以下陳述也是正確的:

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

當您從 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);
}

希望這能解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM