谷歌云消息 - GCM - SERVICE_NOT_AVAILABLE(Google Clou

2019-07-30 08:03发布

我想,以实施新的GCM,我下面谷歌获得指出 : http://developer.android.com/guide/google/gcm/gs.html

我陷在得到我的设备注册ID!

我的应用程序不断地尝试与谷歌的服务器,在这里我的错误日志连接:

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

这是我的活动代码,要求一个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 regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
            // SENDER_ID is my project id into google account url
            GCMRegistrar.register(this, SENDER_ID);
            Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this));
        } else {
            Log.i(TAG, "[checkNotifRegistration] already registered as : " + regId);
        }
    } catch(Exception e){
        Log.e(TAG, "[checkNotifRegistration] Exception : "+e.getMessage());
        e.printStackTrace();
    }

我在这里的服务代码

public class GCMIntentService extends GCMBaseIntentService {

private static final String TAG = "GCMIntentService";

public GCMIntentService() {
    super(SENDER_ID);
           // SENDER_ID is my project id into google account url
    // TODO Auto-generated constructor stub
    Log.d(TAG, "[GCMIntentService] start");
}


public GCMIntentService(String senderId) {
    super(senderId);
    // TODO Auto-generated constructor stub
    Log.d(TAG, "[GCMIntentService] start - sender Id : "+senderId);
}
}

这里是我的Android清单:

<permission android:name="com.dombox.app.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.dombox.app.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >

    <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        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="com.myapp.app" />
        </intent-filter>
    </receiver>

<service android:name=".GCMIntentService" android:enabled="true"/>

    <activity
        android:name=".activity.Myapp"
        android:label="@string/app_name" >

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>

我下面谷歌的指示,但我还是坚持了这个错误SERVICE_NOT_AVAILABLE,

我究竟做错了什么 ?

Answer 1:

问题是不相关的代码,但链接到测试手机。 测试手机没有SIM卡,并且时钟没有设置 。 因此谷歌无法与错误的时间resgistred它。

我管理有使用Android虚拟设备注册ID,与谷歌的API,并通过设置测试手机时钟



Answer 2:

android:enabled="true"  

删除此^

如果你还没有添加到您的清单

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8"

你不需要在GCMIntentService第二构造函数。 仅此一台

public GCMIntentService() {         
 super(SENDER_ID);  }

确保您的SENDER_ID是当你在浏览谷歌代码网站和浏览GCM服务从浏览器中复制出来的URL的数量。



Answer 3:

请记住,如果你是一个企业防火墙后面,那GCM使用某些端口可能不会被允许通过本地无线通信。 试图让我的模拟器开始工作时,我有这个问题。 我得的是允许通过下面列出的端口的特定IP。


注意:如果您的组织有限制流量或从Internet防火墙,你需要将其配置为允许以与GCM连接你的Android设备来接收消息。 打开这些端口:5228,5229,5230和GCM通常只使用5228,但有时使用5229和5230 GCM并没有提供具体的IP地址,所以你应该让你的防火墙,以接受包含的所有IP地址传出连接在15169的谷歌的ASN列出的IP模块。

http://developer.android.com/google/gcm/gcm.html



Answer 4:

我有这个问题......我的解决办法是禁用Internet连接,并使用电话服务。



Answer 5:

我有这个问题,这是通过WIFI连接造成的。 我打开WIFI关闭并重新作出的测试(在3G)和它的工作。 然后我打开WIFI重新开启,再有错误。 回3G,以确保,并再次合作。

所以,结论,这个问题是由连接引起的。



Answer 6:

我有我的运行对genymotion应用这个问题。 安装谷歌播放服务,如它说, 在这里 ,一切工作正常。



文章来源: Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE