Android Firebase (FCM)推送接入

官方文档:

向后台应用发送测试消息  |  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就能对固定手机发送消息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用推测解码 (Speculative Decoding) 使 Whisper 实现 2 倍的推理加速

Open AI 推出的 Whisper 是一个通用语音转录模型&#xff0c;在各种基准和音频条件下都取得了非常棒的结果。最新的 large-v3 模型登顶了 OpenASR 排行榜&#xff0c;被评为最佳的开源英语语音转录模型。该模型在 Common Voice 15 数据集的 58 种语言中也展现出了强大的多语言性…

CentOS安装k8s单机/集群及一些命令

目录 前言 1. 安装docker 2. 安装要求 3.准备网络&#xff08;如果只装单机版可跳过此部&#xff09; 4. 准备工作 5. 安装 5.1. 配置阿里云yum k8s源 5.2 安装kubeadm、kubectl和kubelet 5.3 初始化&#xff0c;只在master执行&#xff0c;子节点不要执行 5.3.1 一些…

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

简述&#xff1a;ActiveMQ的fileserver支持写入文件(但是不支持解析jsp),同时也支持移动文件。所以我们只需要先上传到服务器&#xff0c;然后再移动到可以解析的地方即可造成任意文件写入漏洞。我们可以利用这个漏洞来上传webshell或者上传定时任务文件。 漏洞复现 启动环境 …

回归预测 | Matlab基于SO-BiLSTM蛇群算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SO-BiLSTM蛇群算法优…

记录汇川:H5U与Fctory IO测试7

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 辅助出料程序 子程序&#xff1a; 辅助上料 子程序&#xff1a; 自动程序 FB块创建&#xff1a; H5U模块添加&#xff1a; Fctory IO配置&#xff1a; HMI配置 实际动作如下&#xff1a; Fctory IO测试7

JDBC

1 连接JDBC jdbc是连接java和数据库的桥梁&#xff0c;对于不同的数据库&#xff0c;如果我们希望用java连接&#xff0c;我们需要下载不同的驱动。这里我们使用mysql数据库&#xff0c;下载驱动。 MySQL :: Download MySQL Connector/J (Archived Versions) &#xff08;版本…

一卡通水控电控开发踩过的坑

最近在做一个项目&#xff0c;是对接一卡通设备的。我一开始只拿到设备和3个文档开局。不知道从哪下手。一步一步踩坑过来。踩了很多没有必要的坑&#xff0c;写出来给有用的人吧。 读卡器怎么用&#xff1f; 有个读卡器&#xff0c;一开始什么软件也不提供。我都不知道是干嘛…

深信服态势感知一体机SIP-1000 Y2100 3.0.1Y升级3.0.3Y步骤

当前版本&#xff1a;3.0.1Y 升级后版本&#xff1a;3.0.3Y PS&#xff1a;3.0.1Y不能直升3.0.3Y&#xff0c;需要先通过升级工具升级到3.0.2Y&#xff0c;再安装前置补丁从3.0.2Y升级到3.0.3Y&#xff1b;每一次升级时间为20-30分钟&#xff0c;设备升级会重启&#xff0c;需提…

Scrapy框架自学

配置国内镜像源 # pip设置配置 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set trusted-host pypi.tuna.tsinghua.edu.cn创建虚拟环境 # 使用conda创建虚拟环境&#xff08;具体内容请参考课件&#xff09; conda create -n py_s…

树状结构查询 - 华为OD统一考试

OD统一考试 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 通常使用多行的节点、父节点表示一棵树&#xff0c;比如&#xff1a; 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点。 …

Element-ui图片懒加载

核心代码 <el-image src"https://img-blog.csdnimg.cn/direct/2236deb5c315474884599d90a85d761d.png" alt"我是图片" lazy><img slot"error" src"https://img-blog.csdnimg.cn/direct/81bf096a0dff4e5fa58e5f43fd44dcc6.png&quo…

使用paho.mqtt.embedded-c和openssl实现MQTT的单向认证功能

1、背景 由于项目有需求在一个现有的产品上增加MQTT通信的功能&#xff0c;且出于安全考虑&#xff0c;MQTT要走TLS&#xff0c;采用单向认证的方式。 2、方案选择 由于是在现有的产品上新增功能&#xff0c;那么为了减少总的成本&#xff0c;故选择只动应用软件的来实现需求。…

微软Office 2019 批量授权版

软件介绍 微软办公软件套件Microsoft Office 2019 专业增强版2024年1月批量许可版更新推送&#xff01;Office2019正式版2018年10月份推出&#xff0c;主要为多人跨平台办公与团队协作打造。Office2019整合对过去三年在Office365里所有功能&#xff0c;包括对Word、Excel、Pow…

小程序系列--4.协同工作和发布

一、小程序成员管理 1. 成员管理的两个方面 2. 不同项目成员对应的权限 3. 开发者的权限说明 4. 添加项目成员和体验成员 二、小程序的版本 1、小程序的版本 三、发布上线 1. 小程序发布上线的整体步骤 一个小程序的发布上线&#xff0c;一般要经过上传代码 -> 提…

Python: Spire.PDF-for-Python

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/1/11 10:32 # User : geovindu # Product : PyChar…

Unity组件开发--长连接webSocket

1.下载安装UnityWebSocket 插件 https://gitee.com/cambright/UnityWebSocket/ 引入unity项目&#xff1a; 2.定义消息体结构&#xff1a;ExternalMessage和包结构Package&#xff1a; using ProtoBuf; using System; using System.Collections; using System.Collections.Ge…

c++全排列

目录 next_permutation()函数 例 perv_permutation()函数 例 next_permutation()函数 next_pernutation()函数用于生成当前序列的下一个排序。它按照字典序对序列进行重新排序&#xff0c;如果存在下一个排列&#xff0c;则将当前序列更改为下一个排列&#xff0c;并返回t…

LeetCode-657/1275/1041

1.机器人能否返回原点&#xff08;657&#xff09; 题目描述&#xff1a; 在二维平面上&#xff0c;有一个机器人从原点 (0, 0) 开始。给出它的移动顺序&#xff0c;判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串 moves 表示。字符 move[i] 表示其第 …

达梦数据库的归档模式介绍

几种归档模式 归档是实现数据守护系统的重要技术手段&#xff0c;根据功能与实现方式的不同&#xff0c;DM 数据库的归档可以分为 6 类&#xff1a;本地归档、远程归档、实时归档、即时归档、异步归档和同步归档。 其中&#xff0c;本地归档日志的内容与写入时机与数据库模式…

C语言发展史

前言 当前&#xff0c;C语言是大学广泛应用的计算机教学语言之一&#xff0c;除了文科类专业&#xff0c;大部分理工科专业都会教授C语言&#xff0c;但是&#xff0c;C语言是谁搞出来的&#xff1f;是怎么编译的?相信很多同学对此并不清楚&#xff0c;今天&#xff0c;我们就…