Android C2DM и проект lib - PullRequest
       15

Android C2DM и проект lib

1 голос
/ 21 февраля 2012

В настоящее время я работаю над libproject (Android), который должен быть включен в несколько других приложений.

Теперь все работает нормально, когда я немного боролся с действиями и манифестами, за исключением бита C2DM.

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

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

Вот копия получающей части моего манифеста (из приложений, а не из библиотеки, но на самом деле это просто копия), но это довольно просто.Я просто хочу знать, как мне следует адаптировать его для вызова нужного класса в lib ...

        <!--
             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, а также с приложением иLib.Та же проблема

Ответы [ 3 ]

2 голосов
/ 19 апреля 2012

Существует лучший способ использования 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>
1 голос
/ 22 февраля 2012

Ответ, кто-нибудь сталкивается с той же проблемой ...

В пакете google.android.c2dm класс C2DMBaseReceiver, метод runIntentInService, изменение

String receiver = context.getPackageName() + ".C2DMReceiver"

с полностью определенным именем .. и вот, пожалуйста:)

0 голосов
/ 22 февраля 2012

Манифест выглядит нормально.В вашем пакете должен быть класс C2DMReceiver, и он должен расширять C2DMBaseReceiver.Этот класс и переопределенные методы, которые он содержит, затем вызываются при успешной регистрации и при получении сообщения.Я написал очень простой пример этого, который может быть полезным для вас, чтобы сослаться на здесь

...