您的位置:首页 > 移动开发 > Android开发

android 调用极光推送SDK设置Tag和Alias工具类——java Web调用极光推送web SDK 发送推送消息工具类

2017-08-25 09:55 471 查看
写在开头:极光推送集成非常简单,现在项目中主要用来接收推送通知,短信通知,刷新界面,具体集成地址:
http://docs.jiguang.cn/jpush/client/Android/android_guide/
下面是关于调用的一些工具类;

1.Android jpushUtils:基于极光文档api 3.0.7 集成而来

源码:

**
* 类名:JPushutils.class
* 描述:使用别名
* Created by:刘帅 on 2017/8/24 0024.
* --------------------------------------
* 修改内容:
* 备注:
* Modify by:
*/

public class JPushutils extends JPushMessageReceiver {
public static final String PROJECTNAME = "PB";//极光推送别名

/**
* 设置极光推送app别名
* 用于给某特定用户推送消息。别名,可以近似地被认为,是用户帐号里的昵称 使用标签
* 覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
* @param alias
*/
public static void setAlias(Context conn, String alias) {
setJpushAlias(conn,0x1,Validate.isNullTodefault(alias,PROJECTNAME));
}
/**
* 删除极光推送app别名
*/
public static void deleteAlias(Context conn) {
deleteJpushAlias(conn,0x2);
}
/**
* 获取极光推送app别名
*/
public static void getAlias(Context conn ) {
getJpushAlias(conn,0x3);
}
/**
* 设置标签
* 用于给某一群人推送消息。标签类似于博客里为文章打上 tag ,即为某资源分类。
*/
public static void setTags(Context conn,final String[] Tags) {
setJpushTags(conn,0x4,Tags);
}
/**
* 添加标签
*/
public static void addTags(Context conn,final String[] Tags) {
addJpushTags(conn,0x5,Tags);
}
/**
* 删除标签
*/
public static void deleteTags(Context conn,final String[] Tags) {
deleteJpushTags(conn,0x6,Tags);
}

/**
* 删除所有标签
*/
public static void cleanTags(Context conn) {
cleanJpushTags(conn,0x7);
}
/**
* 获取所有标签
*/
public static void getAllTags( Context conn) {
getAllJpushTags(conn,0x8);
}

private static void setJpushAlias( Context conn,int sequence,final String alias) {
JPushInterface.setAlias(conn,sequence,alias);
}
private static void deleteJpushAlias(Context conn,int sequence) {
JPushInterface.deleteAlias(conn, sequence);
}
private static void getJpushAlias(Context conn,int sequence) {
JPushInterface.getAlias(conn,sequence);
}

//设置标签
private static void setJpushTags(Context conn,int sequence,final String[] Tags){
Set<String> set = new HashSet<>();
for (int i = 0; i < Tags.length; i++) {
set.add(Tags[i]);
}
JPushInterface.setTags(conn,sequence,set);
}
private static void addJpushTags(Context conn,int sequence,final String[] Tags){
Set<String> set = new HashSet<>();
for (int i = 0; i < Tags.length; i++) {
set.add(Tags[i]);
}
JPushInterface.addTags(conn,sequence,set);
}
private static void deleteJpushTags(Context conn,int sequence,final String[] Tags){
Set<String> set = new HashSet<>();
for (int i = 0; i < Tags.length; i++) {
set.add(Tags[i]);
}
JPushInterface.deleteTags(conn,sequence,set);
}
private static void cleanJpushTags(Context conn,int sequence){
JPushInterface.cleanTags(conn,sequence);
}
private static void getAllJpushTags(Context conn,int sequence){
JPushInterface.getAllTags(conn,sequence);
}

@Override
public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
switch (jPushMessage.getSequence()){
case 0x1:
if(jPushMessage.getErrorCode()==0)
KL.d("设置Alias成功");
else
KL.d("设置Alias失败");
break;
case 0x2:
if(jPushMessage.getErrorCode()==0)
KL.d("删除Alias成功");
else
KL.d("删除Alias失败");
break;
case 0x3:
if(jPushMessage.getErrorCode()==0)
KL.d("Alias为:"+jPushMessage.getAlias());
else
KL.d("获取Alias失败");
break;
}
super.onAliasOperatorResult(context, jPushMessage);
}

@Override
public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
switch (jPushMessage.getSequence()){
case 0x4:
if(jPushMessage.getErrorCode()==0)
KL.d("设置Tag成功");
else
KL.d("设置Tag失败");
break;
case 0x5:
if(jPushMessage.getErrorCode()==0)
KL.d("增加Tag成功");
else
KL.d("增加Tag失败");
break;
case 0x6:
if(jPushMessage.getErrorCode()==0)
KL.d("删除Tag成功");
else
KL.d("删除Tag失败");
break;
case 0x7:
if(jPushMessage.getErrorCode()==0)
KL.d("删除所有Tag成功");
else
KL.d("删除所有Tag失败");
break;
case 0x8:
if(jPushMessage.getErrorCode()==0)
KL.d("获取所有Tag成功,Tags:"+jPushMessage.getTags().toString());
else
KL.d("获取所有Tag失败");
break;
}
super.onTagOperatorResult(context, jPushMessage);
}


注:因为工具类本身继承自极光推送的一个广播接收器,功能是用于获取Tag和Alias操作是否成功的消息回调。所以要在mainfests文件注册广播接收;

<receiver
android:name=".util.JPushutils"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MES
11f56
SAGE" />

<category android:name="com.house" />
</intent-filter>
</receiver>


2.java Web  :jPushUtils

/**
* 极光推送服务端实现类
* author:刘帅
* controller 层调用 :
* 方法与说明:
*  JPush.getInstance().sendPush(String alert);
*  推送消息,如更新,紧急通知等。对象:所有人员,所有设备
*
*  JPush.getInstance().sendPush(String userID, String alert, String mklx);
*  推送消息,如通知公告,待审批通知等。 对象:指定人员 注意:调用此方法,需要传入人员 userID,推送内容,模块名称。方便手机端进行模块区分,跳转页面
*
*  JPush.getInstance().sendPush(String userID, String json)
*  推送消息  如:当用户提交一条申请单,服务端处理后,向手机端推送一条消息,手机端借此刷新页面的待办数量。 对象:指定人员 注意:调用此方法,需传入人员 userID,json字符串。
*  json 格式: {"success":"true","items":[{"mklx":"1","dspsl":"3"},{"mklx":"2","dspsl":"3"}]}
*
* @整理 by 刘帅 2017年8月10日
*/
public class JPush {
protected static final Logger LOG = LoggerFactory.getLogger(JPush.class);

private static JPush jpush;

public static JPush getInstance() {
//    if (jpush == null)
return new JPush();
//    return jpush;
}

/**
* 向全部人员推送
*
* @throws APIRequestException
*/
public void sendPush(String alert) {
JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance());
// 生成推送的内容
PushPayload payload = buildPushObject_all_all_alert(alert);
try {
System.out.println(payload.toString());
PushResult result = jpushClient.sendPush(payload);
System.out.println(result + "................................");
LOG.info("Got result - " + result);
} catch (APIConnectionException e) {
LOG.error("Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
LOG.error("Error response from JPush server. Should review and fix it. ", e);
LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了");
LOG.info("HTTP Status: " + e.getStatus());
LOG.info("Error Code: " + e.getErrorCode());
LOG.info("Error Message: " + e.getErrorMessage());
LOG.info("Msg ID: " + e.getMsgId());
}
}

/**
* 向全部人员推送
* @param tags
*              标签名称
* @param alert
*              推送内容
* @param mklx
*           模块类型
*/
public void sendPushByTagsone(String tags,String alert,String mklx) {
JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance());
// 生成推送的内容
PushPayload payload = buildPushObject_all_tags_alert(tags,alert,mklx);
try {
System.out.println(payload.toString());
PushResult result = jpushClient.sendPush(payload);
System.out.println(result + "................................");
if(200==result.getResponseCode())
System.out.println("推送成功");
else
System.out.println("推送失败");
LOG.info("Got result - " + result);
} catch (APIConnectionException e) {
LOG.error("Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
LOG.error("Error response from JPush server. Should review and fix it. ", e);
LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了");
LOG.info("HTTP Status: " + e.getStatus());
LOG.info("Error Code: " + e.getErrorCode());
LOG.info("Error Message: " + e.getErrorMessage());
LOG.info("Msg ID: " + e.getMsgId());
}
}
/**
* 构建推送对象:所有android_ios,所有人员,通知内容为 ALERT。附加字段为 mklx——"通知公告"
*
* @return
*/
private PushPayload buildPushObject_all_tags_alert(String tag,String alert, String mklx) {
return PushPayload.newBuilder().setPlatform(Platform.android_ios())// 平台:android_ios
.setAudience(Audience.tag(tag))// 标签,这里如果是向指定用户推送事件,需要将用户的标签名称传入
.setNotification(Notification.newBuilder().setAlert(alert)
.addPlatformNotification(AndroidNotification.newBuilder()
// .setTitle(TITLE)//android 特有,设置app名称或标题的
.addExtra("mklx", mklx).build())
.addPlatformNotification(IosNotification.newBuilder()
// .setBadge(5)//ios所特有的,用于显示有N条待办事件的
.addExtra("mklx", mklx).build())
.build())
.build();
}

/**
* 向指定人员推送
*
* @param userID
*            用户ID
* @param alert
*            推送内容
* @param mklx
*            模块名称
* @throws APIRequestException
*/
public void sendPush(String userID, String alert, String mklx) {
JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance());
// 生成推送的内容
PushPayload payload = buildPushObject_all_alias_alert(userID, alert, mklx);
try {
System.out.println(payload.toString());
PushResult result = jpushClient.sendPush(payload);
System.out.println(result + "................................");
LOG.info("Got result - " + result);
} catch (APIConnectionException e) {
LOG.error("Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
LOG.error("Error response from JPush server. Should review and fix it. ", e);
LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了");
LOG.info("HTTP Status: " + e.getStatus());
LOG.info("Error Code: " + e.getErrorCode());
LOG.info("Error Message: " + e.getErrorMessage());
LOG.info("Msg ID: " + e.getMsgId());
}
}

/**
* 向指定用户推送,用于主界面刷新消息数量
*
* @param userID
*            用户ID
* @param json
*            推送内容
* @throws APIRequestException
*/
public void sendPush(String userID, String json) {
JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance());
// 生成推送的内容
PushPayload payload = buildPushObject_messageWithExtras(userID, json);
try {
System.out.println(payload.toString());
PushResult result = jpushClient.sendPush(payload);
System.out.println(result + "................................");
LOG.info("Got result - " + result);
} catch (APIConnectionException e) {
LOG.error("Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
LOG.error("Error response from JPush server. Should review and fix it. ", e);
LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了");
LOG.info("HTTP Status: " + e.getStatus());
LOG.info("Error Code: " + e.getErrorCode());
LOG.info("Error Message: " + e.getErrorMessage());
LOG.info("Msg ID: " + e.getMsgId());
}
}

/**
* 构建推送对象:所有平台,所有设备,所有人,内容为 ALERT 的通知。
*
* @return
*/
private PushPayload buildPushObject_all_all_alert(String alert) {
return PushPayload.alertAll(alert);// 基本通知
}

/**
* 构建推送对象:所有android_ios,推送目标是别名为 "usirID",通知内容为 ALERT。附加字段为 mklx——"通知公告"
*
* @return
*/
private PushPayload buildPushObject_all_alias_alert(String userID, String alert, String mklx) {
return PushPayload.newBuilder().setPlatform(Platform.android_ios())// 平台:android_ios
.setAudience(Audience.alias(userID))// 别名,这里如果是向指定用户推送事件,需要将用户的UserID传入
.setNotification(Notification.newBuilder().setAlert(alert)
.addPlatformNotification(AndroidNotification.newBuilder()
// .setTitle(TITLE)//android 特有,设置app名称或标题的
.addExtra("mklx", mklx).build())
.addPlatformNotification(IosNotification.newBuilder()
// .setBadge(5)//ios所特有的,用于显示有N条待办事件的
.addExtra("mklx", mklx).build())
.build())
.build();
}

/**
* 构建推送对象:所有android_ios,推送目标是别名为 "usirID",推送内容为json——"{key:1,key:2}"。
*
* @return
*/
private PushPayload buildPushObject_messageWithExtras(String userID, String json) {
System.out.println("json====="+json);
return PushPayload.newBuilder().setPlatform(Platform.android_ios())
.setAudience(Audience.alias(userID))// 别名,这里如果是向指定用户推送事件,需要将用户的UserID传入
.setMessage(Message.newBuilder()
.setMsgContent(json)
.build())
.build();
}

public class Params {
// 极光推送,注册帐号显示的Key和masterSecret
private static final String appKey = "";
private static final String masterSecret = "";
}
}


3.附上接收极光推送消息的广播接收器

/**
* 类名:JPushReceiver.class
* 描述:极光推送广播接收器
* Created by:刘帅 on 2017/2/9.
* --------------------------------------
* 修改内容:
* 备注:
* Modify by:
*/
public class JPushReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
KL.d("[JPushReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
KL.d("[JPushReceiver] 接收Registration Id : " + regId);
//send the Registration Id to your server...
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
KL.d("[JPushReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
KL.d("[JPushReceiver] 接收到推送下来的通知");
int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
KL.d("[JPushReceiver] 接收到推送下来的通知的ID: " + notifactionId);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
KL.d("[JPushReceiver] 用户点击打开了通知");
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
KL.d("[JPushReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
//在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
} else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
KL.d("[JPushReceiver]" + intent.getAction() +" connected state change to "+connected);
} else {
KL.d("[JPushReceiver] Unhandled intent - " + intent.getAction());
}
}

// 打印所有的 intent extra 数据
private String printBundle(Bundle bundle) {
StringBuilder sb = new StringBuilder();
for (String key : bundle.keySet()) {
if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
}else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
} else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
if (bundle.getString(JPushInterface.EXTRA_EXTRA).isEmpty()) {
KL.d("This message has no Extra data");
continue;
}
} else {
sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
}
}
return sb.toString();
}
}


注:mainfests注册:

<receiver
android:name=".util.JPushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<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  用户接收SDK通知栏信息的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<!-- Required  用户打开自定义通知栏的intent -->
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
<!-- Optional 用户接受Rich Push Javascript 回调函数的intent -->
<action android:name="cn.jpush.android.intent.CONNECTION" />
<!-- 接收网络变化 连接/断开 since 1.6.3 -->
<category android:name="com.house" />
</intent-filter>
</receiver>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: