2

我正在使用 Adob​​e AIR 编写一个应用程序,并尝试使用本机扩展将其部署到 Android。该应用程序需要能够使用 Google 的 C2DM 服务(相当于 Apple 的推送通知服务)。这需要设置一个 BroadcastReceiver 以便从 Google 接收设备注册。我能够在独立的本机 Android 应用程序(无 AIR)中正常工作,但似乎无法在 AIR 应用程序中正常工作。我想我一定是错误地设置了清单 XML,但我看不出怎么做。

以下是 AIR 应用程序清单文件中 XML 的相关部分:

<android>
    <manifestAdditions><![CDATA[
        <manifest android:installLocation="auto">
            <permission android:protectionLevel="signature" android:name="com.example.znotification.permission.C2D_MESSAGE" />

            <uses-permission android:name="com.example.znotification.permission.C2D_MESSAGE" />
            <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
            <uses-permission android:name="android.permission.INTERNET" />

            <application android:enabled="true">
                <receiver android:name="com.example.znotification.C2DMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">

                    <intent-filter>
                        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                    </intent-filter>

                    <intent-filter>
                        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                    </intent-filter>

                </receiver>
            </application>

        </manifest>

    ]]></manifestAdditions>
</android>

在标签中引用的本机 Java 类 C2DMBroadcastReceiver 中,它所做的只是注销一条消息,说明它已收到广播。我已经验证我正在正确设置 Intent(请参阅下面的 Java 代码),但 BroadcastReceiver 永远不会被击中。

Context appContext = context.getActivity().getApplicationContext();
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app",PendingIntent.getBroadcast(appContext, 0, new Intent(), 0));
registrationIntent.putExtra("sender", args[0].getAsString());
appContext.startService(registrationIntent);

通常,应如何在 AIR 应用程序的清单 XML 中设置 BroadcastReceiver?具体来说,您如何在 XML 中告诉应用程序在接收到给定广播时运行正确的 BroadcastReceiver?显然,我的做法是不正确的......

4

1 回答 1

0

您快到了。我认为您只是 AIR 组件的 android 名称略有错误。试试下面的,注意一些类的“air”前缀。

<android>
<manifestAdditions><![CDATA[
    <manifest android:installLocation="auto">
        <permission android:protectionLevel="signature" android:name="air.com.example.znotification.permission.C2D_MESSAGE" />

        <uses-permission android:name="air.com.example.znotification.permission.C2D_MESSAGE" />
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
        <uses-permission android:name="android.permission.INTERNET" />

        <application android:enabled="true">
            <receiver android:name="com.example.znotification.C2DMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">

                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                    <category android:name="air.com.example.znotification" />
                </intent-filter>

                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                    <category android:name="air.com.example.znotification" />
                </intent-filter>

            </receiver>
        </application>

    </manifest>

]]></manifestAdditions>

于 2012-06-11T13:20:43.070 回答