Android FirebaseInstanceId.getInstance().getToken()正在生成两种不同类型的令牌

Android FirebaseInstanceId.getInstance().getToken()正在生成两种不同类型的令牌,android,firebase,push-notification,firebase-cloud-messaging,Android,Firebase,Push Notification,Firebase Cloud Messaging,我正在使用下面的代码生成FCM注册令牌,以实现设备到设备推送通知服务 @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); // TO

我正在使用下面的代码生成FCM注册令牌,以实现设备到设备推送通知服务

@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.
    saveRegistrationToLocalStorage(refreshedToken);
}
代码生成两种不同类型的令牌。一个包含152个字符,另一个包含140个字符(已尝试了40-50次以上,生成的令牌包含140或152个字符)。令牌用于使用POST方法的设备到设备推送通知

具有140个字符的令牌-与firebase控制台配合使用,但不是通过设备的POST方法捕获推送通知

具有152个字符的令牌-可与firebase控制台和设备的POST方法配合使用,以捕获推送通知

问题是:

  • 具有140个字符的令牌是否为FCM中的正常令牌?还是不寻常
  • 如果它是正常的,为什么它无法捕获推送通知?(具有152个字符的令牌绝对没有问题)
  • 如果140是一个不寻常大小的代币,我能做什么来产生一个152 每次安装的尺寸
  • 你可以看看我使用的POST方法:

    private class sendPushNotification extends AsyncTask<PushNotificationParams, Void, Void>  {
        @Override
        protected Void doInBackground(PushNotificationParams... params) {
            String device_token = params[0].device_token;
            String notification_body = params[0].notification_body;
            String notification_title = params[0].notification_title;
            String authKey = "AIzaSy.......Xz4";   // FCM AUTH KEY
            String FCMurl = "https://fcm.googleapis.com/fcm/send";
    
            try{
                URL url = new URL(FCMurl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
                conn.setUseCaches(false);
                conn.setDoInput(true);
                conn.setDoOutput(true);
    
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Authorization","key="+authKey);
                conn.setRequestProperty("Content-Type","application/json");
    
                //custom data
                Map<String, String> data = new HashMap<String, String>();
                data.put("data_1",data_1);
                data.put("data_2", data_2);
                data.put("data_3", data_3);
                data.put("title", notifcation_title);   // Notification title
                data.put("body", notification_body); // Notification body
                JSONObject map_data = new JSONObject(data);
                //custom data ends here
    
                JSONObject json = new JSONObject();
                json.put("to", device_token.trim());
                JSONObject info = new JSONObject();
                json.put("data", map_data); 
    
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                wr.write(json.toString());
                wr.flush();
                conn.getInputStream();
    
            } catch (Exception e){
                Log.e("Response","from http push", e);
    
            }
    
            return null;
        }
    }
    
    私有类sendPushNotification扩展了异步任务{
    @凌驾
    受保护的Void doInBackground(PushNotificationParams…params){
    字符串device_token=params[0]。device_token;
    字符串通知正文=参数[0]。通知正文;
    字符串通知标题=参数[0]。通知标题;
    字符串authKey=“AIzaSy…….Xz4”//FCM AUTH KEY
    字符串FCMurl=”https://fcm.googleapis.com/fcm/send";
    试一试{
    URL=新URL(FCMurl);
    HttpURLConnection conn=(HttpURLConnection)url.openConnection();
    conn.SETUSECHACHES(假);
    conn.setDoInput(真);
    连接设置输出(真);
    conn.setRequestMethod(“POST”);
    conn.setRequestProperty(“授权”、“密钥=“+authKey”);
    conn.setRequestProperty(“内容类型”、“应用程序/json”);
    //自定义数据
    映射数据=新的HashMap();
    data.put(“data_1”,data_1);
    data.put(“data_2”,data_2);
    data.put(“data_3”,data_3);
    data.put(“title”,Notification_title);//通知标题
    data.put(“body”,通知体);//通知体
    JSONObject map_data=新JSONObject(数据);
    //自定义数据到此结束
    JSONObject json=新的JSONObject();
    put(“to”,device_token.trim());
    JSONObject info=新的JSONObject();
    json.put(“数据”,map_数据);
    OutputStreamWriter wr=新的OutputStreamWriter(conn.getOutputStream());
    write(json.toString());
    wr.flush();
    conn.getInputStream();
    }捕获(例外e){
    Log.e(“响应”,“来自http推送”,e);
    }
    返回null;
    }
    }
    
    这是一个太长的观察和问题,无法作为评论发布

    我在单个设备上进行了测试,通过清除应用程序数据或调用
    FirebaseInstanceId.getInstance().deleteInstanceId()
    触发了新令牌的获取。收到的令牌始终为152个字符。我注意到令牌的前12个字符是由
    FirebaseInstanceId.getInstance().getId()
    返回的11个字符的实例ID,后跟一个“:”和一个140个字符的字符串。例如:

    Instance ID = dL1lPMbSutI (11 chars)
    Token       = dL1lPMbSutI:APA91xLz52hcPbGg...hhHrh4h_xFr0318k (152 chars total)
    

    当你得到一个140个字符的标记时,它是否有12个字符的前缀实例ID和冒号?

    这是一个观察和问题,太长了,不能作为注释发布

    我在单个设备上进行了测试,通过清除应用程序数据或调用
    FirebaseInstanceId.getInstance().deleteInstanceId()
    触发了新令牌的获取。收到的令牌始终为152个字符。我注意到令牌的前12个字符是由
    FirebaseInstanceId.getInstance().getId()
    返回的11个字符的实例ID,后跟一个“:”和一个140个字符的字符串。例如:

    Instance ID = dL1lPMbSutI (11 chars)
    Token       = dL1lPMbSutI:APA91xLz52hcPbGg...hhHrh4h_xFr0318k (152 chars total)
    

    当您得到一个140个字符的令牌时,它是否有12个字符的前缀,即实例ID和冒号?

    很抱歉,我也无法复制我的问题。此外,不建议根据谷歌关于授权的文档将授权密钥存储在客户端应用程序中


    我建议您使用应用程序服务器进行设备到设备的消息传递,请参阅Firebase文档。

    很抱歉,我无法在我的终端上复制此问题。此外,不建议根据谷歌关于授权的文档将授权密钥存储在客户端应用程序中


    我建议您使用应用服务器进行设备到设备的消息传递,请参阅Firebase文档。

    根据每个人的回答,我假设我的应用中可能有其他服务导致令牌被截断。该应用程序以前配置为解析推送通知。我删除了所有与PPN相关的内容,似乎问题已经解决了

    根据大家的回答,我假设我的应用程序中可能有其他服务导致令牌被截断。该应用程序以前配置为解析推送通知。我删除了所有与PPN相关的内容,似乎问题已经解决了

    你完全正确,伙计!是,有时标记中缺少前11个字符+':'=总共12个字符。就我所观察到的任何设备上都可能发生这种情况。@SudipPodder:我用Firebase libs的9.4.0版进行了测试。你用的是什么版本?检查我的答案。如果你有任何建议,请让我知道。你是对的,伙计!是,有时标记中缺少前11个字符+':'=总共12个字符。就我所观察到的任何设备都可能发生这种情况。@Sudippoder:我用Fir的9.4.0版进行了测试