Android个推需要的权限,Android 推送实现-接入个推(GTPush)
自己使用过的推送服务:极光推送(Jpush)、友盟推送、个推、阿里推送,其他的目前还没用用过,但使用起来应该都是比较类似的吧!
本文将简单介绍下这次个推推送的接入流程,及相关的注意事项(个推开通厂商通道需要单独联系客服,开通VIP,然后个推的技术就会和你对接)。
1.配置 Maven 库地址:
项目根目录下build.gradle
buildscript {
repositories {
jcenter()
google()
}
dependencies {
......
}
}
allprojects {
repositories {
jcenter()
google()
maven {
url "http://mvn.gt.getui.com/nexus/content/repositories/releases/"
}
}
}
2.NDK过滤:
app根目录下build.gradle
android {
defaultConfig {
ndk {
// 添加项目所需 CPU 类型的最小集
abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
}
}
}
3.参数配置:
app根目录下build.gradle
android {
defaultConfig {
manifestPlaceholders = [
//个推应用参数,请填写您申请的 GETUI_APP_ID,GETUI_APP_KEY,GETUI_APP_SECRET 值
GETUI_APP_ID : "",
GETUI_APP_KEY : "",
GETUI_APP_SECRET: "",
GETUI_APPID : "",
//厂商参数配置,在各个厂商开放平台认证、申请推送引用,查看对应的配置信息,开通推送服务
XIAOMI_APP_ID : "",
XIAOMI_APP_KEY : "",
MEIZU_APP_ID : "",
MEIZU_APP_KEY : "",
HUAWEI_APP_ID : "",
OPPO_APP_KEY : "",
OPPO_APP_SECRET : "",
VIVO_APP_ID : "",
VIVO_APP_KEY : "",
]
}
}
4.添加依赖:
// 个推SDK 3.0 的主包
implementation 'com.getui:gtsdk:3.0.2.0'
//支持的厂商包
implementation 'com.huawei.hms:push:4.0.2.300'
implementation 'com.getui.opt:hwp:3.0.1'
implementation 'com.getui.opt:xmp:3.0.1'
implementation 'com.getui.opt:mzp:3.0.1'
implementation 'com.assist-v3:vivo:3.0.1'
implementation 'com.assist-v3:oppo:3.0.1'
5.权限添加:
6.配置推送服务(个人理解:该服务是用于创建对应的服务进程):
1.自定义Service集成自PushService :
package 你的包名.service;
// 仅 2.13.1.0 及以上版本才能直接 extends PushService,低于此版本请延用之前实现方式
public class YouPushService extends com.igexin.sdk.PushService {
}
2.在 AndroidManifest.xml 中添加上述自定义 Service,(使用 maven 集成,android:process 属性必须为 pushservice。手动集成方式也请保证与其他组件进程名一致,建议复制本文档的默认配置即可),如下:
android:name="你的包名.YouPushService"
android:exported="true"
android:label="PushService"
android:process=":pushservice"/>
7.配置接受推送事件服务(该服务使用于接受推送事件的):
1.添加一个继承自 com.igexin.sdk.GTIntentService 的类,用于接收 CID、透传消息以及其他推送服务事件。请参考下列代码实现各个事件回调方法:
package 你的包名.service;
import android.content.Context;
import android.os.Message;
import com.blankj.utilcode.util.LogUtils;
import com.igexin.sdk.PushManager;
import com.igexin.sdk.message.GTCmdMessage;
import com.igexin.sdk.message.GTNotificationMessage;
import com.igexin.sdk.message.GTTransmitMessage;
/**
* Des: 继承 GTIntentService 接收来自个推的消息,所有消息在线程中回调,如果注册了该服务,则务必要在 AndroidManifest 中声明,否则无法接受消息
* Created by kele on 2020/9/21.
* E-mail:984127585@qq.com
*/
public class GTIntentService extends com.igexin.sdk.GTIntentService {
private static final String TAG = GTIntentService.class.getSimpleName();
@Override
public void onReceiveServicePid(Context context, int i) {
}
// 接收 cid
@Override
public void onReceiveClientId(Context context, String s) {
LogUtils.d(TAG, "onReceiveClientId=" + s);
}
// 处理透传消息
@Override
public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
String appid = msg.getAppid();
String taskid = msg.getTaskId();
String messageid = msg.getMessageId();
byte[] payload = msg.getPayload();
String pkg = msg.getPkgName();
String cid = msg.getClientId();
// 第三方回执调用接口,actionid范围为90000-90999,可根据业务场景执行
boolean result = PushManager.getInstance().sendFeedbackMessage(context, taskid, messageid, 90001);
LogUtils.d(TAG, "call sendFeedbackMessage = " + (result ? "success" : "failed"));
LogUtils.d(TAG, "onReceiveMessageData -> " + "appid = " + appid + "\ntaskid = " + taskid + "\nmessageid = " + messageid + "\npkg = " + pkg
+ "\ncid = " + cid);
if (payload == null) {
LogUtils.e(TAG, "receiver payload = null");
} else {
String data = new String(payload);
LogUtils.d(TAG, "receiver payload = " + data);
}
}
// cid 离线上线通知
@Override
public void onReceiveOnlineState(Context context, boolean b) {
LogUtils.d(TAG, "onReceiveOnlineState=" + b);
}
// 各种事件处理回执
@Override
public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) {
LogUtils.d(TAG, "gtCmdMessage=" + gtCmdMessage.toString());
}
// 通知到达,只有个推通道下发的通知会回调此方法
@Override
public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d(TAG, "onNotificationMessageArrived=" + gtNotificationMessage.getContent().toString());
}
// 通知点击,只有个推通道下发的通知会回调此方法
@Override
public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d(TAG, "onNotificationMessageClicked=" + gtNotificationMessage.getContent().toString());
}
}
2.在 AndroidManifest.xml 中配置上述 IntentService 类,如下:
android:name="你的包名.GTIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
8.设置通知图标:
1.图标位置:
|- app/
| |- src/
| |- main/
| |- res/
| |- drawable-xhdpi
| |- push.png
| |- push_small.png
| |- drawable-xxhdpi
| |- push.png
| |- push_small.png
push_small.png 会展示在顶部状态栏和通知左上角位置,push_small 只能内置, 不能修改。push.png 将会作为通知展示图标,请务必确认您放置的图标内容无误。
2.建议尺寸:
//push.png 图片尺寸
xhdpi: 128*128
xxhdpi: 192*192
//push_small.png 图片尺寸
xhdpi: 48*48
xxhdpi: 72*72
另外,push_small.png 设计规范有以下四个注意要点:1. 必须是带 Alpha 透明通道的 PNG 图片。 2.背景必须是透明的。 3.图形必须是白色。 4. 周围不宜留过多的 padding。
9.添加混淆配置:
如果您的工程启用了 Proguard 混淆,即如果在app/build.gradle的android.buildTypes.release下配置了minifyEnabled true,为了避免个推 SDK 被错误混淆导致功能异常,需要在app/proguard-rules.pro混淆配置文件中添加如下配置:
#个推
-dontwarn com.igexin.**
-keep class com.igexin.** { *; }
10.资源精简配置:
如果您的工程启用了资源精简,即如果在 app/build.gradle 的 android.buildTypes.release 下配置了 shrinkResources true,为了避免个推 SDK 所需资源被错误精简导致功能异常,需要在项目资源目录 res/raw 中添加 keep.xml 文件,并在 keep.xml 文件中使用 tools:keep 定义哪些资源需要被保留(资源之间用“,”隔开),如 tools:keep="@drawable/push,@drawable/push_small,...,",此处 @drawable/push、@drawable/push_small 通知图标的名称应为您当前放着于应用中的图标名称,如下:
tools:keep="@drawable/push,@drawable/push_small" />
11.初始化:
1.代码初始化:
//分别在Application和Main中初始化一次
PushManager.getInstance().initialize(this);
2.开启日志:
if (BaseConfig.Log.isDebug) {
//切勿在 release 版本上开启调试日志
PushManager.getInstance().setDebugLogger(this, new IUserLoggerInterface() {
@Override
public void log(String s) {
LogUtils.i("PUSH_LOG", s);
}
});
}
12.校验初始化:
1.过滤个推日志:GT-PUSH,如果看到 Login successed with cid = xxx 日志输出,则说明 SDK 初始化成功。
2.在个推后台进行消息推送,验证集成情况。
13.关于厂商通道:
经过上面的步骤,推送基本接入完成,开通了厂商通道的有需要设置回调地址的按照个推技术给你的文档在各平台填写对应的回调地址,以及给个推你们的回调地址即可。
华为通道:
1.需要在华为后台中 我的项目-应用 下载 agconnect-services.json文件,放app根目录下;
2.在app的buil.gradle中添加如下代码:
// 在配置华为agconnect-services.json后将下面注释打开
apply plugin: 'com.huawei.agconnect'
个推后台开通了厂商通道的配置图.png
参考文档:
Android个推需要的权限,Android 推送实现-接入个推(GTPush)相关推荐
- android 监听锁屏 权限,Android中监听锁屏变化和防止锁屏
Android app中可能存在某些可视化耗时操作,需要防止锁屏. 一.监听锁屏 添加权限 首先来看如何监听锁屏,使用BroadcastReceivercaset来监听 1.锁屏监听 public c ...
- android自动申请悬浮窗权限,Android 悬浮窗--无需权限
image.png 无需一切权限,不受各种国产ROM限制,默认可以显示的应用内悬浮窗. 应用内显示,无需申请任何权限 应用内显示,所有机型都可以默认显示悬浮窗,无需引导用户做更多设置 支持拖拽 超出屏 ...
- android动态申请悬浮框权限,Android创建悬浮窗的完整步骤
在Android中想要创建悬浮窗分为三步 1.申请权限 2.使用服务启动悬浮窗 3.设置悬浮窗参数并添加进WindowManager 下面话不多说了,来一起看看详细的实现过程 申请权限 首先需要申请悬 ...
- android动态申请悬浮框权限,Android动态权限申请工具(包括悬浮窗)
为了保证APP正常运行,动态权限申请是android比较常用的功能,由于每次都需要做申请.等待返回还有拒绝反馈等操作,比较麻烦,所以集成了一个比较简单的动态权限申请库 集成方法: Step 1. Ad ...
- android动态申请悬浮框权限,Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限...
原因 在某些机型上居然后出现permission denied for window type 2038错误: E/AndroidRuntime: FATAL EXCEPTION: main Proc ...
- android 获取已安装列表权限,Android 如何完整的获取到用户已安装应用列表
接到产品经理的预研需求,说希望获取用户已安装应用列表.这个问题应该不难,只要是要把相关的知识点整理和验证一下. 对于获取用户已安装应用列表,我个人是很熟悉的,因为我的华为手机上,手机管家天天会在通知栏 ...
- android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...
最近想实现一个打卡的功能,想到可以利用百度地图的SDK.网上有很多关于百度地图SDK定位.地图功能应用的demo,这部分倒不是很困难.但网上很多博客写的内容一般都着重于代码部分,很多下载配置和编译器设 ...
- android代码开启悬浮窗权限,Android 悬浮窗权限校验(示例代码)
悬浮窗权限: 权限检验和请求: //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会 if (Build.VERSION.SDK_INT >= Build.VERSI ...
- 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
文章目录 一.Android 逆向中使用的 android.permission 权限 二.Android 系统中的 Linux 用户权限 一.Android 逆向中使用的 android.permi ...
最新文章
- 大型网站架构系列:缓存在分布式系统中的应用(二)
- Spring.Net学习
- PCM设备在电网系统中的应用介绍
- lcc-win32使用指南
- 高级service之ipc ADIL用法
- 《十天学会单片机和C语言编程》
- java需要最大正数_Java输出double类型中的最小正数和最大正数
- 常用国家标准、行业标准、地方标准免费查阅网址,太实用了!
- win7触摸板怎么关闭_笔记本电脑触摸板快速关闭,避免误碰影响操作
- cat环境搭建及springboot项目接入
- Android studio 之 Kotlin Not Configured
- 计算机网络面试题汇总
- Tableau豆瓣电影数据项目实战练习3
- webservice安全验证
- 程序员必备英语单词清单
- linux使用tmux后台运行程序
- MDWechat(微信美化)
- 统计学发展过程中有哪些主要学派?其学术观点是什么?主要代表人物及其对统计学的贡献有哪些?
- os.path.dirname(os.path.realpath(__file__))
- ArcEngine实现色带下拉框
热门文章
- mac m1配置frpc内网穿透
- [MFC]对CString::GetBufferSetLength方法的探究,需要ReleaseBuffer,GetLength才正确!
- Sublime Text3不需破解,另类好方法在此
- RV1126 在Ubuntu18.04开发环境搭建与SDK编译
- esper java_Esper学习笔记二:进程模型
- java 计算器 小程序_java 学习 ——计算器小程序
- ffmpeg Nvidia硬件加速总结
- 关于SteamVR初始化失败:连接头显时提示,请设置头戴式显示器以延伸而非映射的解决方法
- java里面序列化作用_java中序列化的作用
- 基于Transformer实现100项体育运动分类