Пользовательский плагин Unity Adroid. Зависание приложения при возврате из другой активности
Я разрабатываю игру для Android с Unity. Игра использует firebase для управления всей информацией об игре и пользователях. Я хотел дать игроку возможность войти в систему с учетной записью Google, и я создал собственный плагин для Android с Android Studio, который вызывает действие GoogleSignIn, чтобы получить токен и передать его коду Unity для выполнения части входа в Firebase.
Проблема возникает, когда приложение зависает, когда оно возвращается из GoogleSignInActivity. (Не всегда, но почти всегда). Все функции обратного вызова вызываются правильно, но кажется, что UnityPlayer перестает работать или что-то подобное, потому что объекты в сцене не выполняют свою функцию обновления, а текстуры вообще не отображаются, оставляя черный экран.
Я пробовал расширить UnityPlayerActivity и startActivityForResult оттуда, но это не работает. Кроме того, я попытался создать второе действие, которое вызывает действие GoogleSignin. Второй использует метод обратного вызова для возврата результата в Unity.
Это фактический код моего плагина:
public interface ShareStringCallback {
public void onLoginComplete(String result);
}
public void signIn(final ShareStringCallback callback){
Log.i(LOGTAG, "signIn: ");
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Log.i(LOGTAG, "RunningIntent: ");
Intent shareIntent = new Intent();
shareIntent.setClass(mainActivity, OnResultCallback.class);
OnResultCallback.shareStringCallBack = callback;
mainActivity.startActivity(shareIntent);
} catch (Exception e) {
e.printStackTrace();
Log.i(LOGTAG, "error sharing intent: " + e);
}
}
});
}
public void signOut(){
Log.i(LOGTAG,"google signout in plugin");
OnResultCallback.SignOut();
}
А это код активности OnResutlCallback:
public static MyPlugin.ShareStringCallback shareStringCallBack;
private static final int RC_SIGN_IN = 9001;
Boolean finishing = false;
void MyFinish(String result){
if(finishing){
return;
}
finishing = true;
if(shareStringCallBack!=null){
shareStringCallBack.onLoginComplete(result);
}
shareStringCallBack = null;
finish();
}
protected static GoogleSignInClient InitGoogle(Activity activity) {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(MyPlugin.mainActivity.getString(R.string.default_web_client_id))
.requestEmail()
.build();
return GoogleSignIn.getClient(activity, gso);
}
protected GoogleSignInClient InitGoogle() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
return GoogleSignIn.getClient(this, gso);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
try {
Intent signInIntent = InitGoogle().getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
MyFinish("");
}catch (Exception e){
e.printStackTrace();
Log.i(LOGTAG,"Error: " + e.getLocalizedMessage());
MyFinish("");
}
}
GoogleSignInAccount mGoogleSignInAccount;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode,data);
String result = "";
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
mGoogleSignInAccount = task.getResult(ApiException.class);
result = mGoogleSignInAccount.getIdToken();
} catch (ApiException e) {
Log.w(LOGTAG, "Google sign in failed", e);
Log.i(LOGTAG, e.getMessage());
Log.i(LOGTAG, CommonStatusCodes.getStatusCodeString(e.getStatusCode()));
}
MyFinish(result);
}
}
public static void SignOut(){
Log.i(MyPlugin.LOGTAG,"signOut");
InitGoogle(MyPlugin.mainActivity).signOut();
}
Кто-то знает, почему это происходит, или что я делаю не так? Большое спасибо.