36

アプリケーションにC2DMを実装しようとしていますが、マニフェストの記述方法に関してドキュメントが少しわかりにくいと感じています。

マニフェストコードの例には、次のものが含まれています。

<!-- Only this application can receive the messages and registration result --> 
<permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" />

これは次のように説明されます。

applicationPackage + ".permission.C2D_MESSAGEは、他のアプリケーションがアプリケーションのメッセージを登録および受信するのを防ぎます。

しかし、これはどのように正確に機能しますか?私が理解しているように、これは許可を宣言してから、私のアプリに対してその許可を取得します。しかし、その許可は正確にどこで実施されますか?

登録用に指定されたコードは次のとおりです。

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender", emailOfSender);
startService(registrationIntent);

RegistrationIntentを受け取ったサービスは、どのような許可を確認するかをどのように知ることができますか?私が理解しているように(そしてここで間違っている場合は訂正してください)、パーミッションを宣言するときに、名前空間内の任意のパーミッション名(com.example.myapp.permission.WHATEVERなど)を選択できます。

または、C2D_MESSAGEは、使用する必要のある魔法の定数ですか?


また、ドキュメントには、インテントのレシーバーを実装する必要があると記載されていcom.google.android.c2dm.intent.C2D_MESSAGEますcom.google.android.c2dm.intent.REGISTRATION。ただし、コード例では、レシーバーのフィルターには.intent.RECEIVEとイン.intent.REGISTRATIONテントのみが含まれています。どこC2D_MESSAGEに行きましたか、そしてそれは上記の私の質問と何か関係がありますか?

これが明白なことではないことを願っていますが、私はそれを理解していません...助けてください。

4

1 に答える 1

24

マニフェストの例と一致しないため、概要の上部にある必要があると彼らが主張する受信者は、ドキュメントの間違いのようです。

「com.google.android.c2dm.intent.C2D_MESSAGE および com.google.android.c2dm.intent.REGISTRATION のレシーバー」)

特定のアプリケーションのパッケージ名に一致するように微調整されたマニフェスト エントリの例を使用して、彼らが提供する例を取得しました。

Android の C2DM コードがブロードキャストを送信するとき (または、ブロードキャストを送信する潜在的な受信者を探すとき)、以下を探します。

インテントのブロードキャスト レシーバーを検索: com.google.android.c2dm.intent.REGISTRATION パーミッション: .permission.C2D_MESSAGE

Android C2DM コードによってアプリケーションに送信されるすべての C2DM メッセージは、その特定のパーミッションを探します。アプリケーションに固有のものであり、その構造 (アプリケーションのパッケージ + ".permission.C2D_MESSAGE") 内にある必要があります。

登録リクエストがアクセス許可に使用するパッケージ名を取得する方法については、ドキュメントから「アプリ」エクストラに最初に登録するときに処理されます。

「app はアプリケーションの ID であり、PendingIntent で設定され、登録サービスがアプリケーション情報を抽出できるようにします。」

問題の行:

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
于 2011-02-25T18:49:16.690 に答える