2012-12-19 62 views
12

http://developer.android.com/google/gcm/gs.htmlでデモを行い、試用版GCMTrialが正しく動作するようになりました。Android GCMエラーです。クライアントが登録されている場合、サーバは登録されていません

しかし、私は既存のアプリケーションで同じ手順を実行しようとしましたが、機能しませんでした。だから私はまったく新しいプロジェクトを作った。しかし、同じ正確な手順を実行しても、GCMにメッセージを正常に送信することができませんでした。そこで、GCMTrialの名前を必要な名前に変更しようとしましたが、それも機能しません。

私が主な活動を通じてGCMに登録すると、次のログを取得:

12-19 21:30:13.102: V/GCMRegistrar(15889): Registering receiver 
12-19 21:30:13.112: D/GCMBaseIntentService(15889): handleRegistration: registrationId =   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, error = null, unregistered = null 
12-19 21:30:13.112: D/GCMRegistrar(15889): resetting backoff for com.XXX.XXX 
12-19 21:30:13.117: V/GCMRegistrar(15889): Saving regId on app version 1 

をしかし、私はGCMメッセージを送信しようとすると、それは次のようなエラーに

[ errorCode=NotRegistered ] 

クライアントコードを返します。

public class MainActivity extends Activity { 
TextView tve; 
String TAG = "GCMTrial"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    GCMRegistrar.checkDevice(this); 
    GCMRegistrar.checkManifest(this); 
    final String regId = GCMRegistrar.getRegistrationId(this); 
    if (regId.equals("")) { 
     GCMRegistrar.register(this, "XXXXXX"); 
     Log.v(TAG, "Reg"); 
    } else { 
     Log.v(TAG, "Already registered"); 
    } 
} 

GCMIntentService : 
public class GCMIntentService extends GCMBaseIntentService { 
@Override 
protected void onError(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 
} 
@Override 
protected void onMessage(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 
    Log.d("GCM", "RECIEVED A MESSAGE"); 
    // Get the data from intent and send to notificaion bar 
} 
@Override 
protected void onRegistered(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 
} 
@Override 
protected void onUnregistered(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 
} 

}

マニフェスト:

サーバコード:それは私が狂いそうさ

System.out.println("Sending GCM"); 
    String key = "XXX"; //Server API key taken from the site 
    clientID = "XXXXXXXXX"; // copied from the logs 
    Sender sender = new Sender(key); 
    Message message = new Message.Builder().build(); 
    Result result = sender.send(message, clientID, 1); 
    System.out.println(result.toString()); 

...それはAndroid携帯電話に登録されたとしても、GCMIntentServiceクラスのonRegisteredメソッドを呼び出して、示して..しかし、私がメッセージを送信しようとすると、それをフラグ「NotRegisteredエラー」... 私はイムが間違っているのか知ってはいけない...私を助けてください、みんな....

+0

私は何が起こっているのか分かりません。 しかし、アンドロイドのGCMエキストラを再インストールして、まったく新しいアプリケーションを作成しましたが、今度はこれが動作します! :) 私は使用しました MulticastResult result = sender.send(message、devices、5);結果result = sender.send(message、clientID、1)の代わりに ; これは問題だったのですが、今は正常です...! – user1657709

+0

私はあなたが既に新しい登録IDを要求しているため、あなたがインストールした後にあなたがそれを得ている理由を考える。 – neferpitou

答えて

0

あなたに以下を追加するには、GCMIntentService

にコンストラクタを追加するのを忘れGCMIntentService

public GCMIntentService(){ 
     super(SENDER_ID); 
    } 

SENDER_IDは、アプリの登録に使用されたXXXXXXXです。

+0

私はそれを試しました..サーバは "NotRegistered"エラーを返信し続けます.....その他の提案? – user1657709

+0

私の場合、私はサーバーから送信されたリクエストにGoogleから提供されたsender_IDを追加しました。しかし、ASP.Netを使ってリクエストを送信しました。 –

+0

SENDER_IDではなく、THREADの名前であり、SEND_IDである必要があります。これは任意の文字列です。 – neferpitou

11

まあ、adbでインストールすると、それは現在のバグです。

GCMRegistrarは、デバイスがGCMサーバー上で登録解除され、登録されていないことを認識しません。あなたは何ができるか

はとにかく登録することです:

if (regId.equals("")) { 
     GCMRegistrar.register(this, "XXXXXX"); 
     Log.v(TAG, "Reg"); 
    } else { 
     //I SAY BULLSHIT ! 
     GCMRegistrar.register(this, "XXXXXX"); 
     Log.v(TAG, "Reg"); 
    } 

またはクライアント上のアプリUNINSTALその後、ADBから新しいインストールを実行します。

生産上の機会​​はほとんどありません。

0

コンテキスト "this"を "getApplicationContext()"に置き換えて、アプリケーションコンテキストを使用できます。ここに私のサンプルコードがあります:

private void registerGCM() { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { 
     //prevent crash caused by no google account or not support for gcm 
     try { 
      GCMRegistrar.checkDevice(this); 
     } catch (Exception e) { 
      Log.i("test", "!!!cgm " + e.toString()); 
      return; 
     } 
    } 

    final String regId = GCMRegistrar.getRegistrationId(this); 
    if (TextUtils.isEmpty(regId)) { 
     String gcmSenderId = PreferencesUtil.getStringPreference(PreferencesUtil.SETTING_GCM_SENDER_ID, 
       "", getApplicationContext()); 
     GCMRegistrar.register(getApplicationContext(), gcmSenderId); 
    } 
    mGCMRegisted = true; 
} 
関連する問題