所以,还有一件事要注意,这让我绊倒了。我让它在模拟器+测试应用程序中运行良好,但后来我在实际设备上部署它时遇到了问题。
一直收到 SERVICE_NOT_AVAILABLE 错误,并采用类似于上述答案的方法:
IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION");
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Got into onReceive for manual GCM retrieval. "
+ intent.getExtras());
String regId = intent.getStringExtra("registration_id");
if (regId != null && !regId.isEmpty()) {
theResult.add(regId);
} else {
theResult.add("");
}
lastDitchEffortComplete = true;
}
};
cont.registerReceiver(receiver, filter);
这种工作。但是接收这些信息需要花费很长的时间,而且在我有一个等待循环中,它只会在我放弃并让事情继续进行之后才能检索到它。
这让我想到 SERVICE_NOT_AVAILABLE 消息可能还有另一个原因。
这是我必须使用 GCM 进行获取/注册的代码:
new AsyncTask<Void, Void, Void>() {
final long timeSleep = 1000;
@Override
protected Void doInBackground(Void... params) {
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont);
String registrationId = "";
int count = 0;
while (count < 1) {
try {
count++;
Log.i(TAG, "Starting GCM Registration Attempt #" + count);
registrationId = gcm.register(CLOUDAPPID);
rph.storeRegistrationId(registrationId);
return null;
} catch (IOException e) {
e.printStackTrace();
}
Log.w(TAG, "Registration failed. Retrying in " + timeSleep + " ms.");
try {
Thread.sleep(timeSleep);
} catch (InterruptedException e) {
}
}
return null;
}
}.execute().get();
这里要寻找的主要内容是最后一行。
.execute.get();
一种“聪明/作弊”的方式来阻止异步离线结果。
事实证明,这就是导致问题的原因。只要我有:
.execute();
让它通过,并让算法/代码与报告一起工作,并且不需要立即注册 id,那就没问题了。我什至不需要手动广播接收器,它就像它应该的那样工作。