13

Я хочу попробовать службу Google Cloud Messaging (GCM), и я столкнулся с проблемой в начале.Регистр облачных сообщений Google AUTHENTICATION_FAILED

У меня есть ошибка AUTHENTICATION_FAILED при попытке зарегистрировать устройство в GCM. Я искал и все, что я нашел, это варианты неправильного пароля. Мой пароль правильный, и я использую только одну учетную запись.

Есть два способа реализации клиента GCM на Android: библиотека

  1. GCM с дополнительной баночкой, в настоящее время устарело.
  2. Google Play Services API

Я начал со второго курса и получил этот вопрос.

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

В попытке понять причины ошибки я декомпилировал баннер Google Play Services и сравнил его с библиотекой GCM.

Оказывается, они оба имеют подобный метод, что-то вроде:

void register(Context context, String senderIds) { 
    Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
    intent.setPackage("com.google.android.gms"); // this one row are different 
    setPackageNameExtra(context, intent); 
    intent.putExtra("sender", senderIds); 
    context.startService(intent); 
} 

Разница в одном ряду:

В библиотеке GCM оно com.google.android.gsf, где gsf является Google Services Framework (я думаю), и это работает!

В банке API сервисов Google Play это com.google.android.gms, и он не работает (ошибка AUTHENTICATION_FAILED).

Затем в библиотеке GCM я заменил «gsf» на «gms» и запустил. И у меня такая же ошибка AUTHENTICATION_FAILED! Если я вхожу в другой пакет, то он не работает.

Что мне нужно сделать, чтобы оно работало? Должен ли я настроить что-то в телефоне? Или это ошибка в сервисах Google Play? Кто-нибудь столкнулся с такой проблемой?

Заранее благодарен!

ответ

1

Это похоже на ошибку. Вот что такое Android разработчик говорит об этом в android-gcm Google Group:

Некоторые фона: Froyo и Gingerbread регистрация осуществляется в GoogleServicesFramework, используя учетную запись Google для регистрации. Это привело к большому количеству ошибок, связанных с auth для людей, в которых счет не был в отличном состоянии.

Начиная с ICS, GCM не зависит или использует учетную запись Google - вы можете использовать ее до того, как вы добавите учетную запись или без каких-либо учетных записей.

«Play Services» обновление реализует новую схему всех устройств - но это, кажется, небольшое количество устройств, имеющих проблемы с этого, мы расследуем, - но эти цифры намного ниже, чем с старой схемы.

Если вы хотите использовать код в GSF, для Froyo и Gingerbread - вам нужна , чтобы использовать предыдущую библиотеку, которая явно задает имя пакета. Новая библиотека в GCM использует новый регистрационный код.

Фактическое подключение к Google осуществляется по тому же пути - мы постепенно (и медленно) перемещаем устройства на новый код в игре услуг.

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

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

По-видимому, сброс на завод может решить проблему, но они все еще следят.

+0

Спасибо, я не хочу делать сброс настроек. Я проверю его на другом устройстве. И пока ситуация не будет устранена, я буду использовать старую библиотеку или и то, и другое. – user2862139

1

Таким образом, решение этой проблемы заключается в том, чтобы вернуться к старой устаревшей клиентской библиотеке GCM в случае ошибки AUTHENTICATION_FAILED на FROYO и GINGERBREAD.

Вот простой фрагмент кода, как я модернизировал новый клиент GCM для резервными использовать старый клиент:

@Override 
protected void onPostExecute(Integer resultCode) { 

    if(resultCode == EXCEPTION_THROWED) { 

     //Android 2.2 gmc bug http://stackoverflow.com/questions/19269607/google-cloud-messaging-register-authentication-failed 

     //fall back to old deprecated GCM client library 

     GCMRegistrar.checkDevice(StartActivity.this); 
     GCMRegistrar.checkManifest(StartActivity.this); 
     final String registrationId = GCMRegistrar.getRegistrationId(StartActivity.this); 
     if (registrationId.equals("")) { 
      GCMRegistrar.register(StartActivity.this, SENDER_ID); 
     } 

     //Toast.makeText(context, "Orders and menus won't be sync with other devices since GoogleCloudMessaging is not working correctly on this device. Please notify the developer.", Toast.LENGTH_LONG).show(); 

    } 

}

Вы можете найти старый устаревший GCM Client helpher здесь: http://developer.android.com/google/gcm/helper.html

You может найти код клиента GCM на вашем компьютере по следующему пути: ANDROID_SDK_ROOT/extras/google/gcm-client (если вы скачали эту дополнительную информацию с помощью Android SDK Manager).

Я положил старого клиента gcm в новый пакет с именем com.google.android.gcm.deprecated, чтобы попытаться вспомнить, что я не использую это для других вещей.

2

Я столкнулся с той же проблемой, и, похоже, Google не спешит ее исправлять.

Я не хочу, чтобы добавить устаревший клиент помощник gcm.jar моего приложению, так что я закодировал минимальное решение, которое работает на моем Android 2.3.6 Nexus One телефона, который не в регистрации, как и в вопросе выше

  try { 
       gcm = GoogleCloudMessaging.getInstance(context); 
       regID = gcm.register(SENDER_ID); 
       storeRegistrationId(regID); 
       msg = "Device registered, registration ID=" + regID; 

       sendRegistrationIdToBackend(); 
      } catch (IOException ex) { 
       msg = "Exception registering for GCM :" + ex.getMessage(); 
       // If there is an error, don't just keep trying to register. 
       oldSchoolRegister(); 
      } 

AUTHENTICATION_FAILED запускает IOException в коде выше

private void oldSchoolRegister() { 
    Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
    intent.setPackage("com.google.android.gsf"); 
    setRegCallbackIntent(context, intent); 
    intent.putExtra("sender", SENDER_ID); 
    context.startService(intent); 
} 

private static synchronized void setRegCallbackIntent(Context context, Intent intent) { 
    regCallback = PendingIntent.getBroadcast(context, 0, new Intent(), 0); 
    intent.putExtra("app", regCallback); 
} 

public static synchronized void cancelRegCallbackIntent() { 
    if (regCallback != null) { 
     regCallback.cancel(); 
     regCallback = null; 
    } 
} 

Я добавил выше код в моем приложении. Это упрощенные методы из Client Helper gcm.баночка (так что вам не нужно, чтобы добавить баночку приложения)

protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 

    if (extras != null && !extras.isEmpty()) { // has effect of unparcelling Bundle 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
     String messageType = gcm.getMessageType(intent); 

     if (messageType != null) { 
      if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
       showMessage(extras.getString("message")); // call your code 
       Logger.d(TAG, "Received message: " + message.alert + ": " + message.url); 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
       Logger.e(TAG, "Send error: " + extras.toString()); 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
       Logger.e(TAG, "Deleted messages on server: " + extras.toString()); 
      } 
     } else { 
      String regID = extras.getString("registration_id"); 
      if (regID != null && !regID.isEmpty()) { 
       doRegistration(regID); // send to your server etc. 
       GCMSetup.storeRegistrationId(regID); 
       GCMSetup.cancelRegCallbackIntent(); 
      } 
     } 
    } 
    // Release the wake lock provided by the WakefulBroadcastReceiver. 
    GCMBroadcastReceiver.completeWakefulIntent(intent); 
} 

Этот код находится в намерениях обслуживания, и имеет несколько строк, чтобы хранить идентификатор, полученный от ГОГО. Поскольку вы видите только около 20 дополнительных строк кода по сравнению с базовой реализацией и никаких дополнительных зависимостей! Вам нужно только обновить свой AndroidManifest.xml, чтобы убедиться, что вы можете получить намерение РЕГИСТРАЦИЯ.

<receiver android:name="com.camiolog.android.GCMBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> 
      <category android:name="com.camiolog.android"/> 
     </intent-filter> 
    </receiver> 

Я надеюсь, что это поможет, пока Google не начнет действовать вместе!

+0

Не уверен, что я понимаю необходимость очистить regcallback Pendingintent, поскольку это намерение, похоже, ничего не делает, и я не видел, как вы могли бы назвать эту процедуру из широковещательного приемника, получающего намерение РЕГИСТРАЦИИ? Является ли regCallback статической переменной класса? Подумайте, можете ли вы просто создать его, передать его, а затем отменить его сразу или просто не включить в намерение с самого начала. Вы знаете, требует ли пакет com.google.android.gsf дополнительного приложения? – guyland123

Смежные вопросы