E / FirebaseInstanceId:令牌检索失败:Android Kitkat及更低版本中的PHONE_REGISTRATION_ERROR

时间:2018-12-05 09:27:55

标签: android firebase push-notification firebase-cloud-messaging android-notifications

编辑:我忘了告诉我,我已经尝试在onRefreshToken上创建一个断点,并在该函数中创建一个Log,但是当我启动应用程序时,它们都没有运行(断点没有运行)。启动,并且Log不会显示在AS的控制台日志中)。因此,IMO的纯粹目的是不会启动服务本身。


我编写了一个代码,如果onMessageReceived中有数据传入,我的应用程序将在其中显示通知。 它可以很好地运行,没问题,直到我在Android Jelly Bean中尝试

通知没有显示(我确定已发送通知,因为另一个非JellyBean设备同时显示了通知。),然后我尝试了KitKat设备,结果相同

然后我尝试对其进行调试,并且在Android Studio中没有显示错误(我敢打赌,因为该设备安装了中文rom并且没有内置Google Play服务)。

稍后,我更改了方法并在Emulator中尝试,然后显示E/FirebaseInstanceId: Token retrieval failed: PHONE_REGISTRATION_ERROR。我已经在安装了KitKat和JellyBean映像的模拟器中尝试过,结果是相同的,出现相同的消息。

这是我的代码:

AndroidManifest

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

///Some activity and meta data here

    <service
        android:name=".fcm.MyFirebaseInstanceIdService"
        android:enabled="true"
        android:exported="true"
        tools:ignore="ExportedService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name=".fcm.MyFirebaseMessagingService"
        android:enabled="true"
        android:exported="true"
        tools:ignore="ExportedService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
</manifest>

MyFirebaseInstanceIdService

class MyFirebaseInstanceIdService : FirebaseInstanceIdService() {
    val TAG = "PushNotifService"
    lateinit var name: String

    override fun onTokenRefresh() {
        val token = FirebaseInstanceId.getInstance().token
    }
}

MyFirebaseMessagingService

class MyFirebaseMessagingService : FirebaseMessagingService() {

    private val session = SessionManagement(this)

    @SuppressLint("LongLogTag")
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if (remoteMessage.data != null){
            val data = remoteMessage.data
            val title = data["title"]
            val body = data["body"]
            showNotification(title, body)
        }
    }

    @SuppressLint("LongLogTag")
    override fun onNewToken(token: String?) {
        session.updateFCMToken(token)
    }

    fun subscribeTopic(topic: String?){

//the topic in here is a param send by other activity when the apps lunch 

FirebaseMessaging.getInstance().subscribeToTopic(topic).addOnCompleteListener { task ->
            if (!task.isSuccessful) {
            } else {
            }
        }
    }

//This sendMessageTrainer() is called and run from other activity

    fun sendMessageTrainer(){
        val contentType = "application/json"
        val authorizationKey = ServerHelper.FCMServerKey
        val data = "{\"to\": \"/topics/sometopic\",\"data\": {\"title\":\"Request Update\",\"body\":\"New Request.\"}}"
        Fuel.post(ServerHelper.FCMServer).header("Content-Type" to contentType, "Authorization" to "key=$authorizationKey").body(data).responseJson{
            _, _, result ->
            result.failure {
                sendMessageTrainer()
            }
            result.success {
            }
        }
    }


//showNotification() is run if there is a new data/notification from onMessageReceived 

    private fun showNotification(title: String?, body: String?) {
        val intent = Intent(this, LauncherActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
        val channelName = getString(R.string.app_name)
        val channelID = "default"
        val alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        val notifyID = 1
        val notification = NotificationCompat.Builder(this, channelID)
                .setSmallIcon(R.drawable.ic_logo)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setSound(alarmSound)
                .setContentIntent(pendingIntent)
                .build()
        when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
                val importance = NotificationManager.IMPORTANCE_HIGH
                val mChannel = NotificationChannel(channelID, channelName, importance)
                val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                mNotificationManager.createNotificationChannel(mChannel)
                mNotificationManager.notify(notifyID , notification)
            }
            Build.VERSION.SDK_INT <= Build.VERSION_CODES.N -> {
                val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                mNotificationManager.notify(notifyID, notification)
            }
        }
    }
}

感谢和问候

vl14b

0 个答案:

没有答案