【问题标题】:Android Amazon SNS issue (GCM)Android Amazon SNS 问题 (GCM)
【发布时间】:2015-08-11 16:17:30
【问题描述】:

我的 Android 应用程序中存在与 Amazon SNS 服务相关的问题。我在其中使用 Amazon SNS 推送服务。有关 Amazon SNS 服务的更多详细信息,请参阅此链接 http://docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html

我像在亚马逊示例 http://docs.aws.amazon.com/sns/latest/dg/mobile-push-gcm.html 中一样实现了它,并且它在一段时间内对我来说效果很好。

但最近一些使用 Android 4.0.3 或 4.0.4 的用户向我报告了推送服务不正确的报告。我开始调查这个问题并发现了一个奇怪的行为:有时我的推送接收器会推送消息 - “unregistered=my.package.name”,而不是我推送的真实消息。

这是我的 AndroidManifest.xml 代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.package"
    android:versionCode="14"
    android:versionName="1.49" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="com.google.android.c2dm.permission.REGISTER" />

    <permission android:name="my.package.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="my.package.permission.C2D_MESSAGE" />

    <application
        android:name="com.test.package.AppClass"
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <receiver
            android:name="com.test.package.ExternalReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <action android:name="com.google.android.c2dm.intent.REGISTER" />

                <category android:name="com.test.package" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

这是我的外部接收器:

    public class ExternalReceiver extends BroadcastReceiver {
    private static final String ACTION_REGISTRATION =  "com.google.android.c2dm.intent.REGISTRATION";
    private static final String ACTION_RECEIVE = "com.google.android.c2dm.intent.RECEIVE";
    private static final String UNREGISTERED = "unregistered";

    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
            Bundle extras = intent.getExtras();

            String message = "";
            String action = intent.getAction();

            if (extras != null) {
                for (String key : extras.keySet()) {
                    message += key + "=" + extras.getString(key) + "\n";
                }
            }

            if (action.equalsIgnoreCase(ACTION_REGISTRATION)) {
                Log.i(TAG, message);
            } else if (action.equalsIgnoreCase(ACTION_RECEIVE)) {
                String pushText = intent.getStringExtra("default");
                processPush(pushText, context);
            }
        }
    }
}

这是一条 LogCat 消息,当我推送到已注册的设备时,我收到了一些消息:

12-20 13:32:33.683: I/Test ExtrernalReceiver(5353): registration_id=APA91bFQymRS8NOPgHDlFicpQIXDwvgWQR6_CVYC1Le-Cmhl8uTzPDPVbe1yjjKdQjMsilo4XGImAiX8ORnkZiySjbwgTmzC7lC8T3Plch1m0faKiiqc6hl75msTBmMIBhtLtKdtz_R6CY1yjygvyWplTh_yq04tCaOKCfcDcsYwYbQdmscyfUA
12-20 13:32:49.693: I/Test ExtrernalReceiver(5353): registration_id=APA91bFQymRS8NOPgHDlFicpQIXDwvgWQR6_CVYC1Le-Cmhl8uTzPDPVbe1yjjKdQjMsilo4XGImAiX8ORnkZiySjbwgTmzC7lC8T3Plch1m0faKiiqc6hl75msTBmMIBhtLtKdtz_R6CY1yjygvyWplTh_yq04tCaOKCfcDcsYwYbQdmscyfUA
12-20 13:33:19.763: I/Test ExtrernalReceiver(5353): unregistered=my.package

【问题讨论】:

  • SNS 还是 GCM?请修正您的标签。
  • 您好,我使用 Amazon SNS,但我知道 Amazon SNS 使用 GCM 发送推送通知。
  • @vleonidov 你的 processPush() 方法是什么样的?

标签: android broadcastreceiver google-cloud-messaging amazon-sns


【解决方案1】:

如果您清单显示,您的接收者条目看起来有点不对劲。此处的意图过滤器类别标签需要与您的应用程序包匹配(参见第 2 行 package="my.package")。其中一个包名称是错误的。

    <receiver
        android:name="com.test.package.ExternalReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <action android:name="com.google.android.c2dm.intent.REGISTER" />
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="my.package" />
        </intent-filter>
    </receiver>

如果实际包是“com.test.package”,则更改两个引用

<category android:name="com.test.package" />

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.test.package"

我建议在此将更新后的Google Play Services example 与支持库一起使用(它使用支持库WakefulBroadcastReceiver,并且不再需要为以下操作设置广播接收器:

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

...您可以通过以下方式将您的应用程序注册到 GCM:

                GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
                String regId = gcm.register(senderId);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多