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

2018-03-24  本文已影响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);
                }
            });
        }

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

上一篇下一篇

猜你喜欢

热点阅读