GoogleCloudMessaging InstanceID.getInstance возвращает ноль

Я искал проблему, с которой столкнулся, но пока не нашел ничего, касающегося того, что я получаю, пытаясь получить InstanceID от GoogleCloudMessaging. Я попытался настроить вызов в классе, расширяющем IntentService, а также попытался использовать AsyncTask для вызова в фоновом режиме, но безрезультатно.

Я следовал инструкциям по настройке манифеста и приложения для получения правильной информации. У кого-нибудь есть подсказка, что может быть не так? Мои журналы говорят, что в InstanceID.getInstance есть исключение nullPointerException (getApplicationContext());

мой вызов:

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();

Это вызывается сразу после проверки, обновлены ли сервисы воспроизведения.

Есть идеи? Если мне нужно предоставить больше информации, я могу, но это всего лишь фрагмент того, что я могу опубликовать.

РЕДАКТИРОВАТЬ: Попытка добавить intent-filter к сервису в Manifest и проверить, является ли getApplicationContext () нулевым, и это то, что говорит мне возвращение исключения:

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: попытка вызвать виртуальный метод 'android.content.Context android.content.Context.getApplicationContext()' для ссылки на пустой объект

Итак, я предполагаю, что getApplicationContext возвращает ноль?

2 ответа

Вы не должны создавать экземпляр RegisterGCM(). Это должно быть начато с вызова startService() с вашей "целевой страницы":

if (checkPlayServices()) {
    // Start IntentService to register this application with GCM.
    Intent intent = new Intent(this, RegisterGCM.class);
    startService(intent);
}

Смотрите полный пример здесь

Согласно руководству, убедитесь, что ваш IntentService имеет

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

разрешение. Кроме того, когда вы звоните в службу? Если вы явно не запустили его как exported = false в манифесте, getApplicationContext() может возвращать ноль. Проходя по коду, он запутывается, но, похоже, вам лучше использовать ссылку на Контекст Сервиса в нескольких шагах по линии, которую он вызывает. getApplicationContext() из контекста, который вы передаете, и это, скорее всего, откуда ваш нулевой объект.

Я думаю, что этот вызов возвращает ноль для Application учебный класс.

Посмотрите на конструктор здесь: класс приложения, а затем он супер: ContextWrapper, затем вызов getApplicationContext() вызывает mBase объект, который выглядит как нулевой, отсюда и NPE.

Другие вопросы по тегам