onActivityResult не вызывается для UnityPlayerActivity - PullRequest
0 голосов
/ 04 февраля 2019

У меня нет большого опыта создания плагинов Java (.aar) для Unity3d, но я пытаюсь настроить аутентификацию Google с помощью firebase из такого плагина.Чтобы привести пример моей проблемы, я начинаю с открытия приложения для android для единства, затем запускаю приведенный ниже код c # и на моем экране появляется всплывающее окно для входа в Google.Затем я выбираю правильный аккаунт Google, затем намерение / активность Google исчезает, и я не получаю указаний на то, что был вызван "onActivityResult".Никаких ошибок не происходит, и я не могу ничего сделать с выбранной информацией об аккаунте Google.

На изображении ниже я нажимаю кнопку отправить -> откроется действие входа в Google на следующем изображении ->затем он возвращается к экрану отправки (закрывая активность входа в Google).enter image description hereenter image description here

Я думаю, что моя проблема заключается в этой строке:

activity.startActivityForResult(signInIntent, RC_SIGN_IN);

«Деятельность» в этом случаеUnityPlayerActivity отправлено из кода C # Unity ниже.Я думаю, что это делает это так, что мой код ищет метод "onActivityResult" в коде Unity C #, а не код Java.Любая помощь будет принята с благодарностью.Дайте мне знать, если вам нужна другая информация или скриншоты.Пожалуйста, позвоните мне, если я идиот.

Вот мой код для вызова плагина входа в Google из C # & Unity3d:

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

Спасибо за потраченное время.

1 Ответ

0 голосов
/ 08 февраля 2019

Что ж, я решил собственную проблему настройки аутентификации Google между плагином Android .aar и Unity c #.Работал не покладая рук и нашел некоторые ресурсы для кикбута.

Прежде всего, я ссылался на код, написанный парнем по имени cwgtech ЗДЕСЬ .

Я также просмотрел все его videos .

Вместо использования UnitySendMessage я смог использовать метод обратного вызова, аналогичный CWGTech, для отправки googleIdToken обратно в Unity и входа в Google с помощью Firebase.Я также был прав, думая, что моя ошибка была в следующем утверждении:

activity.startActivityForResult(signInIntent, RC_SIGN_IN);

Вместо того, чтобы делать это, я последовал совету CWGTech и удалил «активность».часть.Я запустил startActivityForResult в классе ResultCallback, который расширяет Activity.Если вы все еще в замешательстве, дм меня или прокомментируйте этот пост.Спасибо!

Вот часть кода, который я использовал для отправки строки обратного вызова в Unity через прокси-сервер Java, написанный на C #.Информация о написании прокси Java может быть найдена в информации cwgtech выше.Написание Java-прокси чрезвычайно важно, если вы хотите, чтобы информация передавалась из действий Android в Unity C #.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);
            }
        }
    });
}
...