如何在 android 中使用 FCM 向单个设备发送数据消息
How to send data messages to single device using FCM in android
我是 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 工作室右侧的 FCM window 中的描述正确地扩展了 FirebaseInstanceIdService
和 FirebaseMessagingService
的服务。
告诉我如何解决这些错误或使用 FCM 向单个设备发送消息的其他方法。
此外,是否有可能是因为我的应用程序中的 firebase 运行 版本较早,导致 InstanceResultId
class 无法导入?
我尝试升级版本,但它再次显示了一堆错误,所以我只保留了 11.0.4
。
这是应用程序文件夹中的 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'
要向特定设备发送推送通知,您的后端服务器需要存储设备令牌并向该令牌发送通知。
您可以检索当前设备令牌并发送到服务器,如下所示。
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 控制台将通知直接发送到特定设备,因为它没有 UI 控件。不过你可以用postman来测试一下。
更新:我解决了这个问题。我将 android studio 更新到它的最新版本,并且 gradle 和所有其他东西都更新了,并且添加了最新的 firebase 版本依赖项,代码工作得很好。
我是 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 工作室右侧的 FCM window 中的描述正确地扩展了 FirebaseInstanceIdService
和 FirebaseMessagingService
的服务。
告诉我如何解决这些错误或使用 FCM 向单个设备发送消息的其他方法。
此外,是否有可能是因为我的应用程序中的 firebase 运行 版本较早,导致 InstanceResultId
class 无法导入?
我尝试升级版本,但它再次显示了一堆错误,所以我只保留了 11.0.4
。
这是应用程序文件夹中的 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'
要向特定设备发送推送通知,您的后端服务器需要存储设备令牌并向该令牌发送通知。
您可以检索当前设备令牌并发送到服务器,如下所示。
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 控制台将通知直接发送到特定设备,因为它没有 UI 控件。不过你可以用postman来测试一下。
更新:我解决了这个问题。我将 android studio 更新到它的最新版本,并且 gradle 和所有其他东西都更新了,并且添加了最新的 firebase 版本依赖项,代码工作得很好。