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
, и есть ли у него что-то с моим вопросом выше?
Надеюсь, это не что-то очевидное, но я просто не понимаю... пожалуйста, помогите.
Ответы
Ответ 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