3

У меня проблема, связанная с сервисом Amazon SNS в моем приложении для Android. Я использую сервис Amazon SNS push. См. Эту ссылку http://docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html для получения дополнительной информации об услуге Amazon SNS.Android Amazon SNS issue (GCM)

Я реализовал его, как в образцах Amazon http://docs.aws.amazon.com/sns/latest/dg/mobile-push-gcm.html, и он отлично работал для меня в течение некоторого времени.

Но недавно некоторые пользователи, использующие Android 4.0.3 или 4.0.4, сообщили мне отчет с неправильной рабочей службой push. Я начал исследовать эту проблему и обнаружил странное поведение этого: иногда мой push-приемник нажимает на сообщение - «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> 

Вот мой ExternalReceiver:

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 
+0

SNS или GCM? Исправьте свои теги. – 323go

+0

Привет, я использую Amazon SNS, но, как я знаю, Amazon SNS использует GCM для отправки push-уведомлений. – vleonidov

+0

@vleonidov Как выглядит ваш метод processPush()? – portfoliobuilder

ответ

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" /> 

... Как вы можете зарегистрировать ваше приложение ГКМ по:

   GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
       String regId = gcm.register(senderId); 
Смежные вопросы