2013-07-22 4 views
2

Я получаю следующий NPE при установке моего приложения. Пожалуйста помоги.UrbanAirship NPE

07-22 16:27:06.380: E/UA AP(6071): Unable to takeOff automatically 
07-22 16:27:06.385: D/AndroidRuntime(6071): Shutting down VM 
07-22 16:27:06.385: W/dalvikvm(6071): threadid=1: thread exiting with uncaught exception (group=0x415db2a0) 
07-22 16:27:06.385: E/AndroidRuntime(6071): FATAL EXCEPTION: main 
07-22 16:27:06.385: E/AndroidRuntime(6071): java.lang.RuntimeException: Unable to start receiver com.urbanairship.push.GCMPushReceiver: java.lang.NullPointerException 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2277) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.app.ActivityThread.access$1500(ActivityThread.java:140) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.os.Looper.loop(Looper.java:137) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.app.ActivityThread.main(ActivityThread.java:4898) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at java.lang.reflect.Method.invokeNative(Native Method) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at java.lang.reflect.Method.invoke(Method.java:511) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at dalvik.system.NativeStart.main(Native Method) 
07-22 16:27:06.385: E/AndroidRuntime(6071): Caused by: java.lang.NullPointerException 
07-22 16:27:06.385: E/AndroidRuntime(6071): at com.urbanairship.UAirship.getPackageName(Unknown Source) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at com.urbanairship.push.GCMPushReceiver.onReceive(Unknown Source) 
07-22 16:27:06.385: E/AndroidRuntime(6071): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2270) 
07-22 16:27:06.385: E/AndroidRuntime(6071): ... 10 more 

Несмотря на то, что я получаю это, за исключением того, что я могу запустить приложение. На работающем:

url -X POST -u "<app id>:<mastersecret>" -H "Content-Type: application/json" --data '{"android": {"alert": "TestPushtoAPID"}, "apids": ["****4"]}' https://go.urbanairship.com/api/push/ 

Я получаю следующий ответ:

{ 
    "push_id": "33e95250-f2b9-11e2-a8d0-14feb5d31f47" 
} 

Несмотря на это, я не могу видеть никаких уведомлений на устройстве.

Part of Android Manifest 
<!-- REQUIRED for Urban Airship GCM--> 
<receiver android:name="com.urbanairship.CoreReceiver" /> 
<receiver android:name="com.urbanairship.push.GCMPushReceiver" 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" /> 
    </intent-filter> 
</receiver> 

Часть MainActivity:

UAirship.takeOff(this.getApplication(), options); 
PushManager.enablePush(); 
PushManager.shared().setIntentReceiver(IntentReceiver.class); 
String apid = PushManager.shared().getAPID(); 
+0

Что вы пробовали? Что вы раскрыли? Исключение нулевого указателя связано с тем, что вы используете переменную, которая не создается где-то внутри 'Невозможно запустить приемник com.urbanairship.push.GCMPushReceiver: java.lang.NullPointerException 07-22 16: 27: 06.385: E/AndroidRuntime (6071): at android.app.ActivityThread.handleReceiver (ActivityThread.java:2277) 'У вас есть ваш вещательный приемник в вашем манифесте или вы его создали? – t0mm13b

+0

Пожалуйста, покажите код для подтверждения. – t0mm13b

+0

OP: Пожалуйста, прекратите размещать код в комментариях, повторно отредактируйте свой вопрос, поскольку эти комментарии делают код нечитаемым. – t0mm13b

ответ

0

Из комментариев ора, и чтение documentation источника, по-видимому это неправильно экземпляра.

Если IntentReceiver подкласс BroadcastReceiver, в соответствии с документацией, то следующий должен сделать это:

class IntentReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent argIntent) { 
     // Handle it here 
    } 
} 

Фактическая конкретизация для него было бы в таком виде:

IntentReceiver intentRcvr = new BroadcastReceiver(); 
PushManager.enablePush(); 
PushManager.shared().setIntentReceiver(intentRcvr); // TAKE NOTE! 
// Rest of code. 
0

Это заставляет меня подозревать, что вы не настроили свой AndroidManifest.xml правильно:

07-22 16:27:06.385: E/AndroidRuntime(6071): Caused by: java.lang.NullPointerException 07-22 16:27:06.385: E/AndroidRuntime(6071): at com.urbanairship.UAirship.getPackageName(Unknown Source)

Вы добавили полное имя пакета вашего IntentReceiver в AndroidManifest.xml? Если я прошу прокомментировать, я получу вашу точную ошибку.

<!-- OPTIONAL, if you want to receive push, push opened and registration completed intents --> 
<receiver android:name="com.XXXX.IntentReceiver" /> 

@ t0mm13b К сожалению, я не могу получить код для компиляции - вы не можете создать экземпляр BroadcastReceiver и PushManager.shared().setIntentReceiver() не принимает конкретизированных объекты, только Class<? extends BroadcastReceiver> - поэтому IntentReceiver.class на самом деле правильный параметр, чтобы пройти.

1

Проблема, похоже, связана с тем, что конкретный apid подключен к другому UA-приложению, которое я использовал для отладки. Я создал новое приложение и предположил, что тот же apid также может подключиться к этому приложению. Это не относится к делу. Я попытался использовать новое устройство, и он работает нормально.

1

У меня был тот же NPE, что и у вас, но у меня была другая причина/решение. В моем случае у меня были собственные сервисы/приемники UA в моем AndroidManifest.xml, но я забыл позвонить UAirship.takeOff(). После того, как я включил следующий код, то NPE ушел:

UAirship.takeOff(application, AirshipConfigOptions.loadDefaultOptions(application)); 
    PushManager.enablePush(); 
+0

Я нашел другую (аналогичную) причину для вышеуказанного NPE. Чтобы повысить производительность, я отложил вызов takeOff() до 30 секунд после начала моего приложения, и я снова вижу NPE. Мне кажется, что код UrbanAirship регистрирует свой GCMPushReceiver, даже если takeOff() не вызывается. Затем GCMPushReceiver реагирует на трансляции GCM и бросает NPE, если takeOff() еще не был вызван. Вероятно, это была либо ошибка, которую произвели UA, когда они кодировали свою библиотеку UA Android, или компромисс, который они сделали из-за того, как работает GCM. –

3

На самом деле проблема была в реализации библиотеки правильно.

takeOff, а также другой код конфигурации должен быть в OnCreate из Application класса, который используется для maintaining global state of the application .Это где большинство из нас идут wrong.We поставить его на передний план Activity ы OnCreate.

Далее вам необходимо упомянуть полное имя из Application класса, который вы используете в AndroidManifest.xml в прикладном теге так:

<application 
     android:name="com.popa.app.MyApplication" 
     .. 

Это является, как это должно быть реализовано как указано в original docs of UA.