У меня есть реализация FCM в проекте, и, похоже, идентификатор экземпляра FCM не генерируется только в этом одном устройстве (Samsung Galaxy s8, версия Android 8.0.0).Кроме этого устройства, он отлично работает на других устройствах.Однако, к сожалению, сейчас у меня нет доступа к любому другому устройству oreo, поэтому я не могу проверить, является ли это проблемой oreo или проблемой телефона.
Мой файл манифеста:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ideabinbd.fcmimplementation">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".FCMInstance">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service android:name=".FcmMessageReceiver">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</application>
Класс идентификатора экземпляра:
public class FCMInstance extends FirebaseInstanceIdService {
private final String TAG="fcmToken";
public String currentToken;
@Override
public void onTokenRefresh() {
currentToken= FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, currentToken);
}
}
Служба OnMessageReceive:
public class FcmMessageReceiver extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d("fcm","messageRecieved");
String title= remoteMessage.getNotification().getTitle();
String body= remoteMessage.getNotification().getBody();
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mNotifyBuilder;
NotificationManager mNotificationManager;
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 9001;
mNotifyBuilder = new NotificationCompat.Builder(getApplicationContext())
.setContentTitle(title)
.setContentText(body)
.setSmallIcon(R.mipmap.ic_launcher);
// Set pending intent
mNotifyBuilder.setContentIntent(resultPendingIntent);
// Set Vibrate, Sound and Light
int defaults = 0;
//defaults = defaults | Notification.DEFAULT_LIGHTS;
//defaults = defaults | Notification.DEFAULT_VIBRATE;
defaults = defaults | Notification.DEFAULT_SOUND;
mNotifyBuilder.setDefaults(defaults);
// Set the content for Notification
// Set autocancel
mNotifyBuilder.setAutoCancel(true);
// Post a notification
mNotificationManager.notify(notifyID, mNotifyBuilder.build());
}
}
На MainActivity:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "fcmToken";
Button invokeServer;
String url="http://10.0.3.2/fcm/fcmInsert.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, FirebaseInstanceId.getInstance().getToken());
}
Я получаю исключение нулевого указателя при попытке распечатать токен с использованием журнала.Ниже приведен логкат для ошибки:
Процесс: com.ideabinbd.fcmimplementation, PID: 809 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.ideabinbd.fcmimplementation / com.ideabinbd.fcmimplementation.MainActivity}: java.lang.NullPointerException: для печати требуется сообщение на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2955) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3030) в android.app.ActivityThread.-wrap11 (неизвестный источник: 0) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1696) в android.os.Handler.dispatchMessage (Handler.java:105) в android.os.Looper.loop(Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6938) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:327) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374). Причина: java.lang.NullPointerException: println нуждается в amessage на android.util.Log.println_native (собственный метод) на android.util.Log.d (Log.java:161) на com.ideabinbd.fcmimplementation.MainActivity.onCreate (MainActivity.java:34) на android.app.Activity.performCreate (Activity.java:7174) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1220) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2908)
снова, код прекрасно работает для более старых версий Android, есть ли какой-то шаг, который я пропускаю для Android 8, необходимых для создания идентификатора службы?И речь идет не о канале уведомлений , поскольку получение отдельных уведомлений будет работать только в том случае, если я сгенерирую токен.