GCM getToken()发送java.io.IOException:TIMEOUT

bla*_*avi 6 android google-cloud-messaging

我正在实现推送通知,但是在调用getToken时我收到了TIMEOUT异常.

我在这里为GCM设置了应用程序,而SENDER_ID正是提供的那个.此外,Server API密钥保存在后端部分.

是否有有限数量的getToken请求?在测试推送通知时,我最初几次尝试都没有问题.

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();
Run Code Online (Sandbox Code Playgroud)

Android清单:

<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> 
...
Run Code Online (Sandbox Code Playgroud)

依赖关系添加到Module的build.gradle:

  • 申请插件:'com.google.gms.google-services'
  • 编译'com.google.android.gms:play-services-gcm:7.5.+'

依赖项添加到项目的build.gradle:

  • classpath'com.google.gms:google-services:1.3.0-beta1'

ako*_*ata 3

我今天遇到了这个问题,这就是我解决问题的方法。

首先,我在尝试获取令牌时也使用了自己的发件人 ID。因此,我尝试使用 Google 提供的示例中的发件人 IDgetString(R.id.gcm_defaultSenderId)

一旦我这样做了,我开始收到不同的错误消息SERVICE_NOT_AVAILABLE

有几个问题可以解决这个问题,但帮助我解决的是这个问题

我关闭了 WiFi 并在手机上使用了 4G 连接,它与gcm_defaultSenderId我自己的发件人 ID 一起使用。