У меня есть приложение Android, для которого я пытаюсь (ре) реализовать доступ к Google Диску. Метод, которым я следую, - это руководство по миграции Google для обновления REST API здесь . Моя страница согласия настроена правильно, и все работает на стороне iOS, поэтому я предполагаю, что, по крайней мере, учетные данные настроены правильно.
Я начинаю с:
GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(DriveScopes.DRIVE))
.requestEmail()
.build();
mSignInClient = GoogleSignIn.getClient(activity, signInOptions);
Task<GoogleSignInAccount> task = mSignInClient.silentSignIn();
if (task.isSuccessful()) {
// There's an immediate result available
GoogleSignInAccount account = task.getResult();
if (account != null) {
setupClientFromAccount(activity, account);
}
}
Если не войти в систему, я вызываю это, что (успешно) запускает поток аутентификации:
@Override
public void login(final Activity activity) {
if (isLoggedIn()) {
return;
}
Task<GoogleSignInAccount> task = mSignInClient.silentSignIn();
if (task.isSuccessful()) {
// There's an immediate result available
GoogleSignInAccount account = task.getResult();
if (account != null) {
setupClientFromAccount(activity, account);
}
}
else {
// The result of the sign-in Intent is handled in onActivityResult
activity.startActivityForResult(mSignInClient.getSignInIntent(), REQUEST_GOOGLE_SIGN_IN);
}
}
В моей деятельности я обрабатываю результат, используя:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == REQUEST_GOOGLE_SIGN_IN) {
if (resultCode == Activity.RESULT_OK && resultData != null) {
handleSignInResult(this, resultData);
} else {
Log.e(TAG, String.format("Unable to complete Google sign-in (resultCode: %d)", resultCode));
}
}
...
}
, который вызывает :
void handleSignInResult(Context context, Intent result) {
GoogleSignIn.getSignedInAccountFromIntent(result)
.addOnSuccessListener(account -> {
Log.d(TAG, "handleSignInResult(): " + account.getEmail());
setupClientFromAccount(context, account);
})
...
}
Наконец, все сводится к следующему:
private void setupClientFromAccount(Context context, GoogleSignInAccount account) {
// Use the authenticated account to sign in to the Drive service
GoogleAccountCredential credential =
GoogleAccountCredential.usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE));
credential.setSelectedAccount(account.getAccount());
mDrive = new Drive.Builder(
AndroidHttp.newCompatibleTransport(),
new GsonFactory(),
credential)
.setApplicationName("App Name")
.build();
}
Проблема в том, что на моем устройстве это работает очень хорошо, когда я отлаживаю. Однако после развертывания в Google Play происходит сбой. Он проходит процесс авторизации, и регистрация показывает, что он достигает setupClientFromAccount()
в handleSignInResult()
. Но любая операция с диском не удалась.
Теперь мне кажется, что это может быть проблема (повторного) подписания, поскольку это единственное реальное различие между версией разработки / отладки и версией / версией Google Play. Но учетные данные в консоли разработчика Google Play фактически генерируются для ключа релиза SHA-1.
Я что-то упускаю из виду?