23

我正在尝试实施新的 GCM,我正在关注谷歌: 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

这是我的活动代码,要求提供 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 错误,

我究竟做错了什么 ?

4

6 回答 6

39

问题与代码无关,而是指向测试电话的链接。 测试手机没有 SIM 卡,也没有设置时钟。所以谷歌不能在错误的时间重新注册它。

我设法使用Android虚拟设备,使用google api并通过设置测试电话时钟来获得注册ID 。

于 2012-07-11T08:43:00.943 回答
7
android:enabled="true"  

删除这个 ^

如果您尚未将此添加到清单中

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

您不需要 GCMIntentService 中的第二个构造函数。只有这个

public GCMIntentService() {         
 super(SENDER_ID);  }

确保您的 SENDER_ID 是您在浏览 google 代码网站和浏览 GCM 服务时从浏览器的 URL 中复制的号码。

于 2012-07-09T16:33:32.073 回答
3

请记住,如果您位于公司防火墙后面,则可能不允许 GCM 使用的某些端口通过本地无线进行通信。我在尝试让我的模拟器最初工作时遇到了这个问题。我必须获得一个允许下面列出的端口通过的特殊 IP。


注意:如果您的组织有防火墙限制进出 Internet 的流量,您需要将其配置为允许与 GCM 连接,以便您的 Android 设备接收消息。要打开的端口是:5228、5229 和 5230。GCM 通常只使用 5228,但有时会使用 5229 和 5230。GCM 不提供特定 IP,因此您应该允许防火墙接受到包含的所有 IP 地址的传出连接在 Google 的 ASN 15169 中列出的 IP 块中。

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

于 2013-05-30T14:03:38.953 回答
2

我遇到了这个问题...我的解决方案是禁用互联网连接并使用电话服务。

于 2013-04-05T03:53:15.423 回答
2

我遇到了这个问题,它是由WIFI连接引起的。我关闭了 WIFI 并再次进行了测试(在 3g 上)并且它成功了。然后我重新打开WIFI并再次出现错误。回到 3g,以确保,它再次工作。

因此,总而言之,问题是由连接引起的。

于 2014-08-14T20:53:59.537 回答
1

我在 genymotion 上运行我的应用程序时遇到了这个问题。像这里所说的那样安装谷歌播放服务,一切正常。

于 2014-11-11T20:59:35.107 回答