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

을, 나는 내 장치에서 모든 알림을 볼 수 없습니다입니다. 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

무엇을 시도 했습니까? 너는 무엇을 발견 했는가? null 포인터 예외는 '수신자를 시작할 수 없습니다. com.urbanairship.push.GCMPushReceiver : None.nullPointerException 012U의 인스턴스가 생성되지 않은 변수를 사용하고 있기 때문입니다. 07-22 16 : 27 : 06.385 : E/AndroidRuntime (6071) : 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에 추가 했습니까? 내 의견을 밝히면 정확한 오류가 발생합니다. t0mm13b @

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

불행히도 내가 코드를 컴파일 할 수 없습니다 - 당신이 BroadcastReceiver을 인스턴스화 할 수 있으며, PushManager.shared().setIntentReceiver()가 인스턴스화 된 객체를 허용하지 않습니다 만 Class<? extends BroadcastReceiver> - 그러므로 IntentReceiver.class 통과 할 수있는 올바른 매개 변수는 사실이다.

1

특정 apid가 디버깅에 사용 된 다른 UA 응용 프로그램에 연결되어 있기 때문에 문제가 발생한 것으로 보입니다. 나는 새로운 앱을 만들었고 같은 앱이이 앱에도 붙을 수 있다고 생각했다. 그건 사실이 아니야. 새로운 장치를 사용해 보았는데 정상적으로 작동합니다.

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 .This에 사용되는 Application 클래스의 OnCreate 우리의 대부분은 wrong.We 전경 ActivityOnCreate에 넣어 갈 어디에서 다른 구성 코드가 있어야합니다.

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

그것을 구현하는 방법은 다음과 같습니다

다음 당신은 당신이 당신의 응용 프로그램 태그 내에서 AndroidManifest.xml에서이 방법을 사용하는 완전한 이름 Application 클래스의을 언급 할 필요가 original docs of UA에 언급 된대로