web-dev-qa-db-ja.com

Googleクラウドメッセージング-GCM-SERVICE_NOT_AVAILABLE

新しい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

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 Manifest:

<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>

Googleの指示に従っていますが、このSERVICE_NOT_AVAILABLEエラーで立ち往生していますが、

何が悪いのですか?

23

問題はコードに関連するものではなく、テスト用電話にリンクされていました。 テスト電話にはSIMがなく、時計が設定されていません。したがって、グーグルは間違った時間でそれを再登録することはできません。

Android仮想デバイス、google api、およびテスト電話の時計の設定を使用して登録IDを管理しています。

39
Android:enabled="true"  

これを削除します^

これをマニフェストにまだ追加していない場合

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

GCMIntentServiceの2番目のコンストラクタは必要ありません。これだけ

public GCMIntentService() {         
 super(SENDER_ID);  }

SENDER_IDが、GoogleコードのWebサイトを閲覧し、GCMサービスを閲覧しているときに、ブラウザーからURLからコピーされた番号であることを確認してください。

7
Ryan Gray

企業ファイアウォールの背後にいる場合、GCMが使用する一部のポートは、ローカルワイヤレスでの通信が許可されない場合があることに注意してください。エミュレーターを最初に機能させようとしたときに、この問題が発生しました。下記のポートを通過させる特別なIPを取得する必要がありました。


注:組織にファイアウォールがあり、インターネットへのトラフィックまたはインターネットからのトラフィックを制限している場合、Androidデバイスがメッセージを受信できるようにするために、GCMとの接続を許可するようにファイアウォールを構成する必要があります。ポートはopenは、5228、5229、5230です。GCMは通常5228のみを使用しますが、5229と5230を使用することもあります。GCMは特定のIPを提供しないため、ファイアウォールにIPに含まれるすべてのIPアドレスへの送信接続を許可する必要がありますGoogleのASN 15169に記載されているブロック。

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

3
Daniel

私はこの問題を抱えていましたが、それはWIFI接続が原因でした。私はWIFIをオフにして、テストを再度(3gで)実行しました。次に、WIFIをオンに戻し、再びエラーが発生しました。 3gに戻って、確認すると、再び機能しました。

したがって、結論として、問題は接続によって引き起こされました。

2

私はこの問題を抱えていました...私の解決策はインターネット接続を無効にし、電話サービスを使用することでした。

2
jpCoder411

Genymotionでアプリケーションを実行するときにこの問題が発生しました。 here のようにgoogle playサービスをインストールすると、すべてが正常に機能しました。

1
kelvincer