Android C2DM и проект lib
В настоящее время я работаю над libproject (Android), который должен быть включен в несколько других приложений.
Теперь все работает нормально, я немного боролся с деятельностью и манифестами, за исключением бита C2DM.
Я могу нормально вызывать свои разные классы, но не могу поймать регистрационный идентификатор (или, конечно, фактические сообщения, но это должно быть той же проблемой...)
Я думаю, что проблема связана с фильтрацией в моих манифестах, поэтому, если у кого-то есть какие-либо советы для меня, это было бы очень полезно.
Вот копия получающей части моего манифеста (из приложений, а не из библиотеки, но на самом деле это просто копия), но это довольно просто. Я просто хочу знать, как я должен адаптировать его, чтобы вызвать правильный класс в библиотеке...
<!--
Only C2DM servers can send messages for the app. If permission is
not set - any other app can generate it
-->
<receiver
android:name="com.google.android.c2dm.C2DMBroadcastReceiver"
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.myapp.lib" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp.lib" />
</intent-filter>
</receiver>
Где com.myapp.lib - это имя моего пакета lib, а получатель находится в пакете с таким же именем (конечно, в проекте lib).
Заранее благодарим за помощь, и не стесняйтесь спрашивать подробности:)
Изменить: я пытался только с библиотекой, зарегистрированной в Google C2DM, а также с приложением и библиотекой. Та же проблема
3 ответа
Существует лучший способ использования вашего C2DM из библиотечного проекта с помощью фильтра намерений.
Файл манифеста - тот из приложения. Пакет для библиотеки - это com.mylib, а для приложения - com.myapp.
В манифесте lib есть две вещи, которые нужно изменить.
- Путь к классу, используемый в разрешениях.
- Пакет интент-фильтра.
И то, и другое должно быть пакетом приложения, а не пакетом lib.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp"
android:versionCode="1"
android:versionName="1.0" >
<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<uses-library android:name="com.google.android.maps" android:required="true"/>
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.mylib.C2DMRegistrationReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" >
</action>
<category android:name="com.myapp" />
</intent-filter>
</receiver>
<receiver
android:name="com.mylib.C2DMMessageReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" >
</action>
<category android:name="com.myapp" />
</intent-filter>
</receiver>
</application>
</manifest>
Ответ, кто-нибудь сталкивается с той же проблемой...
В пакете google.android.c2dm, класс C2DMBaseReceiver, метод runIntentInService, измените
String receiver = context.getPackageName() + ".C2DMReceiver"
с полностью определенным именем.. и там вы идете:)
Манифест выглядит нормально. В вашем пакете должен быть класс C2DMReceiver, и он должен расширять C2DMBaseReceiver. Этот класс и переопределенные методы, которые он содержит, затем вызываются при успешной регистрации и при получении сообщения. Я написал очень простой пример этого, который может быть полезным для вас, чтобы ссылаться здесь