GoogleCloudMessaging InstanceID.getInstance返回null

时间:2015-06-15 19:27:06

标签: nullpointerexception google-cloud-messaging instanceid

我一直在寻找我面临的问题,但还没有发现任何与我尝试从GoogleCloudMessaging获取InstanceID有关的内容。我已尝试在扩展IntentService的类中设置调用,并尝试使用AsyncTask在后台调用它,但无济于事。

我一直在关注如何设置Manifest和应用程序以获取正确信息的教程。任何人都有任何线索可能是错的?我的日志说InstanceID.getInstance(getApplicationContext())中存在nullPointerException;

我的电话:

private class RegisterGCM extends IntentService{
    public RegisterGCM(){
        super("GcmIntentService");
        registerDevice();
    }
    private void registerDevice(){
        InstanceID instanceId = InstanceID.getInstance(getApplicationContext());

        //Constants contains GCM_SENDER_ID which is the project number from Google Developer Console
        String token = instanceId.getToken(Constants.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE);
    }
}

我登录后将此类放在我的LandingPage类中,并通过以下方式调用它:

new RegisterGCM();

在检查播放服务是否是最新的并更新之后立即调用此方法。

有什么想法吗?如果我需要提供更多信息,但这只是我可以发布的内容的一小部分。

编辑: 尝试在Manifest中添加intent-filter到service并检查getApplicationContext()是否为null,这就是返回的异常告诉我的:

06-15 16:42:38.614: W/System.err(17295): java.lang.NullPointerException:   Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
06-15 16:42:38.624: W/System.err(17295):    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:110)
06-15 16:42:38.624: W/System.err(17295):    at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
06-15 16:42:38.624: W/System.err(17295):    at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
06-15 16:42:38.624: W/System.err(17295):    at .gcmnotification.GcmIntentService.registerDevice(GcmIntentService.java:33)
06-15 16:42:38.624: W/System.err(17295):    at .gcmnotification.GcmIntentService.<init>(GcmIntentService.java:29)
06-15 16:42:38.624: W/System.err(17295):    at .LandingPageActivity.onCreate(LandingPageActivity.java:115)
06-15 16:42:38.624: W/System.err(17295):    at android.app.Activity.performCreate(Activity.java:6289)
06-15 16:42:38.624: W/System.err(17295):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
06-15 16:42:38.624: W/System.err(17295):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
06-15 16:42:38.624: W/System.err(17295):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2777)
06-15 16:42:38.624: W/System.err(17295):    at android.app.ActivityThread.access$900(ActivityThread.java:179)
06-15 16:42:38.624: W/System.err(17295):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1462)
06-15 16:42:38.624: W/System.err(17295):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-15 16:42:38.624: W/System.err(17295):    at android.os.Looper.loop(Looper.java:145)
06-15 16:42:38.624: W/System.err(17295):    at android.app.ActivityThread.main(ActivityThread.java:5972)
06-15 16:42:38.624: W/System.err(17295):    at java.lang.reflect.Method.invoke(Native Method)
06-15 16:42:38.624: W/System.err(17295):    at java.lang.reflect.Method.invoke(Method.java:372)
06-15 16:42:38.624: W/System.err(17295):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
06-15 16:42:38.624: W/System.err(17295):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

这是我的catch块返回的错误消息: 尝试调用虚方法&#39; android.content.Context android.content.Context.getApplicationContext()&#39;在空对象引用上

所以我猜测getApplicationContext是否返回null?

2 个答案:

答案 0 :(得分:1)

根据指南,确保您的IntentService具有

<intent-filter>
             <action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>

许可。另外,你什么时候打电话给服务?如果您没有在清单中将其显式启动为exported = false,则getApplicationContext()可能会返回null。逐步执行代码会使其变得模糊不清,但看起来您可能最好使用对服务上下文的引用,因为它从您传入的上下文中调用getApplicationContext()行的几步,这很可能您的null对象来自哪里。

我认为此调用对Application类返回null。

在这里查看构造函数: Application class然后它超级:ContextWrapper,然后调用getApplicationContext()调用mBase对象,它看起来像是null,因此是NPE。

答案 1 :(得分:1)

您不应该创建RegisterGCM()的实例。它应该从你的“登陆页面”调用startService()开始:

d << 1

查看完整示例here