【问题标题】:FirebaseInstanceIdService getToken returning nullFirebaseInstanceIdService getToken 返回 null
【发布时间】:2017-02-21 19:33:15
【问题描述】:

我正在尝试将 FCM 通知添加到我的应用中,但出于某种原因

FirebaseInstanceId.getInstance().getToken();

正在返回 null。

由于我没有得到任何堆栈跟踪,我最好的猜测是 FirebaseInstanceIdService 不工作

  • Google Play 服务版本:9.6.1
  • Firebase 消息传递版本:9.6.1
  • 从 FirebaseConsole 添加了 json 配置文件(尝试了单个文件,其中包含 2 个客户端,一个用于调试,一个用于发布构建)和 2 个文件,每个用于各自的构建

我在我的模块 gradle 脚本的底部应用了谷歌服务插件 在项目根 gradle 脚本中包含谷歌服务

根据官方文档创建了 2 个服务:

public class MyFirebaseInsanceIDService  extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    PreferencesHelper.putSharedPreferencesString(Constants.User.PUSH_NOTIFICATIONS, refreshedToken);

    Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken());
}

}

还有清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.fc.test">

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:name="fctest"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="${appName}${appNameSuffix}"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:node="replace">

    <service
        android:name="com.fc.test.MyFirebaseInsanceIDService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <service
        android:name="com.fc.test.MyFirebaseMessagingService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <activity
        android:name="com.fc.test.view.splash.Splash"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.CenterAnimation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

</application>

根 Gradle:

buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        //noinspection GradleDynamicVersion
        classpath 'io.fabric.tools:gradle:1.+'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "http://dl.bintray.com/drummer-aidan/maven" }
        maven { url "https://maven.fabric.io/public" }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://jitpack.io" }
    }
}

ext {
    buildToolsVersion = '24.0.1'
    compileSdkVersion = 24
    minSdkVersion = 15
    targetSdkVersion = 24
    supportLibraryVersion = '24.2.1'
}

以及Gradle模块的主要部分

    dependencies {
    final PLAY_SERVICES_VERSION = '9.6.1'
    final SUPPORT_LIBRARY_VERSION = '24.2.1'
    final RETROFIT_VERSION = '2.1.0'
    final DAGGER_VERSION = '2.5'
    final DEXMAKER_VERSION = '1.4'
    final HAMCREST_VERSION = '1.3'
    final ESPRESSO_VERSION = '2.2.1'
    final RUNNER_VERSION = '0.4'
    final BUTTERKNIFE_VERSION = '8.1.0'
    def daggerCompiler = "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
    def jUnit = "junit:junit:4.12"
    def mockito = "org.mockito:mockito-core:1.10.19"
    // App Dependencies
    compile "com.google.android.gms:play-services-gcm:$PLAY_SERVICES_VERSION"
    compile "com.google.firebase:firebase-messaging:$PLAY_SERVICES_VERSION"
    compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:cardview-v7:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:support-v4:$SUPPORT_LIBRARY_VERSION"
    compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
    compile "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
    compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION"
    compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION"
    compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
        transitive = true;
    }
}
apply plugin: 'com.google.gms.google-services
  • 请注意,我在我的根应用程序标签中使用了tools:node="replace"FirebaseInstanceIdService 是否有可能没有添加到清单中,因为它与我的 FirebaseInstanceService 具有相同的意图过滤器,因此没有被调用?

所以我的问题是官方文档或我的实现中是否有问题导致实例令牌为空?

【问题讨论】:

  • 您的设备或模拟器上是否安装了当前版本的 Google Play 服务?
  • 是的,我在我的设备 GS 版本 9.6.83 上测试这个
  • 检查 Firebase 控制台项目设置的云消息传递选项卡上显示的 Sender ID 是否与您的 google-services.json 文件中包含的 project_number 匹配。
  • @qbix 是的,他们是一样的
  • 我开始认为您对 tools:node="replace" 的问题是正确的,但不知道具体原因。没有它是否可以构建您的应用程序?

标签: android firebase firebase-cloud-messaging


【解决方案1】:

这对我有用:

String token = FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken();

【讨论】:

    【解决方案2】:

    在进行迁移时,我遇到了一个问题,就是我没有收到任何通知。要解决这个问题,如果您的 GCM 正常工作,请不要忘记在获得 Firebase 令牌时包含您的发件人 ID。要查看此 ID,您必须导航到您的 Firebase 项目并点击项目名称。单击设置图标并选择“项目设置”菜单选择“Could Messaging”选项卡并使用页面上的发件人 ID。

    当说要编码时:

         token = FirebaseInstanceId.getInstance().getToken();
    

    你必须使用这个:

         token = FirebaseInstanceId.getInstance().getToken("YOUR_SENDER_ID", "FCM");
    

    它对我有用,我希望这对你有帮助;)

    【讨论】:

      【解决方案3】:

      在挖掘了 FCM 的旧实现和生成的清单之后,我现在可以说清单合并是问题所在。

      此问题的解决方案是将这些类手动添加到应用清单中

       <activity
              android:name="com.google.android.gms.common.api.GoogleApiActivity"
              android:exported="false"
              android:theme="@android:style/Theme.Translucent.NoTitleBar" />
      
          <meta-data
              android:name="com.google.android.gms.version"
              android:value="@integer/google_play_services_version" />
      
          <service
              android:name="com.google.firebase.messaging.FirebaseMessagingService"
              android:exported="true" >
              <intent-filter android:priority="-500" >
                  <action android:name="com.google.firebase.MESSAGING_EVENT" />
              </intent-filter>
          </service>
      
          <receiver
              android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
              android:exported="true"
              android:permission="com.google.android.c2dm.permission.SEND" >
              <intent-filter>
                  <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                  <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      
                  <category android:name="com.fc.debug" />
              </intent-filter>
          </receiver>
      
      
          <receiver
              android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
              android:exported="false" />
          <!--
      
          -->
          <service
              android:name="com.google.firebase.iid.FirebaseInstanceIdService"
              android:exported="true" >
              <intent-filter android:priority="-500" >
                  <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
              </intent-filter>
          </service>
      
          <provider
              android:name="com.google.firebase.provider.FirebaseInitProvider"
              android:authorities="com.fc.debug.firebaseinitprovider"
              android:exported="false"
              android:initOrder="100" />
      
          <receiver
              android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
              android:enabled="true" >
              <intent-filter>
                  <action android:name="com.google.android.gms.measurement.UPLOAD" />
              </intent-filter>
          </receiver>
      
          <service
              android:name="com.google.android.gms.measurement.AppMeasurementService"
              android:enabled="true"
              android:exported="false" />
      

      【讨论】:

        【解决方案4】:

        首先生成“google-services.json”并将此文件添加到您的 android 工作室中,就像这个 projectFolder/APP/google-services.json 一样

        将类路径添加到顶级 build.gradle

         dependencies {
                classpath 'com.android.tools.build:gradle:2.1.2'
                classpath 'com.google.gms:google-services:3.0.0'
                // NOTE: Do not place your application dependencies here; they belong
                // in the individual module build.gradle files
            }
        

        在应用的 build.gradle 中添加以下插件和依赖项

        apply plugin: 'com.google.gms.google-services'
        dependencies {
            compile fileTree(dir: 'libs', include: ['*.jar'])
            testCompile 'junit:junit:4.12'
            compile 'com.android.support:appcompat-v7:24.0.0'
            compile 'com.google.firebase:firebase-core:9.4.0'
            compile 'com.google.firebase:firebase-messaging:9.4.0'
        }
        

        在您的 java 文件中添加以下 Firebase 服务

        FirebaseIDService.java

        package com.galleonsoft.firebase.push;
        
        import android.util.Log;
        
        import com.google.firebase.iid.FirebaseInstanceId;
        import com.google.firebase.iid.FirebaseInstanceIdService;
        
        public class FirebaseIDService extends FirebaseInstanceIdService {
            private static final String TAG = "FirebaseIDService";
        
            @Override
            public void onTokenRefresh() {
                // Get updated InstanceID token.
                String refreshedToken = FirebaseInstanceId.getInstance().getToken();
                Log.d(TAG, "Refreshed token: " + refreshedToken);
        
                // TODO: Implement this method to send any registration to your app's servers.
                sendRegistrationToServer(refreshedToken);
            }
        
            private void sendRegistrationToServer(String token) {
                // Add custom implementation, as needed.
            }
        }
        

        MyFirebaseMessagingService.java

        package com.galleonsoft.firebase.push;
        
        import android.util.Log;
        
        import com.google.firebase.messaging.FirebaseMessagingService;
        import com.google.firebase.messaging.RemoteMessage;
        
        public class MyFirebaseMEssagingService extends FirebaseMessagingService {
            private static final String TAG = "FCM Service";
            @Override
            public void onMessageReceived(RemoteMessage remoteMessage) {
                // TODO: Handle FCM messages here.
                // If the application is in the foreground handle both data and notification messages here.
                // Also if you intend on generating your own notifications as a result of a received FCM
                // message, here is where that should be initiated.
                Log.d(TAG, "From: " + remoteMessage.getFrom());
                Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
            }
        }
        

        在您的 AndroidMainifest.xml 文件中添加服务

        <service android:name=".MyFirebaseMEssagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        
        <service android:name=".FirebaseIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        

        【讨论】:

        • 我已经完成了所有这些操作,顺便说一句,您的示例“应用插件:“com.google.gms.google-services”应该出现在应用程序模块的底部有一个错误跨度>
        • 记住主文件中的互联网权限
        • 谢谢 :) 但我也有这个
        • 在两个文件中添加 gradle 代码。并从 firebase 获取 google-services.json 文件并放入 app 文件夹。
        猜你喜欢
        • 2021-01-17
        • 1970-01-01
        • 2013-09-17
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多