安卓极光推送与分享【包括Tag和Alias的设置】
来源:互联网 发布:淘宝欧舒丹是正品吗 编辑:程序博客网 时间:2024/06/06 02:37
STEP1:效果图
STEP2:极光官网注册账号
https://www.jiguang.cn/accounts/platform
1.进入个人中心 2.创建应用 3.点击应用右下角设置,再点推送设置
4.
这里包名一定要对应上,官方也提供了一个Demo[然而并没有什么…] 点击确认后即可生成一个APPkey 代码里要用到
STEP3:配置AndroidManifest.xml
1.权限
<!-- Required --> <uses-permission android:name="自己的包名.permission.JPUSH_MESSAGE"/> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <!-- Optional. Required for location feature --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.GET_TASKS"/>
2.新建一个类继承Application
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // TODO: 2016/12/28 设置开启日志,发布时请关闭日志 //初始化极光推送 JPushInterface.setDebugMode(false); JPushInterface.init(this); //极光分享 JShareInterface.init(this); }}
3.注册 Application
android:name=".app.MyApplication"
4.一些配置 Required SDK 核心功能 我看官网配置了一大堆 看自己需求加
<activity android:name="cn.jiguang.share.android.ui.JiguangShellActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:launchMode="singleTask" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" <service android:name="cn.jpush.android.service.PushService" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="cn.jpush.android.intent.REGISTER"/> <action android:name="cn.jpush.android.intent.REPORT"/> <action android:name="cn.jpush.android.intent.PushService"/> <action android:name="cn.jpush.android.intent.PUSH_TIME"/> </intent-filter> </service> <receiver android:name="cn.jpush.android.service.PushReceiver" android:enabled="true"> <intent-filter android:priority="1000"> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/> <!-- Required 显示通知栏 --> <category android:name="自己的包名"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.USER_PRESENT"/> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> <!-- Optional --> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package"/> </intent-filter> </receiver> <receiver android:name="cn.jpush.android.service.AlarmReceiver"/> <!-- User defined. 用户自定义的广播接收器 注册广播 --> <receiver android:name=".receiver.JpushRecviver" android:enabled="true" android:exported="false" android:permission="1000"> <intent-filter> <!-- Required 用户注册SDK的intent --> <action android:name="cn.jpush.android.intent.REGISTRATION"/> <!-- Required 用户接收SDK消息的intent --> <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/> <!-- Required 用户接收SDK通知栏信息的intent --> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/> <!-- Required 用户打开自定义通知栏的intent --> <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/> <!-- 接收网络变化 连接/断开 since 1.6.3 --> <action android:name="cn.jpush.android.intent.CONNECTION"/> <action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION"/> <action android:name="cn.jpush.android.intent.UNREGISTRATION"/> <category android:name="自己的包名"/> </intent-filter> </receiver> <meta-data android:name="JPUSH_APPKEY" android:value="刚刚申请appkey丢这里"/>
5.上面接受通知的类 JpushRecviver.class
public class JpushRecviver extends BroadcastReceiver { private static final String TAG = "JpushRecviver"; @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { /** * 用户注册SDK的intent */ Log.e(TAG, "onReceive1: "); } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { /** * 用户接受SDK消息的intent */ Log.e(TAG, "收到了自定义消息消息是2"); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { /** * 用户接收SDK通知栏信息的intent */ Log.e(TAG, "收到了自定义消息消息是3"); //保存服务器推送下来的消息的标题。 String extra1 = bundle.getString(JPushInterface.EXTRA_TITLE); //消息内容 String extra2 = bundle.getString(JPushInterface.EXTRA_MESSAGE); //附加字段。这是个 JSON 字符串。 String extra3 = bundle.getString(JPushInterface.EXTRA_EXTRA); //唯一标识消息的 ID, 可用于上报统计等。 String extra4 = bundle.getString(JPushInterface.EXTRA_MSG_ID); //通知的标题 String extra5 = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE); //通知内容 String extra6 = bundle.getString(JPushInterface.EXTRA_ALERT); //通知栏的Notification ID,可以用于清除Notification //如果服务端内容(alert)字段为空,则notification id 为0 String extra7 = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_ID); //富媒体通知推送下载的HTML的文件路径,用于展现WebView String extra8 = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH); //富媒体通知推送下载的图片资源的文件名,多个文件名用 “,” 分开。 // 与 “JPushInterface.EXTRA_RICHPUSH_HTML_PATH” 位于同一个路径。 String extra9 = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_RES); //JSON String extra10 = bundle.getString(JPushInterface.EXTRA_EXTRA); //这里做自己的操作,关于EventBus后续会讲的 //匹配对应的内容发送通知 if (extra6.contains("Hello World")) { Log.e(TAG, "onReceive包含: "); EventBus.getDefault().post(new HomeRecviverEvent()); } Log.e(TAG, "收到了自定义消息消息内容是2:" + extra1); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra2); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra3); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra4); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra5); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra6); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra7); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra8); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra9); Log.e(TAG, "收到了自定义消息消息extra是2:" + extra10); } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { /** * 用户打开自定义通知栏的intent */ String extra6 = bundle.getString(JPushInterface.EXTRA_ALERT); //如果包含 跳转至对应的界面 if (extra6.contains("Hello World")) { Log.e(TAG, "onReceive包含: "); Log.e(TAG, "收到了自定义消息消息extra是4:"); Intent in = new Intent(context, NewFriendActivity.class); in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(in); } else { Log.e(TAG, "onReceive不包含: "); } } else { Log.e(TAG, "Unhandled intent - " + intent.getAction()); Log.e(TAG, "收到了自定义消息消息extra是5:"); } }}
6.build.gradle 里的配置
其中 JPUSH_PKGNAME: 推送的包名: JSHARE_PKGNAME 分享的包名 applicationId:指的就是你上面的包名 TENCENT_APPID:这个是腾讯的
相关的依赖:
compile 'cn.jiguang.sdk:jpush:3.0.3' // 此处以JPush 3.0.3 版本为例。 compile 'cn.jiguang.sdk:jcore:1.1.1' // 此处以JCore 1.1.1 版本为例。 compile 'cn.jiguang.sdk:jshare:1.1.0' // 此处以 JShare 1.1.0 版本为例。 compile 'cn.jiguang.sdk:jshare-qqmodel:1.1.0' // 此处以 jshare-qqmodel 1.1.0 版本为例 compile 'cn.jiguang.sdk:jshare-wechatmodel:1.1.0' // 此处以 jshare-wechatmodel 1.1.0 版本为例。 compile 'cn.jiguang.sdk:jshare-sinamodel:1.1.0 // 此处以 jshare-sinamodel 1.1.0 版本为例。
到这里相关配置应该全部完成了
7.代码片段 其实到这里已经可以推送了但是由于有单推和群推,还要设置标签与Tag,不然这样是所有人接受
1.设置标签与别名 在Activity 初始化调用下面这个方法即可[确保初次进入设置如:登入成功后跳转的Activity]
/** * 设置标签与别名 */ private void setTagAndAlias() { /** *这里设置了别名,在这里获取的用户登录的信息 *并且此时已经获取了用户的userId,然后就可以用用户的userId来设置别名了 **/ //false状态为未设置标签与别名成功 //if (UserUtils.getTagAlias(getHoldingActivity()) == false) { Set<String> tags = new HashSet<String>(); //这里可以设置你要推送的人,一般是用户uid 不为空在设置进去 可同时添加多个 if (!TextUtils.isEmpty(UserUtils.getUid(getHoldingActivity()))){ tags.add(UserUtils.getUid(getHoldingActivity()));//设置tag } //上下文、别名【Sting行】、标签【Set型】、回调 JPushInterface.setAliasAndTags(getHoldingActivity(), UserUtils.getUid(getHoldingActivity()), tags, mAliasCallback); // } }
2.设置标签与别名的回调
/** * /** * TagAliasCallback类是JPush开发包jar中的类,用于 * 设置别名和标签的回调接口,成功与否都会回调该方法 * 同时给定回调的代码。如果code=0,说明别名设置成功。 * /** * 6001 无效的设置,tag/alias 不应参数都为 null * 6002 设置超时 建议重试 * 6003 alias 字符串不合法 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 * 6004 alias超长。最多 40个字节 中文 UTF-8 是 3 个字节 * 6005 某一个 tag 字符串不合法 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 * 6006 某一个 tag 超长。一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节 * 6007 tags 数量超出限制。最多 100个 这是一台设备的限制。一个应用全局的标签数量无限制。 * 6008 tag/alias 超出总长度限制。总长度最多 1K 字节 * 6011 10s内设置tag或alias大于3次 短时间内操作过于频繁 **/ private final TagAliasCallback mAliasCallback = new TagAliasCallback() { @Override public void gotResult(int code, String alias, Set<String> tags) { String logs; switch (code) { case 0: //这里可以往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。 //UserUtils.saveTagAlias(getHoldingActivity(), true); logs = "Set tag and alias success极光推送别名设置成功"; Log.e("TAG", logs); break; case 6002: //极低的可能设置失败 我设置过几百回 出现3次失败 不放心的话可以失败后继续调用上面那个方面 重连3次即可 记得return 不要进入死循环了... logs = "Failed to set alias and tags due to timeout. Try again after 60s.极光推送别名设置失败,60秒后重试"; Log.e("TAG", logs); break; default: logs = "极光推送设置失败,Failed with errorCode = " + code; Log.e("TAG", logs); break; } } };
3.上面的效果图是群推的也就是安装了的都会收到 现在我们试试指定UID的 也就是上面设置那个用户的uid 回到极光控制台
完成后点击 立即发送即可
上面得标签和tag设置为 你刚刚在代码中的uid 也就是我的UserUtils.getUid(getHoldingActivity()) 1010117
这样只有该用户能接受到消息
4.当用户退出登入不想接受通知时肯定要取消设置的 只要穿null就行了 回调是一样的
/** * 取消设置标签与别名 */ private void cancleTagAndAlias() { //TODO 上下文、别名、标签、回调 退出后空数组与空字符串取消之前的设置 Set<String> tags = new HashSet<String>(); JPushInterface.setAliasAndTags(getHoldingActivity(), "", tags, mAliasCallback); }
STEP8: 接下来是分享的代码段 分享配置在上面已经配置好了
先提供工具类 判断是否安装QQ 微信 微博的
/** * com.tencent.mm微信 * com.sina.weibo新浪微博 * 判断是否安装了QQ "com.tencent.mobileqq" * true 安装了相应包名的app */ public static boolean hasApp(Context context, String packName) { boolean is = false; List<PackageInfo> packages = context.getPackageManager() .getInstalledPackages(0); for (int i = 0; i < packages.size(); i++) { PackageInfo packageInfo = packages.get(i); String packageName = packageInfo.packageName; if (packageName.equals(packName)) { is = true; } } return is; }举例个QQ的 微信 微博 一样的 /** * 用于区别是QQ、微信、微博 * 1-2-3 */ if (Tools.hasApp(PersonalHomePageActivity.this, "com.tencent.mobileqq")) { typeCode = 1; ShareQQWeiXinWeiBo(); } else { showToast("未安装QQ"); }
/**
* 分享到对应平台
*/
private void ShareQQWeiXinWeiBo() { ShareParams shareParams = new ShareParams(); //name 平台名称,值可选 Wechat.Name、WechatMoments.Name、WechatFavorite.Name、 // SinaWeibo.Name、SinaWeiboMessage.Name、QQ.Name、QZone.Name。 String otherName = null; if (typeCode == 1) { otherName = QQ.Name; //QQ文本 shareParams.setShareType(Platform.SHARE_WEBPAGE); //标题 shareParams.setTitle(name); //文本 shareParams.setText(motto); //点击的连接 shareParams.setUrl("http://www.baidu.com"); //网络地址缩略图 shareParams.setImageUrl(image); Log.e(TAG, "ShareQQWeiXinWeiBo: " + name + "\n" + motto + "\n" + image); } else if (typeCode == 2) { otherName = Wechat.Name; shareParams.setTitle(name); shareParams.setText(motto); shareParams.setShareType(Platform.SHARE_WEBPAGE); //跳转链接 必须以 http 或 https 开头 shareParams.setUrl("http://www.baidu.com"); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); shareParams.setImageData(bitmap); } else if (typeCode == 3) { otherName = SinaWeibo.Name; shareParams.setShareType(Platform.SHARE_WEBPAGE); shareParams.setText(motto); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); shareParams.setImageData(bitmap); shareParams.setUrl("http://www.baidu.com"); } Log.e(TAG, "Share: " + typeCode); Log.e(TAG, "Share: " + name); JShareInterface.share(otherName, shareParams, new PlatActionListener() { @Override public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) { Log.e(TAG, "onComplete: "); //这里貌似不知吐丝 必须到主线程 runOnUiThread(new Runnable() { @Override public void run() { showToast("分享成功"); } }); } @Override public void onError(Platform platform, int i, int i1, Throwable throwable) { Log.e(TAG, "onError: " + platform + "\n" + i + "\n" + i1 + "\n" + throwable.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { showToast("分享失败"); } }); } @Override public void onCancel(Platform platform, int i) { Log.e(TAG, "onCancel: "); runOnUiThread(new Runnable() { @Override public void run() { showToast("分享取消"); } }); } }); }
STEP9:微信回调类 暂时没用到
1.
/**
* 配置微信平台回调
*/
public class WXEntryActivity extends WeChatHandleActivity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); }}
2.AndroidManifest.xml
Optional QQ 分享回调
scheme为“tencent”前缀再加上QQ开发者应用的appID;例如appID为123456,则scheme=“tencent123456”
<intent-filter> <data android:scheme="tencent1106218557"/> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> <!-- 新浪微博分享回调 --> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:launchMode="singleInstance" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan|adjustUnspecified|stateHidden"/>```STEP10:在assets 目录下新建 JGShareSDK.xml 这个自己去各个网站申请即可 其中微博的有点麻烦填的东西多审核又严格 app截图还必要要体现微博的用处有点坑... 好了到此结束!<?xml version="1.0" encoding="utf-8"?><DevInfor> <!-- 如果不需要支持某平台,可缺省该平台的配置--> <SinaWeibo AppKey="新浪的 AppId" AppSecret="新浪的 AppSecretId" RedirectUrl="微博开放平台填写的授权回调页"/> <QQ AppId="QQ的 AppId" AppKey="QQ的 AppId"/> <Wechat AppId="微信的 AppId" AppSecret="微信的 AppSectet"/></DevInfor>
- 安卓极光推送与分享【包括Tag和Alias的设置】
- 极光推送 tag alias 设置
- 极光推送的别名alias和标签tag分别是什么意思
- android 调用极光推送SDK设置Tag和Alias工具类——java Web调用极光推送web SDK 发送推送消息工具类
- 极光推送的设置
- 极光推送---安卓Demo
- 安卓 推送(极光)
- RN安卓极光推送
- C#推送安卓—极光推送
- 安卓高级9 极光推送 和短信下发验证
- 关于极光推送 客户端以及服务器端的搭建和设置
- 极光推送集成安卓sdk
- 安卓集成极光推送经验总结
- 安卓集成极光推送SDK
- 百度和极光的推送
- 信鸽推送和极光推送的介绍和接入使用,设备推送 和单个账号推送的设置
- 安卓之推送消息---- 极光推送篇
- 极光推送,自定义对单个安卓手机推送消息
- ios是什么,ios是什么意思
- 什么是IMEI / MEID?他们有什么不同?
- 【PAT】【Advanced Level】1045. Favorite Color Stripe (30)
- 设计模式之适配器模式
- javascript(二)
- 安卓极光推送与分享【包括Tag和Alias的设置】
- "Machine Learning in Action" Chapter 2
- GitHub 优秀的 Android 开源项目
- Cocos2d-x 之使用 TexurePacker+Cocos Studio 协同工作
- JDK1.8 StampedLock源码解析
- 剑指offer面试题3 二维数组的查找(java实现)
- git命令
- 2017.8.4暑假集训第五天
- 线段树练习2