デバイスを C2DM に登録しようとしていますが、重大な問題が発生しています。私はいくつかのチュートリアルに従いましたが、それらはすべて非常に似ています。この問題は、C2DM サーバーに送信される登録インテントに関係していると思います。誰にも提案はありますか。関連するコードは次のとおりです。
マニフェスト:アクセス許可(アプリケーション タグの外側):
<!-- Used for C2DM -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.companyname.parade.permission.C2D_MESSAGE" />
これはインテント登録です(私のアプリケーションタグ内):
<receiver
android:name=".C2DMReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<!-- Receive the actual message -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.companyname.parade" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.companyname.parade" />
</intent-filter>
</receiver>
以下は、自分のデバイスを C2DM サーバーに登録するために呼び出すものです (C2DM サーバーに接続するサービスを開始します。このサービスは、私の登録 ID を含む登録インテントを送り返すことになっています)。C2DMessagingというファイルにあります。
public static void register(Context context) {
Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT);
registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT,
PendingIntent.getBroadcast(context, 0, new Intent(), 0));
registrationIntent.putExtra(EXTRA_SENDER, SENDER_ID);
ComponentName name = context.startService(registrationIntent);
if(name == null){
// FAIL!
Log.d(TAG, "FAIL");
}else{
// SUCCESS
Log.d(TAG, "Success");
}
}
ComponentName 情報は次のとおりです。
com.google.android.gsf/com.google.android.gsf.gtalkservice.PushMessagingRegistrar
logcat の出力はありません。私のレシーバー(C2DMReceiverという名前)は次のとおりです。
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (C2DMessaging.INTENT_REGISTRATION_CALLBACK.equals(action)) {
// Registration Intent
Log.w(TAG, "Registration Receiver called");
handleRegistration(context, intent);
} else if (action.equals(C2DMessaging.INTENT_RECEIVED_MESSAGE_CALLBACK)) {
Log.w(TAG, "Message Receiver called");
handleMessage(context, intent);
} else if (action.equals(C2DMessaging.INTENT_C2DM_RETRY)) {
C2DMessaging.register(context);
}
}
これはまったく呼び出されません。
編集:これはすべて私の愚かな間違いでした。読んだチュートリアルで、どういうわけかステップを忘れてしまいました。これを権限に追加する必要があります。
<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" />
応答してくれた MisterSquonk に感謝します。