【问题标题】:Android - GCM error 'SERVICE_NOT_AVAILABLE' on Android 6.0.1Android - Android 6.0.1 上的 GCM 错误“SERVICE_NOT_AVAILABLE”
【发布时间】:2016-04-02 12:13:23
【问题描述】:

我正在为 Android 开发一个聊天应用程序。但是在尝试注册 GCM 时,我收到以下错误:

04-02 16:59:29.793 29773-30031/purepush.group101.talktoday W/InstanceID/Rpc: Found 10010
04-02 16:59:29.920 29773-30031/purepush.group101.talktoday W/System.err: java.io.IOException: SERVICE_NOT_AVAILABLE
04-02 16:59:29.922 29773-30031/purepush.group101.talktoday W/System.err:     at com.google.android.gms.iid.zzc.zzb(Unknown Source)
04-02 16:59:29.922 29773-30031/purepush.group101.talktoday W/System.err:     at com.google.android.gms.iid.zzc.zza(Unknown Source)
04-02 16:59:29.922 29773-30031/purepush.group101.talktoday W/System.err:     at com.google.android.gms.iid.InstanceID.zzc(Unknown Source)
04-02 16:59:29.922 29773-30031/purepush.group101.talktoday W/System.err:     at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
04-02 16:59:29.922 29773-30031/purepush.group101.talktoday W/System.err:     at purepush.group101.talktoday.LoginActivity$GetGCMTokenTask.doInBackground(LoginActivity.java:240)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at purepush.group101.talktoday.LoginActivity$GetGCMTokenTask.doInBackground(LoginActivity.java:211)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
04-02 16:59:29.923 29773-30031/purepush.group101.talktoday W/System.err:     at java.lang.Thread.run(Thread.java:818)
04-02 16:59:29.958 29773-29773/purepush.group101.talktoday E/GcmReceiver: Failed to resolve target intent service, skipping classname enforcement
04-02 16:59:29.958 29773-29773/purepush.group101.talktoday E/GcmReceiver: Error while delivering the message: ServiceIntent not found.

我正在使用以下代码获取 GCM 令牌:

InstanceID instanceID = InstanceID.getInstance(context);`
regToken = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="purepush.group101.talktoday">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <permission
        android:name="purepush.group101.talktoday.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="purepush.group101.talktoday.permission.C2D_MESSAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity" />
        <activity android:name=".ChatActivity" />

        <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="purepush.group101.talktoday" />
            </intent-filter>
        </receiver>

        <service
            android:name=".utils.GCMMessageListener"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
    </application>

</manifest>

Build.Gradle(应用模块)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "21.1.2"
    useLibrary 'org.apache.http.legacy'
    defaultConfig {
        applicationId 'purepush.group101.talktoday'
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile 'org.apache.httpcomponents:httpmime:4.5.2'
    compile 'org.apache.httpcomponents:httpclient:4.5.2'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.google.android.gms:play-services:8.4.0'
}

现在有趣的是,这个错误只发生在我运行 6.0.1(构建:MMB29Q)的 Nexus 5 上。我在我同事的运行 5.1.1 的三星 Note 4 上测试了这个应用程序,我能够成功地将他的设备注册到 GCM。我的多个应用程序仅在我的 Nexus 5 上使用 GCM 时遇到此错误。

对此的任何帮助将不胜感激

谢谢!

【问题讨论】:

  • 您是否在您的nexus 6 中登录了Gmail 帐户?因为GCM需要邮箱认证才能注册GCM服务器
  • 这是 Nexus 5,是的,我已登录到我的 Gmail 帐户。
  • 有人可以指导我怎么做吗?
  • 请给你看App gradle文件
  • 添加了 build.gradle 文件,@MounirElfassi

标签: android google-cloud-messaging


【解决方案1】:

请检查您的“Nexus 5”时钟,它应该是准确的,并尝试更改

buildToolsVersion "21.1.2"

类似于:buildToolsVersion "23.0.2" => 我正在使用这个版本,GCM 与 Android 6 配合良好

更新:

我正在使用此方法注册我的 GCM

 public void getRegId() {

    new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {

            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
                }
                regid = gcm.register(R.string.gcm_defaultSenderId);
                msg = "Device registered, registration ID=" + regid;

            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
                System.out.println("Error---" + ex.getMessage());
            }
            return msg;
        }

        @Override
        protected void onPostExecute(String msg) {
            System.out.println("Registerid---" + regid);
        }
    }.execute(null, null, null);
}

请尝试并告诉我。

【讨论】:

  • 时钟完美。如果更改 buildToolsVersion 有效,我会回复您
  • 我已经用我现在在 Marshmallow 设备上使用的方法更新了我的答案,请尝试并告诉我。
【解决方案2】:

好吧,事实证明我的 Google Play 商店运行不正常。我可以查看应用程序并安装新应用程序,但是当我输入“我的应用程序和游戏”时,它给了我Check your connection and try again 错误。因此,我为可能遇到类似问题的任何人发布此解决方案,因为我花了 4-5 天时间寻找错误并尝试不同的修复方法。

注意:这仅适用于 root 用户。

步骤:

  1. 打开文件管理器。我使用了 ES 文件资源管理器。
  2. 转到“/”或手机的根目录
  3. 会有一个文件夹叫etc
  4. etc 中,您会看到一个文件名hosts
  5. hosts 文件中,您会看到2 个IP 地址。第二个会因您所在的位置而异
  6. 在第二个 IP 地址的开头添加 ## 会将该行更改为评论

我建议在编辑之前备份 hosts 文件。

归功于“Ronny927”:http://forum.xda-developers.com/showthread.php?t=2273994

【讨论】:

    【解决方案3】:

    几天前我也遇到过同样的情况,不是 GCM 的问题,而是我们的互联网连接的问题。请参阅以下几点以了解更多信息

    1. 您的手机已连接到 wifi,但 wifi 没有互联网,请尝试在浏览器中使用 google,如果它工作正常,那么您应该尝试更多的东西,例如检查设备中的播放服务等等。

    2. 您的手机数据包可能已经结束,这意味着您已连接到互联网,但您不会从中获取任何类型的数据。如果不检查与您的服务器的连接,则无法识别此错误。

    您可以从此链接获取更多详细信息

    How to fix Google Cloud Messaging Registration error: SERVICE_NOT_AVAILABLE?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多