Phonegap на Android: push-уведомления ничего не делают при нажатии
У меня было два устройства с одним и тем же приложением (PhoneGap 2.5.0, Android SDK min 11, target 19). Один работал отлично, а другой имел следующую проблему: я отправил push-уведомление (через PushWoosh, http://pushwoosh.com/ аналогично Urban Airship) на все устройства, и оба моих устройства получили его, но на устройстве с проблемой Когда приложение не было на переднем плане, и я нажал на уведомление из трея, уведомление было отклонено, но приложение не было возвращено на передний план.
Единственное различие между этими двумя устройствами заключалось в том, что одно (рабочее) получало приложение только через локальные сборки из Eclipse и Android Studio, а другое (с описанной выше проблемой) получало приложение из локальных сборок и TestFlight. ( http://testflightapp.com/ сервис управления сборкой).
Я попытался установить приложение с помощью TestFlight на работающее устройство, и теперь на этом устройстве возникает та же проблема. Я попытался удалить TestFlight и мое приложение, а затем выполнить сборку на каждое устройство из Android Studio, но проблема не устранена.
Logcat
В Android Studio logcat сообщает мне следующее, как только я нажимаю на уведомление:
12-24 17:01:25.152 780-1032/? I/ActivityManager﹕ START u0 {flg=0x24000000 cmp=com.markon.markon/com.arellomobile.android.push.PushHandlerActivity bnds=[0,153][1080,351] (has extras)} from pid -1
12-24 17:01:25.152 780-1032/? W/ActivityManager﹕ Permission Denial: starting Intent { flg=0x24000000 cmp=com.markon.markon/com.arellomobile.android.push.PushHandlerActivity bnds=[0,153][1080,351] (has extras) } from null (pid=-1, uid=10207) not exported from uid 10217
12-24 17:01:25.172 780-1032/? W/ActivityManager﹕ Unable to send startActivity intent
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x24000000 cmp=com.markon.markon/com.arellomobile.android.push.PushHandlerActivity bnds=[0,153][1080,351] (has extras) } from null (pid=-1, uid=10207) not exported from uid 10217
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1186)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:741)
at com.android.server.am.ActivityManagerService.startActivityInPackage(ActivityManagerService.java:3300)
at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:252)
at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:192)
at android.content.IIntentSender$Stub.onTransact(IIntentSender.java:64)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Возможно, связана проблема с TestFlight
До того, как я удалил TestFlight, регистрация устройства в PushWoosh работала странно. Я создал страницу настроек, на которой пользователи могли получать или отключать push-уведомления, которые вызывают соответствующую службу в PushWoosh. Logcat сказал, что вызов происходил правильно, и даже вернул успешный обратный вызов, но настройки не застряли. Если я включил (устройство зарегистрировано) и отказался, то PushWoosh сообщит через logcat, что вызов был успешным, но число зарегистрированных устройств не будет обновлено, и push-уведомления все еще будут поступать. Противоположность (отказ от участия, а затем попытка участия) провалилась таким же образом.
Как только я удалил TestFlight, мое приложение и переустановил мое приложение, сервисные вызовы для регистрации / отмены регистрации моего устройства работали отлично. Однако даже после этого нажатие на push-уведомления не удавалось. Я не могу понять, как полностью "перезагрузить" мой телефон, чтобы вернуться в то состояние, в котором я был раньше (где все работало с push-уведомлениями).
AndroidManifest.xml
Я не думаю, что это связано с тем, что я не изменял манифест между временем, когда все работало хорошо, и когда возникла проблема. В том числе и на всякий случай.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.markon.markon"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="19" />
<compatible-screens></compatible-screens>
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- start pushwoosh needs -->
<!--library-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!--
Creates a custom permission so only this app can receive its messages.
NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,
where PACKAGE is the application's package name.
-->
<permission
android:name="com.markon.markon.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission
android:name="com.markon.markon.permission.C2D_MESSAGE"/>
<!-- This app has permission to register and receive data message. -->
<uses-permission
android:name="com.google.android.c2dm.permission.RECEIVE"/>
<!-- end pushwoosh needs -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Markon"
android:label="@string/title_activity_markon"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
android:screenOrientation="portrait"
android:launchMode="singleTop" >
<!-- for pushwoosh -->
<intent-filter>
<action android:name="com.markon.markon.MESSAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- for pushwoosh -->
<activity android:name="com.arellomobile.android.push.PushWebview"/>
<activity android:name="com.arellomobile.android.push.MessageActivity"/>
<activity android:name="com.arellomobile.android.push.PushHandlerActivity"/>
<!--
BroadcastReceiver that will receive intents from GCM
services and handle them to the custom IntentService.
The com.google.android.c2dm.permission.SEND permission is necessary
so only GCM services can send data messages for the app.
-->
<service android:name="com.arellomobile.android.push.PushGCMIntentService"/>
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
<category android:name="com.markon.markon"/>
</intent-filter>
</receiver>
<!--
Application-specific subclass of PushGCMIntentService that will
handle received messages.
-->
<!-- <service android:name="com.arellomobile.android.push.GeoLocationService"/> -->
</application>
</manifest>