java.io.IOException:GCM客户端中的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 false; } private void getRegId() { try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } registrationId = gcm.register(PROJECT_ID); } catch (IOException e) { Log.e(LOG_TAG, e.getMessage(), e); } } } 

AndroidMainfest:

                                   

昨天一切正常,我可以检索注册ID。 但现在,总有一个IOExceptionSERVICE_NOT_AVAILABLE

我在三星Galaxy S5和Genymotion仿真器(Android 4.1.2)上测试过它,但我得到的结果总是一样。 有谁知道如何解决这个问题?

编辑

这是完整的堆栈跟踪:

 java.io.IOException: SERVICE_NOT_AVAILABLE at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source) at de.retterapps.Handyalarm.helper.tasks.RegisterForGCMAsyncTask.getRegId(RegisterForGCMAsyncTask.java:72) at de.retterapps.Handyalarm.helper.tasks.RegisterForGCMAsyncTask.doInBackground(RegisterForGCMAsyncTask.java:43) at de.retterapps.Handyalarm.helper.tasks.RegisterForGCMAsyncTask.doInBackground(RegisterForGCMAsyncTask.java:24) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) 

  • 将应用程序带回到最前面
  • 如何获取或计算膨胀视图的宽度/高度
  • SupportMapFragment - 无法从Fragment转换为MapFragment
  • 将图片发送到Web服务器
  • 带下划线的variables
  • 无法在Android中解析ContextCompat
  • 由于证书不同,无法将更新的APK上传到Google Play
  • 在Android Studio 1.4.1中设置Android工具栏背景和文本颜色
  • 检查设备的时间。 Google无法在错误的时间注册您的设备

    当我遇到这个问题时,对我有用的是打开Goog​​le Play应用程序。

    在任何GCM注册尝试之前,设备重新启动后,它似乎必须至少启动一次。

    这很奇怪。 我通过将GCM代码移动到onCreate()方法的末尾来解决它。

    我的猜测是当我尝试注册CGM时,应用程序Context并未完全创建。 它需要一个有效的Context。

    昨天我自己解决了这个问题。 我按照演示应用程序将registerInBackground()中的AsyncTask更改为普通的java线程。 这是代码:

     private void registerInBackground() { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: Toast.makeText(context, getString(R.string.txt_gcm_registered), Toast.LENGTH_LONG).show(); break; case 1: Toast.makeText(context, getString(R.string.error_register_gcm), Toast.LENGTH_LONG).show(); break; } super.handleMessage(msg); } }; Runnable runnable = new Runnable() { @Override public void run() { try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regId = gcm.register(Constants.SENDER_ID); if (sendRegistrationIdToBackend(regId)) { handler.sendEmptyMessage(0); } else { handler.sendEmptyMessage(1); } storeRegistrationId(context, regId); } catch (IOException ex) { handler.sendEmptyMessage(1); Log.e(LOG_TAG, ex.getMessage(), ex); } } }; new Thread(runnable).start(); } 

    现在,它正在运作,但我不知道为什么。 任何人都能解释一下原因吗? 谢谢你的帮助!

    如果您在模拟器中运行应用,则必须安装Google Play服务。

    我最近从Google本机模拟器切换到GenyMotion模拟器并遇到此错误。 后来我发现GenyMotion图像没有附带Google Play服务。 安装完毕后,问题解决了。