私は自分のアプリケーションにC2DMを実装しようとしていますが、マニフェストの記述方法に関して documentation が少しわかりにくいと感じています。
マニフェストコード例にはこれが含まれています。
<!-- 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
はどこに行きましたか。また、上記の質問と関係がありますか?
私はこれが明白なものではないことを願っていますが、私はそれを手に入れません...助けてください。
マニフェストの例と一致しないため、概要の一番上にある必要があると主張する受信者は、ドキュメントの間違いのようです。
「com.google.Android.c2dm.intent.C2D_MESSAGEおよびcom.google.Android.c2dm.intent.REGISTRATIONの受信者。」)
特定のアプリケーションのパッケージ名と一致するように微調整されたサンプルマニフェストエントリを使用して、動作するサンプルを入手しました。
AndroidのC2DMコードがブロードキャストを送信するとき(または、ブロードキャストを送信する潜在的な受信者を探すとき)、次を探します:
Intentのブロードキャストレシーバーを見つける:com.google.Android.c2dm.intent.REGISTRATION権限がある:。permission.C2D_MESSAGE
Android C2DMコードによってアプリケーションに送信されるすべてのC2DMメッセージは、その特定の許可を探します。それはアプリケーションに固有であり、その構造(アプリケーションのパッケージ+ " permission.C2D_MESSAGE ")。
登録要求がアクセス許可に使用するパッケージ名を取得する方法については、「app」エクストラで最初に登録するときに処理されます-ドキュメントから:
「appは、登録サービスがアプリケーション情報を抽出できるようにPendingIntentで設定されたアプリケーションのIDです。」
問題の行:
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate