2013-07-22 63 views
2

我在安裝我的應用程序本身時得到以下NPE。請幫忙。UrbanAhiphip 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" 
} 

儘管如此,我沒能看到我的設備上的任何通知。 MainActivity的

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> 

部分:

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 ):在android.app.ActivityThread.handleReceiver(ActivityThread.java:2277)'你有沒有在你的清單中聲明你的廣播接收器或者你是否實例化了它? – t0mm13b

+0

請顯示確認的代碼。 – t0mm13b

+0

OP:請停止在評論中張貼代碼,重新編輯您的問題,因爲這些評論使代碼無法閱讀。 – t0mm13b

回答

0

從OP的意見,並讀取documentation源,它似乎是不正確的實例化。

如果IntentReceiverBroadcastReceiver一個子類,按照該文件中,那麼下面應該這樣做:

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,但有不同的原因/解決方案。在我的情況下,我的AndroidManifest.xml中有適當的UA服務/接收器,但忘記調用UAirship.takeOff()。在我收入以下代碼後,NPE消失了:

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

我發現上述NPE的另一個(類似)原因。爲了提高性能,我在應用程序啓動後的30秒之前將通話延遲至takeOff(),並且再次看到NPE。在我看來,即使沒有調用takeOff(),UrbanAirship代碼也會註冊它的GCMPushReceiver。 GCMPushReceiver然後對GCM廣播作出反應,並且如果takeOff()尚未被調用,則拋出NPE。這可能是UA人員編寫他們的UA Android庫時所犯的一個錯誤,或者是由於GCM工作方式造成的妥協。 –

3

實際上問題出在正確實施庫。

takeOff以及其他配置代碼應該是在其中用於maintaining global state of the application。這對Application類的OnCreate是我們大多數人去wrong.We把它放在前臺Activity小號OnCreate

接下來,你需要提及你正在使用的AndroidManifest.xml您的應用程序標籤中這樣的完全合格的名稱Application

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

是它是如何實現如original docs of UA中所述。