美文网首页
安卓集成融云推送可能会碰到的问题

安卓集成融云推送可能会碰到的问题

作者: 起个牛逼的昵称 | 来源:发表于2018-03-24 11:27 被阅读633次

    终于满血复活,开始18年的第一篇小笔记。

    为什么要用融云推送,憋问我,其实我一点都不想用,但是没办法啊,服务端就要用这个,多说无益,还是直接开始正题。

    1.在融云官网http://www.rongcloud.cn/ 注册自己的开发者账号。
    2.创建自己的应用

    创建应用
    3.下载sdk,注意只选择“第三方推送”相关就行。
    4.以 Module 形式导入前面下载的融云 SDK 里面的需要的组件,看图 导入module后

    记得在app gradle中引入

     compile project(':IMLib')
     compile project(':IMKit')
    

    5.将 PushLib 中的 jar 包 和 pushDaemon -> libs 目录下应用所支持平台的 so 拷贝到您应用的 jinlibs 目录下,另外还需要将 pushDaemon -> executable 目录下各平台的可执行文件 push_daemon 拷贝到您应用 Module 的 assets 目录下。如图:


    引入后的目录结构.jpg

    5.在Application 中初始化 ,记得在Manifest中设置Application的name

    RongIM.init(this);
    

    6.在IMLib的Manifest中设置APP_KEY

     <meta-data
                android:name="RONG_CLOUD_APP_KEY"
                android:value="你自己的APP_KEY" />
    

    7.运行一下demo,看看会不会报错,如果是包重复或者初始化错误的话,记得把IMKit和IMLib的gradle下的v4和v7包注释掉掉,在app gradle中引入,并将编译版本设置跟 IMLib 下的一致,我现在的是27,

     compileSdkVersion 27
     buildToolsVersion '27'
    
      compile 'com.android.support:support-v4:27.0.0'
      implementation 'com.android.support:appcompat-v7:27.0.0'
    

    8.自定义一个广播集成PushMessageReceiver,接收服务器发送的通知,或者用户点击通知后的操作

    public class DemoNotificationReceiver extends PushMessageReceiver {
        private static final String TAG = "DemoNotificationReceive";
    
        @Override
        public boolean onNotificationMessageArrived(Context context, PushNotificationMessage message) {
            String content = message.getPushContent();
            Log.d(TAG, "onNotificationMessageArrived: 收到服务器推送" + content);
            //用来接收服务器发来的通知栏消息
            return false;// 返回 false, 会弹出融云 SDK 默认通知; 返回 true, 融云 SDK 不会弹通知, 通知需要由您自定义。
        }
    
        @Override
        public boolean onNotificationMessageClicked(Context context, PushNotificationMessage message) {
            //用户点击通知栏消息时触发
            return false;// 返回 false, 会走融云 SDK 默认处理逻辑, 即点击该通知会打开会话列表或会话界面; 返回 true, 则由您自定义处理逻辑。
        }
    }
    
    

    9.在manifest中注册广播

     <receiver
            android:name=".DemoNotificationReceiver"
            android:exported="true">
                <intent-filter>
                    <action android:name="io.rong.push.intent.MESSAGE_ARRIVED"/>
                    <action android:name="io.rong.push.intent.MI_MESSAGE_ARRIVED"/>
                    <action android:name="io.rong.push.intent.MESSAGE_CLICKED"/>
                    <action android:name="io.rong.push.intent.MI_MESSAGE_CLICKED"/>
                </intent-filter>
     </receiver>
    

    10.点击点击通知后的拦截

     <activity
            android:name="com.huishao.rongpushdemo.TextActivity"
            android:launchMode="singleTask"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <data
                        android:host="com.huishao.rongpushdemo"
                        android:pathPrefix="/push_message"
                        android:scheme="rong"/>
                </intent-filter>
      </activity>
    

    点击通知后,就会跳转到TextActivity。
    11.是不是觉得结束了,没有了。 淡定!还有最后一步,获取token并连接融云服务器,直接上代码,网络请求用的okhttp3

     public void sendParamsPost() {
            OkHttpClient okHttpClient = new OkHttpClient();
            String urlParams = "http://api.cn.ronghub.com/user/getToken.json";
            String App_Key = "开发者平台分配的 App Key。"; //开发者平台分配的 App Key。
            String App_Secret = "uYqOpst4DM";
            String Timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳,从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。
            String Nonce = String.valueOf(Math.floor(Math.random() * 1000000));//随机数,无长度限制。
            String Signature = sha1(App_Secret + Nonce + Timestamp);//数据签名。
            FormBody formBody = new FormBody.Builder()
                    .add("userId", "huishao666")
                    .add("name", "辉少")
                    .add("portraitUri", "http://image.baidu.com/search/detail?z=0&word=摄影师板栗&hs=0&pn=0&spn=0&di=0&pi=52310310419&tn=baiduimagedetail&is=1%2C137983&ie=utf-8&oe=utf-8&cs=2844934141%2C3682622922&os=&simid=&adpicid=0&lpn=0&fm=&sme=&cg=&bdtype=-1&oriquery=&objurl=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2Ff9198618367adab45913c15e87d4b31c8601e4e8.jpg&fromurl=&gsm=0&catename=pcindexhot").build();
            //创建请求
            Request request = new Request.Builder()
                    .post(formBody)
                    .url(urlParams)
                    .addHeader("App-Key", App_Key)
                    .addHeader("Timestamp", Timestamp)
                    .addHeader("Nonce", Nonce)
                    .addHeader("Signature", Signature)
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .build();
    
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, "onFailure: " + e.toString());
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String result = response.body().string();
                    try {
                        JSONObject object = new JSONObject(result);
                        String userId = object.optString("userId");
                        token = object.optString("token");
                        Log.d(TAG, "onResponse: ");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
    
        }
    

    连接融云服务器

    if (!token.equals("")) {
                RongIM.connect(token, new RongIMClient.ConnectCallback() {
                    @Override
                    public void onTokenIncorrect() {
                        //Connect Token 失效的状态处理,需要重新获取 Token
                        Log.d(TAG, "onTokenIncorrect: ");
                    }
    
                    @Override
                    public void onSuccess(String s) {
                        Log.e(TAG, "onSuccess:==" + s);
                    }
    
                    @Override
                    public void onError(RongIMClient.ErrorCode errorCode) {
                        Log.e(TAG, "errorCode:==" + errorCode);
                    }
                });
            }
    

    好了,终于结束了,要是融云的官方文档来,我相信你跟我一样,也会一个一个的爬坑,希望我的文章对你有所帮助,喜欢点个赞,技术有限,分享无限。

    相关文章

      网友评论

          本文标题:安卓集成融云推送可能会碰到的问题

          本文链接:https://www.haomeiwen.com/subject/omotcftx.html