【问题标题】:FCM demo cannot get tokenFCM demo无法获取token
【发布时间】:2017-07-10 12:17:51
【问题描述】:

我在 Firebase 控制台上创建了一个项目。我已经在 Firebase 控制台上注册了包,但我无法从日志中获取任何令牌,甚至点击应用程序中的 LOG TOKEN 按钮。

然后我尝试使用 Firebase 控制台发送消息并将目标设置为我的应用程序包名称。我没有从日志中收到任何传入消息。

代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {

private final String TAG = "HelloJni";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent intent = new Intent(this, RegistrationIntentService.class);
    startService(intent);

    // Example of a call to a native method
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
     if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d(TAG, "Key: " + key + " Value: " + value);
        }
    }
    // [END handle_data_extras]

    Button subscribeButton = (Button) findViewById(R.id.subscribeButton);
    subscribeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // [START subscribe_topics]
            FirebaseMessaging.getInstance().subscribeToTopic("news");
            // [END subscribe_topics]

            // Log and toast
            String msg = getString(R.string.msg_subscribed);
            Log.d(TAG, msg + ",  " + FirebaseInstanceId.getInstance().getToken());
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });
}

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService {
private static final String TAG = "RegIntentService";

public RegistrationIntentService() {
    super(TAG);
}

@Override
protected void onHandleIntent(Intent intent) {
    String token = FirebaseInstanceId.getInstance().getToken();
    Log.i(TAG, "FCM Registration Token: " + token);
}
}

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

@Override
public void onCreate() {
    super.onCreate();
    Log.e(TAG, "oncreate.........");
}

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
// [START refresh_token]
@Override
public void onTokenRefresh() {
    Log.e(TAG, "onTokenRefresh  call...");
    // Get updated InstanceID token.
    Intent intent = new Intent(this, RegistrationIntentService.class);
    startService(intent);
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]

/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer(String token) {
    Log.d(TAG, "  sendRegistrationToServer  Refreshed token: " + token);
    // TODO: Implement this method to send token to your app server.
}
}

MyFirebaseMessagingService.java

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";

@Override
public void onCreate() {
    super.onCreate();
    Log.e(TAG, "oncreate..........");
}

/**
 * Called when message is received.
 *
 * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
 */
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // [START_EXCLUDE]
    // There are two types of messages data messages and notification messages. Data messages are handled
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
    // is in the foreground. When the app is in the background an automatically generated notification is displayed.
    // When the user taps on the notification they are returned to the app. Messages containing both notification
    // and data payloads are treated as notification messages. The Firebase console always sends notification
    // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
    // [END_EXCLUDE]

    // TODO(developer): Handle FCM messages here.
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}
// [END receive_message]

/**
 * Create and show a simple notification containing the received FCM message.
 *
 * @param messageBody FCM message body received.
 */
private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setContentTitle("FCM Message")
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}

AndroidManifest.xml

<application

    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name="com.example.hellojni.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name="MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name="MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    <service android:name="RegistrationIntentService" ></service>
</application>

未调用 MyFirebaseInstanceIDService 和 MyFirebaseMessagingService 的OnCreate(),令牌返回 null。

日志:

02-20 18:05:28.273 23322-23322 W/InstanceID/Rpc: Failed to resolve REGISTER intent, falling back

02-20 18:05:28.273 23322-23322 W/InstanceID/Rpc: Both Google Play Services and legacy GSF package are missing

02-20 18:05:28.273 23322-23322 W/InstanceID/Rpc: Failed to resolve REGISTER intent, falling back

02-20 18:05:28.273 23322-23322 W/InstanceID/Rpc: Both Google Play Services and legacy GSF package are missing

02-20 18:05:28.273 23322-23322 D/HelloJni: Subscribed to news topic,  null

【问题讨论】:

    标签: android firebase firebase-cloud-messaging


    【解决方案1】:

    您正在测试的设备或模拟器没有安装 Google Play 服务或 Google 服务框架 (GSF)。大多数 Firebase API 使用 Google Play 服务的功能,如果设备上不存在,则不会运行。

    【讨论】:

      【解决方案2】:

      最后把它放在你的应用级别gradle中的依赖之后。apply plugin: 'com.google.gms.google-services'

      并将其放入您的项目级别 gradle.classpath 'com.google.gms:google-services:3.0.0'

      确保您已将 google-service.json 放入应用模块中。

      【讨论】:

        【解决方案3】:

        你必须添加。

                      apply plugin: 'com.google.gms.google-services' 
        

        在你的 gradle 文件的最后一行和 .

              classpath 'com.google.gms:google-services:3.0.0'
        

        在您的项目级文件中。 IntentService 服务类只会在您的应用程序内部调用时调用,因此每次都删除应用程序,并且每次您想要生成令牌时都进行内部调用

        【讨论】:

          【解决方案4】:

          我明白原因了。我用中国制造的安卓手机运行这个应用,这些手机没有google play服务和商店。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-05
            • 2019-02-17
            • 2016-11-14
            • 1970-01-01
            • 1970-01-01
            • 2017-07-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多