Android集成华为推送

官方文档:https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/push-basic-client

前置步骤:

  1. 在https://developer.huawei.com/consumer/cn/注册成为开发者。
  2. 准备自己APP的SHA256指纹证书,官方文档地址https://developer.huawei.com/consumer/cn/codelab/HMSPreparation/index.html#4
  3. 在华为开发者平台创建自己的APP
  4. 下载SDK、文档和DEMO。https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/HMSAgent_2.6.3.301.zip
  5. 通过Maven 仓库离线包下载地址下载关于推送的包:
    http://developer.huawei.com/repo/com/huawei/android/hms/base/2.6.3.301/base-2.6.3.301.aar
    http://developer.huawei.com/repo/com/huawei/android/hms/push/2.6.3.301/push-2.6.3.301.aar
    创建成功后,你会在华为开发者平台上看到类似的界面效果,下面就是我APP的界面。
    image.png
    image.png

完成上面的前置步骤后,就可以开始在自己的APP中接入华为推送了。

①解压缩的文件夹内,双击运行GetHMSAgent_cn.bat。
image.png

之后跟随提示,首先输入包名、APPID、CPID、选择是否游戏等一系列选项,根据自己的项目情况选择即可。
image.png
image.png
APPID和CPID,是支付和游戏用的,不想填可以直接回车,这里我只需要推送,所以只选了push的代码。

②把copysrc文件夹中的代码,复制到项目中。
image.png

③在build.gradle中添加aar

implementation files('libs/huawei-base-2.6.3.301.aar')
implementation files('libs/huawei-push-2.6.3.301.aar')

网上的很多教程和官网,都是配置maven动态加载华为的推送库,也是可以,但是由于不稳定,而且有时候gradle更新之后,对应的动态库会更新,华为的库经常更新失败,导致了项目都无法运行,避免这种情况,我手动导入了aar库,避免更新失败的问题。

④配置manifest.xml


        
        
        
            
                
                
                
                
                
                
            
        
        
            
                
                
                
            
        
        

上面需要注意的是HuaWeiPushMessageActivity,这是我自己写的类,用于处理点击消息通知的相关跳转逻辑。配置中可以看到有host、path、scheme等配置,这三个都是自定义的,定义好之后,跟之后服务端的推送有关。
我上面配置,后台发送是配置的intent URI是

huawei_scheme://com.cjy.test/push_message?native_redirect=13&page_type=3#Intent;launchFlags=0x10000000;end

其中page_type、native_redirect就是参数和对应的值。

⑤编写HuaWeiMessageReceiver和HuaWeiPushMessageActivity

public class HuaWeiMessageReceiver extends PushReceiver {

    /**
     * 用来接收token返回
     * 调用getToken方法后,获取服务端返回的token结果,返回token以及belongId
     * @param context
     * @param token
     */
    @Override
    public void onToken(Context context, String token) {
        super.onToken(context, token);
        Log.d("HMS","huawei token:"+token);
    }

    @Override
    public void onToken(Context context, String token, Bundle extras) {
        super.onToken(context, token, extras);
    }

    /**
     * push连接状态
     * 调用getPushState方法后,获取push连接状态的查询结果
     */
    @Override
    public void onPushState(Context context, boolean pushState) {
        super.onPushState(context, pushState);
    }

    /**
     * 透传消息
     * 推送消息下来时会自动回调onPushMsg方法实现应用透传消息处理。本接口必须被实现。 在开发者网站上发送push消息分为通知和透传消息
     * 通知为直接在通知栏收到通知,通过点击可以打开网页,应用 或者富媒体,不会收到onPushMsg消息
     */
    @Override
    public boolean onPushMsg(Context context, byte[] msgBytes, Bundle extras) {
        return super.onPushMsg(context, msgBytes, extras);
    }

    /**
     * 通知栏点击事件处理
     * 该方法会在设置标签、点击打开通知栏消息、点击通知栏上的按钮之后被调用。由业务决定是否调用该函数。
     */
    @Override
    public void onEvent(Context context, Event event, Bundle extras) {
        super.onEvent(context, event, extras);
    }
}
public class HuaWeiPushMessageActivity extends AppCompatActivity {
    private int nativeRedirect = 0;
    private String url = "";
    private int pageType = 0;
    private int newsType = 0;
    private long newsId = 0;
    private int openMethod = ActivityUtils.OPEN_IN;
    private String thumb = "";
    private String title = "";
    private String content = "";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        Uri uri = intent.getData();
        if (uri != null) {
            KLog.v("HuaWeiPushMessage", uri.toString());
            if (uri.getQueryParameter(MessageEntity.NativeRedirect) != null && !uri.getQueryParameter(MessageEntity.NativeRedirect).equals("")) {
                nativeRedirect = Integer.valueOf(uri.getQueryParameter(MessageEntity.NativeRedirect));
            }
            url = uri.getQueryParameter(MessageEntity.Link);
            if (uri.getQueryParameter(MessageEntity.PageType) != null && !uri.getQueryParameter(MessageEntity.PageType).equals("")) {
                pageType = Integer.valueOf(uri.getQueryParameter(MessageEntity.PageType));
            }
            if (uri.getQueryParameter(MessageEntity.NewsType) != null && !uri.getQueryParameter(MessageEntity.NewsType).equals("")) {
                newsType = Integer.valueOf(uri.getQueryParameter(MessageEntity.NewsType));
            }
            if (uri.getQueryParameter(MessageEntity.NewsId) != null && !uri.getQueryParameter(MessageEntity.NewsId).equals("")) {
                newsId = Long.valueOf(uri.getQueryParameter(MessageEntity.NewsId));
            }
            if (uri.getQueryParameter(MessageEntity.OpenMethod) != null && !uri.getQueryParameter(MessageEntity.OpenMethod).equals("")) {
                openMethod = Integer.valueOf(uri.getQueryParameter(MessageEntity.OpenMethod));
            }
            thumb = uri.getQueryParameter(MessageEntity.Thumb);
            title = uri.getQueryParameter(MessageEntity.Title);
            content = uri.getQueryParameter(MessageEntity.Description);
            if (TnaotApplication.Companion.instance().isExistMainActivity()) {//是否已经启动APP
                //跳转到具体页面的代码
            } else {
                //启动APP的代码
            }
            this.finish();
        } else {
            //启动APP的代码
            this.finish();
        }
    }
}

⑥在第一个主activity中注册初始化

if (PushUtil.getPhoneType(this).equals(PushUtil.PHONE_TYPE_HUAWEI)) {
            PushUtil.connectHMS(this);
            PushUtil.getHMSToken();
        }
public static void connectHMS(Activity activity) {
        /**
         * SDK连接HMS
         */
        HMSAgent.connect(activity, new ConnectHandler() {
            @Override
            public void onConnect(int rst) {
                Log.d("HMS", "HMS connect end:" + rst);
            }
        });
    }

    public static void getHMSToken() {
        HMSAgent.Push.getToken(new GetTokenHandler() {
            @Override
            public void onResult(int rtnCode) {
                Log.d("HMS", "get token: end code=" + rtnCode);
            }
        });
    }

全部流程大致如此,剩下的就是如何保存token、上报服务端、与服务端对接接口参数等,这些都属于自身项目逻辑,这里不一一记录了。

你可能感兴趣的:(Android集成华为推送)