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 есть две вещи, которые нужно изменить.

  1. Путь к классу, используемый в разрешениях.
  2. Пакет интент-фильтра.

И то, и другое должно быть пакетом приложения, а не пакетом 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. Этот класс и переопределенные методы, которые он содержит, затем вызываются при успешной регистрации и при получении сообщения. Я написал очень простой пример этого, который может быть полезным для вас, чтобы ссылаться здесь

Другие вопросы по тегам