Android C2DM和lib项目

时间:2012-02-21 10:16:19

标签: android filter push-notification manifest

我目前正在开发一个应该包含在其他一些应用程序中的libproject(Android)。

现在一切正常,因为我已经在使用活动和清单进行了一些努力,并且对C2DM位有所了解。

我可以很好地调用我的不同类,但我似乎无法捕获注册ID(当然还有实际的消息,但这必须是同样的问题......)

我认为问题来自我的清单中的过滤,所以如果有人对我有任何建议,那将非常有帮助。

这是我的清单的接收器部分的副本(来自应用程序,而不是库,但它实际上只是一个副本),但它非常简单。我只是想知道如何调整它以便在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项目中)。

提前感谢您的帮助,并且不要犹豫,要求进一步了解详情:)

编辑: 我尝试只使用在谷歌C2DM上注册的lib,以及app和lib。同样的问题

3 个答案:

答案 0 :(得分:2)

使用intent-filter有一种更好的方法可以从库项目中使用C2DM。

清单文件是应用程序中的文件。 lib的包是com.mylib,应用程序的包是com.myapp。

从lib清单中可以改变两件事。

  1. 权限中使用的类路径。
  2. intent-filter包。
  3. 两者都应该是app app而不是你的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 :(得分:1)

答案,是否有人偶然发现同样的问题...

在google.android.c2dm包中,类C2DMBaseReceiver,方法runIntentInService,更改

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

使用完全限定的名称..然后你去:)

答案 2 :(得分:0)

清单看起来很好。在你的包中你应该有一个名为C2DMReceiver的类,它应该扩展C2DMBaseReceiver。然后在成功注册和收到消息时调用此类及其包含的重写方法。我写了一个非常基本的例子,可能有助于您参考here