我正在尝试,为了实施新的GCM,我正在关注Google的说法:http: //developer.android.com/guide/google/gcm/gs.html
我在获取设备注册ID时遇到困难!
我的应用不断尝试与Google服务器连接,这里我的错误日志:
onReceive: com.google.android.gcm.intent.RETRY
GCM IntentService class: com.dombox.app.GCMIntentService
Acquiring wakelock
[GCMIntentService] start
Registering app com.dombox.app of senders _my_sender_id_
Releasing wakelock
onReceive: com.google.android.c2dm.intent.REGISTRATION
GCM IntentService class: com.dombox.app.GCMIntentService
Acquiring wakelock
[GCMIntentService] start
handleRegistration: registrationId = null, error = SERVICE_NOT_AVAILABLE, unregistered = null
Registration error: SERVICE_NOT_AVAILABLE
Scheduling registration retry, backoff = 912617 (768000)
Releasing wakelock
Run Code Online (Sandbox Code Playgroud)
这是我的活动代码,要求提供ID:
try{
Log.i(TAG, "[checkNotifRegistration] checkDevice");
GCMRegistrar.checkDevice(this);
Log.i(TAG, "[checkNotifRegistration] checkManifest");
GCMRegistrar.checkManifest(this);
if (GCMRegistrar.isRegistered(this)) {
Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this));
}
final String …Run Code Online (Sandbox Code Playgroud) 我在Android 2.2设备上的GoogleCloudMessaging.register()调用上收到错误"SERVICE_NOT_AVAILABLE".
我正在编写一个使用新版Google Play服务使用GoogleCloudMessaging的应用.我使用Android网站上提供的指南实现了它,我的源代码包含大量错误检查和处理代码,例如确保安装或更新Google Play服务.GCM注册码还实现了谷歌的指数退避,建议用来处理SERVICE_NOT_AVAILABLE错误.
我已经在各种设备上测试了我的应用程序,包括ICS,JB,Honey Comb甚至2.3.x设备.GCM注册工作,我可以通过GCM向它发送消息.但是在2.2设备上,我在GoogleCloudMessaging.register()调用中不断收到SERVICE_NOT_AVAILABLE错误,即使有指数退避也是如此.
GCM失败的设备确实是三星SGH-I896,手机上有2个谷歌帐户.我已经读过这个错误可能是由错误配置的时间引起的,但是时间设置为自动的.这款手机没有上线,正在运行三星股票ROM.
我也试过重新启动设备以及重新安装Google Play服务而没有运气.任何有关此问题的帮助将不胜感激.
编辑:我尝试使用旧的gcm.jar和GCMRegistrar实现GCM,它最终在设备上工作.但是我几乎不认为这是一个很好的解决方案,因为谷歌已经停止支持这种方法了.
编辑2:看到接受的答案.
android android-2.2-froyo google-cloud-messaging google-play-services service-not-available
我想将gcm客户端实现到现有的Android应用程序中.因此,按照本教程,我编写了以下代码:
public class RegisterForGCMAsyncTask extends AbstractSecureOperationTask {
...
@Override
protected Boolean doInBackground(String... params) {
String token = authenticate();
getRegId();
if (TextUtils.isEmpty(registrationId)) {
return false;
}
//
try {
URL url = convertToURLEscapingIllegalCharacters(String.format(Constants.REGISTER_URL,
registrationId, userId, token));
URLConnection connection = url.openConnection();
InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
JSONParser parser = new JSONParser();
JSONObject rootObj = (JSONObject) parser.parse(streamReader);
String status = rootObj.get("status").toString();
if (status.equals("OK")) {
return true;
}
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return …Run Code Online (Sandbox Code Playgroud) android ioexception google-cloud-messaging service-not-available
我试图设置此示例:https: //code.google.com/p/gcm/source/browse/#git%2Fgcm-client 启动并运行.
根据指南,已成功创建GoogleAPI项目:http://developer.android.com/google/gcm/gs.html
但是,我有以下问题:在某些设备上,无论如何我都会获得SERVICE_NOT_AVAILABLE.
W/System.err:java.io.IOException:SERVICE_NOT_AVAILABLE W/System.err:at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
一些统计:
它是相同的代码,相同的apk文件,各种谷歌帐户.我试图切换回GCMRegistrar方法,他们实际上工作.所以问题是:是否有新的GCM方法?如何让它们在其他设备上运行,而不仅仅是"纯粹的"谷歌Android设备?
更新:事实上,我在这里找到了解决方案
android exception google-cloud-messaging service-not-available
有时我会Service Not Available在我的申请中遇到例外情况.大多数时候,没有问题.但有时它会发生.(该应用程序仍在开发中)
解决问题的唯一方法是重启手机.关于支持论坛的相关问题38009.但我从评论中理解的是,重启设备可以永远解决问题.
它是否正确?
因为在我的情况下,错误可以返回(频率:我认为每月一次或两次,我在这个应用程序上是全职).
有没有办法从应用程序内部重新启动地理编码器?
我唯一的解决方案是提供一个替代解决方案,以防万一"手动"获取地址,如下所示.你有更好的吗?
Dbg.d(TAG, "=== address_info FetchLocationTask - doInBackground");
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
mHandler = new Handler();
Looper.loop();
}
}).start();
/**
* Implementation of a second method in case of failure:
*
*/
double lat = Double.parseDouble(args[0]);
double lng = Double.parseDouble(args[1]);
String address = String.format(Locale.ENGLISH,
"http://maps.googleapis.com/maps/api/geocode/json?latlng="+Double.toString(lat)+","+Double.toString(lng)+"&sensor=true&language="+Locale.getDefault().getCountry(), lat, lng);
Dbg.d(TAG, "fetching path : "+ address);
HttpGet httpGet = new HttpGet(address); …Run Code Online (Sandbox Code Playgroud) android reverse-geocoding google-geocoder service-not-available