安卓极光推送与分享【包括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>