Android GCM InstanceId.getToken() -> java.io.IOException: TIMEOUT 安卓GCM InstanceId.getToken() -> java.io.IOException: 超时

9
我正在尝试在我的Android应用程序中实现推送通知,但我目前卡在接收令牌的点上。
我使用最新的“InstanceID”方法并按照一些示例进行操作。我已经向我的清单文件添加了权限和服务(以及它们的代码),但无论我尝试什么,我总是得到“java.io.IOException:TIMEOUT”错误。我尝试过不同的手机、WiFi、Lte和3G,但似乎没有任何变化。
我从来没有遇到过“SERVICE_NOT_AVAILABLE”的错误,只卡在这个错误上。
清单文件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<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" />
        <category android:name="de.company.appname" />
  </intent-filter>
</receiver>
<service
  android:name="de.company.gcm.ModuleGCMListenerService"
  android:exported="false" >
  <intent-filter>
     <action android:name="com.google.android.c2dm.intent.RECEIVE" />
  </intent-filter>
</service>
<service
  android:name="de.company.gcm.ModuleInstanceIDListenerService"
  android:exported="false">
  <intent-filter>
    <action android:name="com.google.android.gms.iid.InstanceID"/>
  </intent-filter>
</service>

实例ID调用:

try 
{
  token = instanceID.getToken(
            senderId,
            GoogleCloudMessaging.INSTANCE_ID_SCOPE, 
            null);
} 
catch (IOException e) 
{
  e.printStackTrace();
}

instanceID.getId()正在运行。

W/InstanceID/Rpc: No response android.os.ConditionVariable@129d5713
W/System.err: java.io.IOException: TIMEOUT
W/System.err:   at com.google.android.gms.iid.zzc.zzb(Unknown Source)
W/System.err:   at com.google.android.gms.iid.zzc.zza(Unknown Source)
W/System.err:   at com.google.android.gms.iid.InstanceID.zzc(Unknown Source)
W/System.err:   at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)

2
请查看此存储库此处,与InstanceID.getToken()相关的源代码在此处 - bjiang
谢谢,虽然我已经看过所有的谷歌示例和其他几个页面。但是它们都没有给我任何线索,让我知道我可能做错了什么。 - stewie
1
如果您正在使用WIFI,请尝试关闭它并使用您的移动网络,这对我有用。 - Paul Okeke
我注意到您的清单中没有注册服务,您能展示一下用于注册的代码吗? - Arthur Thompson
@DhavalkumarSolanki 没有,这有点像模块编程,所以我将所需的senderId传递给了这个方法。 - stewie
显示剩余6条评论
1个回答

15

当我在搜索代码中相同位置的类似错误时,我终于找出了自己的问题。

新的GCM API注册未知来源错误

在这种情况下,"MAIN_THREAD"错误确实更加明显。

因此,问题是由于InstanceId.getToken()不能在主线程中调用。

虽然如谷歌Github示例所建议,使用new AsyncTask<Void, Void, Void>()方法并没有起作用。

我不得不使用

new Thread(new Runnable() {
    public void run() {
        //code
    }
}).start();

操作需要在主线程之外进行,可以是异步或新线程。 - Stoycho Andreev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接