2015-06-26 6 views
5

Я реализую push-уведомления, но при вызове getToken я получаю исключение TIMEOUT.GCM getToken() отправляет java.io.IOException: TIMEOUT

Я установил приложение для GCM here, а SENDER_ID - именно тот, который был предоставлен. Кроме того, ключ сервера API был сохранен на внутренней стороне.

Есть ли ограниченное количество запросов getToken? Сначала у меня не было никаких проблем при тестировании push-уведомлений.

new AsyncTask<Void, Void, Void>(){ 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 

       InstanceID instance = InstanceID.getInstance(mContext); 

       String registrationId = instance.getToken(Constants.GCM_SENDER_ID, 
         GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

       SharedPreferences sp = mContext.getSharedPreferences(Constants.TOKEN_DATA, Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = sp.edit(); 
       editor.putString(Constants.REGISTRATION_ID, registrationId); 
       editor.commit(); 

       NotificationsRegister.getInstance(mContext).register(registrationId); 
      } catch(IOException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    }.execute(); 

Android Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.myexample" > 

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<permission android:name="com.myexample.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.myexample.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <receiver 
     android:name="com.google.android.gms.gcm.GcmReceiver" 
     android:exported="true" 
     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.myexample" /> 
     </intent-filter> 
    </receiver> 
    <service 
     android:name=".helper.TutoriaGcmListenerService" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 
    <service 
     android:name=".helper.TutoriaInstanceIDListenerService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.gms.iid.InstanceID"/> 
     </intent-filter> 
     </service> 
... 

Зависимости добавлен в build.gradle Модуля:

  • применять плагин: 'com.google.gms.google-услуги'
  • компиляции ' com.google.android.gms: play-services-gcm: 7.5. + '

Зависимости добавлен в build.gradle проекта:

  • 'com.google.gms путь к классам: Google-услуги: 1.3.0-beta1'
+0

делать вам не нужно разрешение INTERNET в манифесте? – muratgu

+0

У меня было это с самого начала, но я забыл добавить его, когда редактировал манифест. Я обновил манифест – blavi

+0

Может быть проблема с вашей сетью (брандмауэр, может быть?), Но это поможет увидеть всю трассировку стека. – Koh

ответ

3

Я столкнулся с этой проблемой сегодня и вот что я для устранения неполадок.

Во-первых, я также использовал свой собственный идентификатор отправителя при попытке получить токен. Поэтому вместо того, я попытался с помощью идентификатора отправителя из примеров Google предоставляет getString(R.id.gcm_defaultSenderId)

После того, как я сделал это, я начал получать другое сообщение об ошибке SERVICE_NOT_AVAILABLE

Есть несколько С.О. вопросов, которые касаются этого, но тот, который мне помогли this one.

Я отключил WiFi и использовал 4G-соединение на своем телефоне, и он работал как с gcm_defaultSenderId, так и с моим собственным идентификатором отправителя.

0

У меня была эта проблема и исправлена ​​после повторной попытки.

2

Перед регистрацией вы должны проверить, если Google API доступен с этим фрагментом кода или аналогичный:

GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(a); 
    if (resultCode == ConnectionResult.SUCCESS) { //Do the getTokencall } else { //check the code } 

Вероятно, вы не получаете УСПЕХА ResultCode. Например, если есть ожидающее обновления google api.

0

Возможно, что Play Services не доступны до регистрации, этот класс может помочь вам:

public class PlayServicesValidator { 


private static final String TAG = PlayServicesValidator.class.getSimpleName(); 
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 


/** 
* Check the device to make sure it has the Google Play Services APK. If 
* it doesn't, display a dialog that allows users to download the APK from 
* the Google Play Store or enable it in the device's system settings. 
*/ 
public static boolean areAvailable(Context context) { 
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(context); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     return false; 
    } 
    return true; 
} 


/** 
* Only call if areAvailable was previously called and returned false 
* @param activity 
* @return 
*/ 
public static boolean areRecoverable(Activity activity) { 
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     if (apiAvailability.isUserResolvableError(resultCode)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return true; 
} 


/** 
* Shows to the user a dialog to update play services 
* @param activity 
*/ 
public static void recover(Activity activity) { 
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     if (apiAvailability.isUserResolvableError(resultCode)) { 
      apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
     } 
    } 
} 
} 
Смежные вопросы