【问题标题】:How to get the firebase token? [duplicate]如何获得 Firebase 令牌? [复制]
【发布时间】:2019-10-25 11:51:36
【问题描述】:

我正在开发一个通过 FCM 使用通知的测试应用。我正在使用 Volley 将数据从设备发送到服务器(WAMP),但令牌始终是一个空字符串/我编写的默认值。我搜索了互联网,但我仍然不知道为什么没有存储/生成令牌(我是编码新手。) 还有一件事:每次我发送令牌时,toast 都会显示我在那里写的“好”文本,但它也给了我很多 html 代码。 这是我的文件: MainActivity.kt

import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.android.volley.AuthFailureError
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest

class MainActivity : AppCompatActivity() {
    var url: String = "......"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var button: Button = findViewById(R.id.save_token)
        button.setOnClickListener(object : View.OnClickListener{
            override fun onClick(v: View?) {
                val sharedPreferences =
                    applicationContext.getSharedPreferences(getString(R.string.FCM_PREF), Context.MODE_PRIVATE)
                var token: String = sharedPreferences.getString(getString(R.string.FCM_TOKEN),"noToken")
//                var token: String = "sss";
                val request = object : StringRequest(Request.Method.POST, url,
                    Response.Listener { response ->
                        Toast.makeText(this@MainActivity, "Good one $response", Toast.LENGTH_SHORT).show()
                        Log.i("My success", "" + response)
                    }, Response.ErrorListener { error ->
                        Toast.makeText(this@MainActivity, "my error :$error", Toast.LENGTH_LONG).show()
                        Log.i("My error", "" + error)
//                        println("Error $error")
                    }) {
                    @Throws(AuthFailureError::class)
                    override fun getParams(): Map<String, String> {

                        val params = HashMap<String, String>()
                        params.put("fcm_token", token)

                        return params
                    }
                }
                MySingleton.getmInstance(this@MainActivity).addToRequestQueue(request)
            }
        })

    }
}

FcmInstanceIdService.java

public class FcmInstanceIdService extends FirebaseMessagingService{
    @Override
    public void onNewToken(String s) {

        String  recent_token = s;
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(getString(R.string.FCM_PREF),Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(getString(R.string.FCM_TOKEN), recent_token);
        editor.commit();
    }
}

这是我从成功 toast 中得到的日志:

2019-06-11 08:48:45.135 5684-5684/com.example.rares.firebaselast D/My success: connection success<br />
    <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
    <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined variable: mysqli_close in C:\wamp64\www\firebase\fcm_insert.php on line <i>7</i></th></tr>
    <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
    <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
    <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0023</td><td bgcolor='#eeeeec' align='right'>402152</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp64\www\firebase\fcm_insert.php' bgcolor='#eeeeec'>...\fcm_insert.php<b>:</b>0</td></tr>
    </table></font>
    <br />
    <font size='1'><table class='xdebug-error xe-uncaught-exception' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
    <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Uncaught Error: Function name must be a string in C:\wamp64\www\firebase\fcm_insert.php on line <i>7</i></th></tr>
    <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Error: Function name must be a string in C:\wamp64\www\firebase\fcm_insert.php on line <i>7</i></th></tr>
    <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
    <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
    <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0023</td><td bgcolor='#eeeeec' align='right'>402152</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp64\www\firebase\fcm_insert.php' bgcolor='#eeeeec'>...\fcm_insert.php<b>:</b>0</td></tr>
    </table></font>

【问题讨论】:

    标签: java android firebase kotlin firebase-cloud-messaging


    【解决方案1】:

    试试 FirebaseInstanceId

    Firebase 实例 ID 为每个应用提供唯一标识符 实例和一种对操作进行身份验证和授权的机制

    KOTLIN

            FirebaseInstanceId.getInstance().instanceId
                    .addOnSuccessListener(object : OnSuccessListener<InstanceIdResult> {
                        override fun onSuccess(instanceIdResult: InstanceIdResult) {
                            val token = instanceIdResult.token //Token
    
                    }
                  })
    
    【解决方案2】:

    为您的应用创建应用程序类:

    class MyApplication : Application() {
    
    
    override fun onCreate() {
        super.onCreate()
        initFCM()
    }
    
    
    private fun initFCM(){
        FirebaseInstanceId.getInstance().instanceId
                .addOnCompleteListener(OnCompleteListener { task ->
                    if (!task.isSuccessful) {
                        return@OnCompleteListener
                    }
                    // Get new Instance ID token
                    val token = task.result?.token
                })
    }}
    

    在 Androidmanifest.xml 文件中,在 android:name 标签中添加您的自定义应用程序类名称,如下所示。

    <application
        android:name=".MyApplication "
        android:allowBackup="true" 
    

    【讨论】:

    • 我没有这样做。请问我应该把这段代码放在哪里?
    • @Rares 编辑了我的答案..
    【解决方案3】:
    //Get Firebase FCM token
            FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(activity, new OnSuccessListener<InstanceIdResult>() {
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {
                    String token = instanceIdResult.getToken();
    
                }
            });
    

    将此代码放入您的第一个活动的 onCreate 方法中以获取 FCM 令牌。您可以将其保存在全局变量中

    【讨论】:

    • 这不是正确答案(2020 年 8 月)。不再有 getInstanceId(),并且 addOnSuccessListener 必须在 subscribeToTopic() 之后调用,并且它现在具有不同的参数。他们甚至没有更新他们的文档哈哈...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2018-09-01
    相关资源
    最近更新 更多