在Android应用开发中,通过FCM向指定设备发送推送通知,需要完成Firebase项目配置、Android端集成、设备令牌获取、服务端请求发送等多个环节,每个环节都有对应的操作规范。

FCM基础概念与前期准备
FCM即Firebase Cloud Messaging,是谷歌提供的免费跨平台消息推送服务,支持向Android、iOS、Web等平台的应用发送通知和数据消息。要向指定设备发送通知,核心是通过设备的唯一令牌(Token)来定位目标设备。
前期需要准备的内容包括:一个谷歌账号、一个Firebase项目、一台可以运行Android应用的测试设备或者模拟器。
Firebase项目配置步骤
创建Firebase项目
首先进入Firebase控制台,点击创建项目,按照提示填写项目名称,选择是否启用谷歌分析,完成项目创建。
添加Android应用
进入创建好的项目,点击添加应用,选择Android平台,填写应用的包名,下载对应的google-services.json配置文件,将该文件放到Android项目的app模块根目录下。
Android端集成FCM SDK
配置项目级build.gradle
在项目根目录的build.gradle文件中添加谷歌服务插件依赖:
buildscript {
dependencies {
// 添加谷歌服务插件
classpath 'com.google.gms:google-services:4.3.15'
}
}
配置应用级build.gradle
在app模块的build.gradle文件顶部添加插件声明,同时添加FCM依赖:
// 顶部添加插件
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
dependencies {
// 添加FCM依赖
implementation platform('com.google.firebase:firebase-bom:32.3.1')
implementation 'com.google.firebase:firebase-messaging'
}
创建消息服务类
创建继承自FirebaseMessagingService的服务类,用于接收和处理推送消息,同时重写onNewToken方法获取设备令牌:
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import android.util.Log;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "FCMService";
// 收到新令牌时回调
@Override
public void onNewToken(String token) {
super.onNewToken(token);
Log.d(TAG, "设备令牌:" + token);
// 这里需要将token上传到自己的服务端保存,用于后续指定设备推送
uploadTokenToServer(token);
}
// 收到推送消息时回调
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
// 处理通知消息
if (remoteMessage.getNotification() != null) {
String title = remoteMessage.getNotification().getTitle();
String body = remoteMessage.getNotification().getBody();
Log.d(TAG, "收到通知,标题:" + title + ",内容:" + body);
// 这里可以自定义通知展示逻辑
}
// 处理数据消息
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "收到数据消息:" + remoteMessage.getData());
}
}
// 上传token到服务端的示例方法
private void uploadTokenToServer(String token) {
// 实际开发中这里调用自己的服务端接口,将token和用户账号绑定存储
}
}
声明服务与权限
在AndroidManifest.xml文件中添加网络权限、声明消息服务:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
获取指定设备的FCM令牌
除了在onNewToken回调中获取令牌,也可以在应用启动时主动获取令牌,示例代码如下:
import com.google.firebase.messaging.FirebaseMessaging;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 主动获取设备FCM令牌
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(task -> {
if (!task.isSuccessful()) {
Log.w("FCM", "获取令牌失败", task.getException());
return;
}
// 获取令牌成功
String token = task.getResult();
Log.d("FCM", "设备令牌:" + token);
// 将令牌上传到服务端保存
});
}
}
获取到令牌后,需要将其与应用的用户账号绑定,存储到自己的业务服务端,后续发送指定设备通知时,服务端就可以根据目标用户的账号查询对应的FCM令牌。
服务端发送指定设备推送通知
服务端发送FCM通知需要调用FCM的HTTP接口,首先需要获取服务账号的私钥文件:进入Firebase项目设置,选择服务账号,生成新的私钥,下载JSON格式的私钥文件。
Java服务端示例代码
以下是使用Java编写的服务端发送指定设备通知的示例:
import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.messaging.FirebaseMessaging;
import com.google.firebase.messaging.Message;
import com.google.firebase.messaging.Notification;
import java.io.FileInputStream;
import java.util.Arrays;
public class FcmSender {
public static void main(String[] args) {
try {
// 初始化Firebase应用,传入私钥文件路径
FileInputStream serviceAccount = new FileInputStream("path/to/your-service-account-key.json");
FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.build();
FirebaseApp.initializeApp(options);
// 目标设备的FCM令牌,实际开发中从数据库查询获取
String targetToken = "目标设备的FCM令牌";
// 构建通知内容
Notification notification = Notification.builder()
.setTitle("测试通知")
.setBody("这是发送给指定设备的推送通知")
.build();
// 构建消息对象,指定目标令牌
Message message = Message.builder()
.setNotification(notification)
.putData("key1", "value1") // 可以添加自定义数据
.putData("key2", "value2")
.setToken(targetToken)
.build();
// 发送消息
String response = FirebaseMessaging.getInstance().send(message);
System.out.println("消息发送成功,响应ID:" + response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
HTTP接口直接调用示例
如果不想依赖Firebase SDK,也可以直接调用FCM的HTTP v1接口,请求示例如下:
// 请求地址:https://fcm.googleapis.com/v1/projects/你的项目ID/messages:send
// 请求头需要携带Bearer令牌,通过服务账号生成
{
"message": {
"token": "目标设备的FCM令牌",
"notification": {
"title": "测试通知",
"body": "这是发送给指定设备的推送通知"
},
"data": {
"key1": "value1",
"key2": "value2"
}
}
}
常见问题排查
- 如果收不到通知,首先检查
google-services.json文件是否正确,包名是否和应用包名一致 - 确认设备网络正常,能够访问谷歌服务,国内设备可能需要特殊网络环境
- 检查服务端发送的令牌是否正确,令牌是否过期,FCM令牌在应用卸载重装后会更新
- 查看Android端的
onMessageReceived回调是否触发,区分通知消息和数据消息的处理逻辑
注意事项
不要在客户端硬编码FCM服务端私钥,私钥需要放在自己的业务服务端,避免泄露导致安全风险。同时设备令牌属于用户隐私数据,存储和传输过程需要做好加密处理。
如果应用需要向多个指定设备发送通知,可以将多个令牌放在请求中,或者使用FCM的主题订阅功能,根据业务场景选择合适的推送方式。
FCMAndroid推送指定设备推送Firebase_Cloud_Messaging修改时间:2026-07-16 05:45:36