2

我在安装我的应用程序本身时收到以下 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();
4

5 回答 5

3

实际上问题在于正确地实现了库。

takeOff以及其他配置代码应该在用于维护应用程序全局状态的类中OnCreate我们大多数人出错的地方。我们把它放在前台s中。ApplicationActivityOnCreate

接下来,您需要以这种方式在应用程序标记中提及您正在使用的类的完全限定名称:ApplicationAndroidManifest.xml

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

就是UA 原始文档中提到的实现方式。

于 2014-07-23T09:05:34.617 回答
1

我和你有同样的 NPE,但有不同的原因/解决方案。就我而言,我的 AndroidManifest.xml 中有正确的 UA 服务/接收器,但忘记调用 UAirship.takeOff()。在我包含以下代码后,NPE 消失了:

    UAirship.takeOff(application, AirshipConfigOptions.loadDefaultOptions(application));
    PushManager.enablePush();
于 2014-03-13T06:20:40.517 回答
1

问题似乎是因为特定的 api 附加到了我用于调试的不同 UA 应用程序。我创建了一个新应用程序,并假设相同的 api 也可以附加到这个应用程序。事实并非如此。我尝试使用新设备,它工作正常。

于 2013-08-01T12:14:33.570 回答
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实际上是要传递的正确参数。

于 2013-07-30T03:04:48.910 回答
0

从 OP 的评论和阅读文档源来看,它似乎被错误地实例化了。

如果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.
于 2013-07-22T14:34:10.557 回答