Подтвердить что ты не робот

C2DM: Как использовать разрешение C2D_MESSAGE?

Я собираюсь реализовать 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);

Как служба, которая получает регистрационную информацию, знает, какое разрешение для проверки? Поскольку я понимаю (и исправляю, если я ошибаюсь здесь), когда я объявляю о разрешении, я мог бы выбрать любое имя разрешения в моем пространстве имен, например. com.example.myapp.permission.WHATEVER.

Или есть C2D_MESSAGE некоторая магическая константа, которую я должен использовать?


Кроме того, в документации говорится, что мне нужно реализовать приемники для com.google.android.c2dm.intent.C2D_MESSAGE и com.google.android.c2dm.intent.REGISTRATION Intents. Но в примере кода фильтры-приемники содержат только .intent.RECEIVE и .intent.REGISTRATION Intents. Куда пошел C2D_MESSAGE, и есть ли у него что-то с моим вопросом выше?

Надеюсь, это не что-то очевидное, но я просто не понимаю... пожалуйста, помогите.

4b9b3361

Ответ 1

Приемники, которые, по их утверждению, вам нужны наверху в сводке, являются ошибкой в ​​документации, так как она не соответствует примеру манифеста.

"Приемники для com.google.android.c2dm.intent.C2D_MESSAGE и com.google.android.c2dm.intent.REGISTRATION." )

Я получил примеры, которые они дают для работы, используя только пример манифеста, измененный в соответствии с моим конкретным именем пакета приложений.

Когда код C2DM в Android отправляет широковещательную рассылку (или, скорее, когда он ищет потенциальных приемников для отправки широковещания), он ищет:

Найти широковещательные приемники для намерения: com.google.android.c2dm.intent.REGISTRATIONУ этого есть разрешение: .permission.C2D_MESSAGE

Все сообщения C2DM, отправленные в ваше приложение кодом Android C2DM, будут искать это конкретное разрешение. Это специфично для вашего приложения и просто должно быть в этой структуре (ваш пакет приложений + ".permission.C2D_MESSAGE" ).

Относительно того, как запрос на регистрацию получает имя пакета для использования для разрешений, которое обрабатывается, когда вы впервые регистрируетесь с добавлением "приложение" - из документации:

"- это идентификатор приложения, заданный с помощью PendingIntent, чтобы служба регистрации могла извлекать информацию о приложении."

рассматриваемая строка:

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate