Android Firebase (FCM)推送接入

news2025/1/8 6:03:27

官方文档:

向后台应用发送测试消息  |  Firebase Cloud Messaging

1、根级(项目级)Gradlegradle的dependencies中添加:

    dependencies {
      ...

      // Add the dependency for the Google services Gradle plugin
      classpath 'com.google.gms:google-services:4.3.10'
    }

2、模块(应用级)Gradle 中添加 Google 服务插件:

plugins {
    id 'com.android.application'

    // Add the Google services Gradle plugin
    id 'com.google.gms.google-services'
    ...
}
或者
apply {
     plugin 'com.android.application'

    // Add the Google services Gradle plugin
     plugin "com.google.gms.google-services"
}

添加 Firebase Cloud Messaging Android 库的依赖项:(按官方的应该也是可以的)

    implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    implementation("com.google.firebase:firebase-analytics-ktx")
//    implementation("com.google.firebase:firebase-auth-ktx")
    implementation("com.google.firebase:firebase-firestore-ktx")
    implementation("com.google.firebase:firebase-messaging")
    // Firebase Cloud Messaging (Kotlin)
    implementation("com.google.firebase:firebase-messaging-ktx")

3、消息接收

AndroidManifest.xml中添加,接受类

        <service
            android:name=".BillionFirebaseMessagingService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;

import com.game.base.sdk.BaseSDK;
import com.game.base.sdk.Events;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.google.gson.Gson;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.Locale;
import java.util.Map;
import java.util.jar.JarException;
import java.lang.Boolean;

import game.billion.block.blast.bbb.MainActivity;
import game.billion.block.blast.bbb.R;
import kotlin.Pair;

public class BillionFirebaseMessagingService extends FirebaseMessagingService {
    private String channelID = "game.puzzle.block.billion.pro.notification";
    private String channelName = "messageName";
    int notifyID = 101010;

    //监控令牌的生成
    @Override
    public void onNewToken(@NonNull String token) {
        super.onNewToken(token);
        
        Log.d("BillionFirebaseMessagingService", "onNewToken:"+token);
    }

    //监控推送的消息
    @Override
    public void onMessageReceived(@NonNull RemoteMessage mge) {
        super.onMessageReceived(mge);

        Log.d("BillionFirebaseMessagingService", "From:"+mge.getFrom());
        Log.d("BillionFirebaseMessagingService", "data:"+mge.getData());
        Map<String,String> dt = mge.getData();

        String ti =dt.get("title");           //标题(多语言),JSON字符串
        try {
            if (ti != null && !ti.isEmpty())
            {
                JSONObject json =new JSONObject(ti);
                String language = Locale.getDefault().getLanguage();
                if (language=="pt")
                {
                    //获取巴西语
                    String resTitle = json.getString("pt");
                    if (resTitle != null && !resTitle.isEmpty())
                    {
                        //显示通知
                        addNotification(resTitle);
                    }
                }else {
                    String resTitle = json.getString("en");
                    if (resTitle != null && !resTitle.isEmpty())
                    {
                        //显示通知
                        addNotification(resTitle);
                    }
                }
            }
        } catch (JSONException e) {

        }

        String mgeId = mge.getMessageId();
        String intent =dt.get("intent");
        String strId =dt.get("sid");

        Pair<String, String>[] params = new Pair[3];
        params[0] = new Pair<>("message_id", mgeId);
        params[1] = new Pair<>("type", intent);
        params[2] = new Pair<>("sid", strId);
        Events.push("100410", params);
    }

    //添加提示
    private  void addNotification(String resTitle )
    {
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
            NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);

            NotificationChannel nc=newNotificationChannel(channelID, channelName);
            if (nc!=null)
            {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    managerCompat.createNotificationChannel(nc);
                }
            }

            Intent nfIntent = new Intent(this, MainActivity.class);

            PendingIntent pendingIntent ;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                pendingIntent=PendingIntent.getActivity(this, 0, nfIntent, PendingIntent.FLAG_IMMUTABLE);
            } else {
                pendingIntent=PendingIntent.getActivity(this, 0, nfIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
            }

            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID);
            builder.setContentIntent(pendingIntent); // 设置PendingIntent
            builder.setSmallIcon(R.drawable.notification); // 设置状态栏内的小图标
            builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
            builder.setStyle(new NotificationCompat.BigTextStyle());
            builder.setContentTitle(getString(R.string.app_name));
            builder.setContentText(resTitle);
            builder.setWhen(System.currentTimeMillis());
            builder.setAutoCancel(true);

            managerCompat.notify(notifyID, builder.build());
        }
    }
    private NotificationChannel newNotificationChannel(String cId, String cName)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel =new  NotificationChannel(cId, channelName, NotificationManager.IMPORTANCE_HIGH);
            channel.setSound(null, null);
            channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            return channel;
        }

        return null;
    }
}

4、测试(google-services.json 记得放应用级中)

a、获取tokn

 //在firebase中检查google版本是否有问题
        GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(this).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d("Firebase", "onComplete: Play services OKAY");
                    //firebase 推送 (FCM)获取token(FCM令牌)
                    FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
                        @Override
                        public void onComplete(@NonNull Task<String> task) {
                            if (!task.isSuccessful())
                            {
                                Log.w("Firebase", "Fetching FCM registration token failed", task.getException());
                                return;
                            }
                            // Get new FCM registration token
                            String ss= task.getResult();
                            Log.d("Firebase", "onComplete:token getResult "+ss);
                        }
                    });

                } else {
                    // Show the user some UI explaining that the needed version
                    // of Play services Could not be installed and the app can't run.
                }
            }
        });

b、用tokn就能对固定手机发送消息

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1373783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

open3d相关操作总结

open3d其实有很多交互式命令&#xff0c;在运行程序打开了open3d渲染的窗口后&#xff0c;鼠标点击窗口&#xff0c;按H就会弹出&#xff0c;交互命令的帮助&#xff0c;如下图所示&#xff1a; 其中比较常用的有&#xff1a; Q &#xff1a;退出当前窗口 H&#xff1a;打印帮…

CAN与CAN FD通信之间存在的问题

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 目录 1、通讯速率和数据长度不同的问题 2、非ISO CAN FD与ISO CAN FD设备的通讯问题 3、多设备切换的通…

PHP企业物资管理系统源码带文字安装教程

PHP企业物资管理系统源码带文字安装教程 技术架构 主要框架 : PHP7.0 laravel5.4  mysql5.5.36 composer1.3.2(依赖管理) 前端 : jquery bootstrap jstree&#xff08;树形结构&#xff09; echart&#xff08;图表&#xff09; layer&#xff08;弹出层&#xff09; 企…

参数小,性能强!开源多模态模型—TinyGPT-V

安徽工程大学、南洋理工大学和理海大学的研究人员开源了多模态大模型——TinyGPT-V。 TinyGPT-V以微软开源的Phi-2作为基础大语言模型&#xff0c;同时使用了视觉模型EVA实现多模态能力。尽管TinyGPT-V只有28亿参数&#xff0c;但其性能可以媲美上百亿参数的模型。 此外&…

TDengine 签约西电电力

近年来&#xff0c;随着云计算和物联网技术的迅猛发展&#xff0c;传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上&#xff0c;电力行业构建了信息网络、通信网络和能源网络&#xff0c;致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

企业办公终端文件数据\资料防泄密软件系统 | 自动智能透明加密保护核心文件,防止外泄

文档加密/数据安全 天锐绿盾是一款终端文件数据防泄密软件系统&#xff0c;采用自动智能透明加密技术&#xff0c;可以保护核心文件不被外泄。该软件通过对终端文件的加密处理&#xff0c;使得文件只能在经过授权的计算机上正常显示和使用&#xff0c;一旦离开授权范围&#x…

three.js : tweenjs创建threejs动画

效果&#xff1a; 代码 <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div> <div class"box-right"><…

在本地服务器发送邮件不可以,生产环境下跑可以

公司一般会给一个smtp-xxxx.com mail:host: smtp-xxxx.comport: 25properties:mail:smtp:starttls:enable: falsedebug: true然后你会使用堡垒机映射ip 会发现在本地邮件根本不会发出去,只能拿到虚拟机上跑 解决方案 我们需要把smtp-xxxx.com,改成对应的ip地址,只需要把smtp…

JavaScript中7种常见删除数组中指定元素的方法(含代码)

在JavaScript中&#xff0c;有多种方法可以从数组中删除指定的元素。以下是几种常见的方法&#xff1a; 1. 使用 splice() 方法 splice() 方法可以同时从数组中删除和添加元素。如果只提供了两个参数&#xff0c;那么它只会删除元素。 let arr [1, 2, 3, 4, 5]; let ind…

直播预告丨看零售场,如何玩转 MaaS

今年&#xff0c;有一个被频繁提及的词是MaaS 这类工具正在帮助千行百业实现大模型落地产业 在零售场&#xff0c;特别是像京东这样拥有超高并发、超复杂协同的电商场内 也沉淀出了一套通用的AI基础设施——九数算法中台 从提升客户服务体验、平台效率出发&#xff0c;训练各…

JS逆向实战案例2——某房地产token RSA加密

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、 反爬分析 url1&#xff1a;aHR0cDovL3pmY2ouZ3ouZ292LmNuL3pmY2ovZnl4eC94a2I/c1Byb2plY3RJZD05MzBlMDQ0MmJjNjA0MTBkYTgzNzQ0MmQ…

频率阈图像滤波

介绍 频率阈图像滤波是一种在频域中进行图像处理的方法&#xff0c;它基于图像的频率分布来实现滤波效果。具体步骤如下&#xff1a; 将原始图像转换到频域&#xff1a;使用快速傅里叶变换&#xff08;FFT&#xff09;将图像从空间域转换到频域。对频域图像应用频率阈滤波器&a…

Tensorflow Lite从入门到精通

TensorFlow Lite 是 TensorFlow 在移动和 IoT 等边缘设备端的解决方案&#xff0c;提供了 Java、Python 和 C API 库&#xff0c;可以运行在 Android、iOS 和 Raspberry Pi 等设备上。目前 TFLite 只提供了推理功能&#xff0c;在服务器端进行训练后&#xff0c;经过如下简单处…

斯坦福Mobile ALOHA提到的ACT之外的另两项技术:Diffusion Policy、VINN

前言 本文接上一篇文章《斯坦福机器人Mobile ALOHA的关键技术&#xff1a;动作分块ACT的算法原理与代码剖析》而来&#xff0c;当然最开始本文是作为上一篇文章的第二、第三部分的 但因为ACT太过关键&#xff0c;除了在上一篇文章中写清楚其算法原理之外&#xff0c;还得再剖…

Java研学-三层架构实现简单登录操作

一 登录流程 将服务器资源给有权限的人访问&#xff0c;只有登录的管理员可以访问员工信息进行 CRUD 二 三层架构 Web 开发中的最佳实践&#xff1a;分层开发模式将整个业务应用划分为&#xff1a;表现层、业务逻辑层、数据访问层。区分层次的目的即为了“高内聚低耦合”的思想…

2023启示录 | 商业航天这一年

图片&#xff5c;SpaceX ©⾃象限原创 作者丨罗辑 编辑丨程心 整个2023年&#xff0c;在全球热度上能够和ChatGPT一争高下的&#xff0c;可能只有SpaceX的两次星舰发射。 就像2023年菜市场卖鱼的大爷都能聊两句大模型一样&#xff0c;即使从来不关心航天的人也会知道星舰…

话题浏览暴涨558%!从DIY到爆改,小红书数据洞察用户关注焦点

最近走红的“爆改”你们听说了吗&#xff1f;各大社媒平台明星爆改、素人爆改&#xff0c;频上热门。改造风流行的小红书&#xff0c;热度更盛&#xff0c;从DIY到爆改&#xff0c;用户关注焦点是什么&#xff1f;博主和品牌如何讲述“改造”&#xff1f;通过数据分析&#xff…

transbigdata笔记:数据预处理

0 数据 使用 transbigdata/docs/source/gallery/data/TaxiData-Sample.csv at main ni1o1/transbigdata (github.com) 和transbigdata/docs/source/gallery/data/sz.json at main ni1o1/transbigdata (github.com) 0.1 导入库 import transbigdata as tbd import pandas …

Hello,World!

“Hello, world”的由来可以追溯到 The C Programming Language 。在这门编程语言中&#xff0c;它被用作第一个演示程序&#xff0c;向人们展示了在计算机屏幕上输出“Hello world”这行字符串的计算机程序。由于这个演示程序的简洁性和直观性&#xff0c;它成为了许多初学者学…

傅昌林:百万级数据挑战的大师,NineData编程大赛的卓越表现

数据库编程大赛&#xff1a;一条SQL计算扑克牌24点 参赛选手&#xff1a;傅昌林 个人简介&#xff1a;HBI Solutions, Inc, VP Engineering 参赛数据库&#xff1a;SQL Server 性能评测&#xff1a;百万级数据代码性能评测 11.45秒 综合得分&#xff1a;78.8 以下是傅昌林…