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

写在开头:极光推送集成非常简单,现在项目中主要用来接收推送通知,短信通知,刷新界面,具体集成地址:

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 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 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 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文件注册广播接收;

    android:name=".util.JPushutils"
    android:enabled="true"
    android:exported="false">
    
        android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />

        android:name="com.house" />
    


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注册:

    android:name=".util.JPushReceiver"
    android:enabled="true"
    android:exported="false">
    
        android:name="cn.jpush.android.intent.REGISTRATION" />
        
        android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
        
        android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
        
        android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
        
        android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
        
        android:name="cn.jpush.android.intent.CONNECTION" />
        
        android:name="com.house" />
    



你可能感兴趣的:(android 调用极光推送SDK设置Tag和Alias工具类——java Web调用极光推送web SDK 发送推送消息工具类)