Android GoogleAuthUtil.getTokenWithNotification Интерактивный вызов не запускается

У меня есть фоновый сервис, который вызывает GoogleAuthUtl.getTokenWithNotification и он работает правильно, но я пытаюсь реализовать часть обратного вызова этой функции и не работает должным образом.

Я внедрил широковещательный приемник и добавил его в манифест, у меня также есть активность в моем приложении. Ниже приведены соответствующие фрагменты кода.

GoogleAuthUtil.getTokenWithNotification

 GoogleAuthUtil.getTokenWithNotification(this.getContext(), account, "oauth2:" + GmailScopes.GMAIL_SEND, null, new Intent(AuthReceiver.AUTH_INTENT)); 

AuthReceiver

 public class AuthReceiver extends BroadcastReceiver { public final static String AUTH_INTENT = "com.testoauth.AUTH_INTENT"; public AuthReceiver() { } @Override public void onReceive(Context context, Intent intent) { Log.d("RECEIVER", "Received Auth broadcast."); NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancelAll(); } } 

AndroidManifest

 <receiver android:name=".AuthReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.testoauth.AUTH_INTENT" /> </intent-filter> </receiver> 

Я не знаю, почему он не получает трансляцию. Я не вижу никаких исключений в журналах и никаких указаний на то, что получатель вообще вызван, он даже не будет разбивать точку прерывания при отладке. Я что-то неправильно делаю?

РЕДАКТИРОВАТЬ

Я использую min sdk 16 и target sdk 25

Из документации GoogleAuthUtil.getTokenWithNotification API:

Этот метод специально предназначен для фоновых задач. В случае ошибки, требующей вмешательства пользователя, этот метод заботится о том, чтобы подталкивать соответствующее уведомление. После того, как пользователь обращается к уведомлению, обратный вызов передается. Если пользователь отменяет, то обратный вызов не запускается.

Обратный вызов не запускается независимо от отмены пользователя или нет. Помимо ActivityManager указывающего, что уведомление было отображено ( Displayed com.google.android.gms/.auth.uiflows.gettoken.GetTokenActivity ), нет никаких указаний на то, что указанное намерение трансляции (в данном случае com.testoauth.AUTH_INTENT ) Был отправлен в журналы. «Полученная передача». Сообщение также отсутствует в журналах.

Включенный пример SDK этой функции ( <android-sdk>/extras/google/google_play_services/samples/auth/gau ) даже не работает.

Solutions Collecting From Web of "Android GoogleAuthUtil.getTokenWithNotification Интерактивный вызов не запускается"

Миграция с GoogleAuthUtil и Plus.API

Если вы интегрировали с Google Sign In In в прошлом с помощью GoogleAuthUtil.getToken или Plus.API, вы должны перенестись на новейший API входа в систему для большей безопасности и лучшего пользовательского опыта.
Ссылка: https://developers.google.com/identity/sign-in/android/migration-guide

Также проверьте это, помогает ли это

http://www.programcreek.com/java-api-examples/index.php?source_dir=AndroidAppDeployer-master/AndroidAppDeployer/src/com/appjma/appdeployer/service/DownloadService.java

http://www.programcreek.com/java-api-examples/index.php?source_dir=AndroidAppDeployer-master/AndroidAppDeployer/src/com/appjma/appdeployer/receiver/AuthReceiver.java

Я пробовал следующие ошибки в Android API 25, но функция обратного вызова никогда не вызывалась:

  • Без интернета
  • Пользователь еще не вошёл в систему
  • Пользователь не дал разрешение на отправку писем от своего имени
  • Службы Google Play отключены
  • Службы Google Play устарели

Если вызов метода обратного вызова не имеет решающего значения для вашего варианта использования, вы можете следить за Android Quickstart для API Gmail для отправки электронной почты от имени пользователя в Android. Проверьте отправку электронной почты, чтобы создать сообщение. Вы также можете проверить MyGoogleAuthUtilApplication, созданную с помощью приведенных выше руководств.

Надеюсь это поможет.

Я реализовал демо, я использовал последнюю версию auth gradle и ее работу. Похоже, что может возникнуть проблема с версией auth

 public class AuthActivity extends Activity { private static final int AUTHORIZATION_CODE = 1993; private static final int ACCOUNT_CODE = 1601; private AuthPreferences authPreferences; private AccountManager accountManager; /** * change this depending on the scope needed for the things you do in * doCoolAuthenticatedStuff() */ private final String SCOPE = "https://www.googleapis.com/auth/googletalk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); accountManager = AccountManager.get(this); authPreferences = new AuthPreferences(this); if (authPreferences.getUser() != null && authPreferences.getToken() != null) { doCoolAuthenticatedStuff(); } else { chooseAccount(); } } private void doCoolAuthenticatedStuff() { // TODO: insert cool stuff with authPreferences.getToken() Log.e("AuthApp", authPreferences.getToken()); clickSendEmail(); } private void chooseAccount() { // use https://github.com/frakbot/Android-AccountChooser for // compatibility with older devices Intent intent = AccountManager.newChooseAccountIntent(null, null, new String[] { "com.google" }, false, null, null, null, null); startActivityForResult(intent, ACCOUNT_CODE); } private void requestToken() { Account userAccount = null; String user = authPreferences.getUser(); for (Account account : accountManager.getAccountsByType("com.google")) { if (account.name.equals(user)) { userAccount = account; Preferences.setAccount(AuthActivity.this,account.name, account.type); break; } } accountManager.getAuthToken(userAccount, "oauth2:" + SCOPE, null, this, new OnTokenAcquired(), null); } /** * call this method if your token expired, or you want to request a new * token for whatever reason. call requestToken() again afterwards in order * to get a new token. */ private void invalidateToken() { AccountManager accountManager = AccountManager.get(this); accountManager.invalidateAuthToken("com.google", authPreferences.getToken()); authPreferences.setToken(null); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == AUTHORIZATION_CODE) { requestToken(); } else if (requestCode == ACCOUNT_CODE) { String accountName = data .getStringExtra(AccountManager.KEY_ACCOUNT_NAME); authPreferences.setUser(accountName); // invalidate old tokens which might be cached. we want a fresh // one, which is guaranteed to work invalidateToken(); requestToken(); } } } private class OnTokenAcquired implements AccountManagerCallback<Bundle> { @Override public void run(AccountManagerFuture<Bundle> result) { try { Bundle bundle = result.getResult(); Intent launch = (Intent) bundle.get(AccountManager.KEY_INTENT); if (launch != null) { startActivityForResult(launch, AUTHORIZATION_CODE); } else { String token = bundle .getString(AccountManager.KEY_AUTHTOKEN); authPreferences.setToken(token); doCoolAuthenticatedStuff(); } } catch (Exception e) { throw new RuntimeException(e); } } } private void clickSendEmail() { final Account account = Preferences.getAccount(this); final String token = Preferences.getToken(this); new Thread(new Runnable() { @Override public void run() { try { Session session = Session.getDefaultInstance(new Properties(), null); MimeMessage email = new MimeMessage(session); email.setFrom(new InternetAddress(account.name)); //TODO: change email address to your email address for testing email.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress("nasitraj2@gmail.com")); email.setSubject("TEST OAUTH EMAIL"); email.setText("This is a test"); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); email.writeTo(bytes); String encodedEmail = Base64.encodeBase64URLSafeString(bytes.toByteArray()); Message message = new Message(); message.setRaw(encodedEmail); Intent intent = new Intent(AUTH_INTENT); PendingIntent pendingIntent = PendingIntent.getBroadcast(AuthActivity.this, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() , pendingIntent); String test = GoogleAuthUtil.getTokenWithNotification(AuthActivity.this, account, "oauth2:" + GmailScopes.GMAIL_SEND, null, intent); GoogleCredential credential = new GoogleCredential(); credential.setAccessToken(test); boolean changed = false; if (!test.equals(token)) { changed = true; // Snackbar.make(AuthActivity.this.getView(), "TOKEN CHANGED", Snackbar.LENGTH_LONG).show(); Preferences.setToken(AuthActivity.this, test); } Gmail service = new Gmail.Builder(AndroidHttp.newCompatibleTransport(), AndroidJsonFactory.getDefaultInstance(), credential) .setApplicationName("Test OAuth").build(); service.users().messages().send("me", message).execute(); String msg = "Email sent"; if (changed) msg = "TOKEN CHANGED: " + msg; } catch (MessagingException e) { Log.d( "ERROR", e.getMessage()); } catch (GoogleJsonResponseException e) { if (e.getDetails().getCode() == 401) { try { Intent intent = new Intent(AUTH_INTENT); GoogleAuthUtil.clearToken(AuthActivity.this, Preferences.getToken(AuthActivity.this)); GoogleAuthUtil.getTokenWithNotification(AuthActivity.this, account, "oauth2:" + GmailScopes.GMAIL_SEND, null, intent); } catch (Exception e1) { //ignore } } } catch (IOException e) { // Snackbar.make(AuthActivity.this.getView(), "ERROR", Snackbar.LENGTH_LONG).show(); Log.d( "ERROR", e.getMessage()); } catch (Exception e) { //Snackbar.make(AuthActivity.this.getView(), "ERROR", Snackbar.LENGTH_LONG).show(); Log.d( "ERROR", e.getMessage()); } } }).start(); } } 

Кажется, что никто не может дать правильный ответ на этот вопрос; Много совершенно отличных предложений о том, как обойти проблему, но ничего не отвечают на реальный вопрос. Я пришел к выводу, что это должно быть ошибкой в ​​Android или Google Play Services. К сожалению, я сообщил об этой проблеме как для отслеживания проблем Android, так и для форума поддержки сервисов Google Play … Оба они указывают друг на друга и отказываются даже смотреть на проблему.