12

http://developer.android.com/google/gcm/gs.htmlで提供されているデモに従い、試用版アプリケーション GCMTrial が正しく動作するようになりました。

しかし、既存のアプリケーションで同じ手順を実行しようとしましたが、うまくいきませんでした。そこで、まったく新しいプロジェクトを作成しました。しかし、それでも、まったく同じ手順に従っても、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エラー」のフラグが立てられます...何がわからない私は間違っている..私を助けてください....

4

3 に答える 3

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");
    }

または、クライアントでアプリをアンインストールしてから、Adb から新しいインストールを実行します。

本番環境で発生する可能性はほとんどないことに注意してください。

于 2013-03-14T12:15:37.187 に答える
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;
}
于 2013-07-23T17:36:00.293 に答える
0

コンストラクターを追加するのを忘れましたGCMIntentService

以下をあなたに追加してくださいGCMIntentService

public GCMIntentService(){
        super(SENDER_ID);
    }

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

于 2012-12-19T17:19:40.050 に答える