温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - How to send data messages to single device using FCM in android

java - 如何在Android中使用FCM将数据消息发送到单个设备

发布于 2020-03-28 23:36:24

我是新手,Firebase cloud messaging想将包含数据的消息或通知发送到单个设备。我已将通知发送到所有设备,但无法弄清楚如何将其发送到单个目标设备。我浏览了许多网站和教程,但没有运气。

在我遵循的一个教程中,我在我的代码中编写了以下代码

MainActivity.java:

package in.w3dev.fcm2;

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

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

     FirebaseInstanceId.getInstance().getInstanceId()
            .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                @Override
                public void onComplete(@NonNull Task<InstanceIdResult> task) {
                    if (!task.isSuccessful()) {
                        return;
                    }

                    String token = task.getResult().getToken();
                    String msg = getString(R.string.fcm_token, token);
                    Log.d(TAG, msg);

                }
            });

    }
}

但事实证明error : can't resolve symbol getInstanceId(), InstanceResultId粗体字的所有内容由于某种原因都无法解决。我已经按照android studio右侧FCM窗口中的说明进行了扩展FirebaseInstanceIdServiceFirebaseMessagingService正确的服务告诉我如何解决这些错误,或使用FCM将消息发送到单个设备的另一种方法。

另外,是否可能InstanceResultId由于我的应用程序中运行的Firebase的早期版本而无法导入类?

我尝试升级该版本,但再次显示了很多错误,因此我将其保留为11.0.4仅。

这是app文件夹中的Gradle文件:

apply plugin: 'com.android.application'

android {

    compileSdkVersion 26

    defaultConfig {
        applicationId "in.w3dev.fcm2"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {

        release {

            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.google.firebase:firebase-messaging:20.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'com.squareup.okhttp3:okhttp:3.10.0'


}


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

查看更多

查看更多

提问者
Varsha Vaidywan
被浏览
84
Chan Myae Aung 2020-01-31 18:48

要将推送通知发送到特定设备,后端服务器需要存储设备令牌并将通知发送到该令牌。

您可以检索当前设备令牌并将其发送到服务器,如下所示。

FirebaseInstanceId.getInstance().getInstanceId()
    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                return;
            }

            // Get new Instance ID token and send to server
            String token = task.getResult().getToken();
            sendTokenToServer(token);
        }
    });

然后,您的服务器将使用该令牌向该设备发送推送通知。

请记住,您不能使用Firebase控制台将Noti直接发送到特定设备,因为它没有UI控制。但是您可以使用 Postman 进行测试。