如何在 Android 应用中通过 FCM 向指定设备发送推送通知

来源:IPIPP.com作者:香港程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何在 Android 应用中通过 FCM 向指定设备发送推送通知》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在 Android 应用中通过 FCM 向指定设备发送推送通知》有用,将其分享出去将是对创作者最好的鼓励。

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

如何在 Android 应用中通过 FCM 向指定设备发送推送通知

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。