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.