终于满血复活,开始18年的第一篇小笔记。
为什么要用融云推送,憋问我,其实我一点都不想用,但是没办法啊,服务端就要用这个,多说无益,还是直接开始正题。
1.在融云官网http://www.rongcloud.cn/ 注册自己的开发者账号。
2.创建自己的应用
3.下载sdk,注意只选择“第三方推送”相关就行。
4.以 Module 形式导入前面下载的融云 SDK 里面的需要的组件,看图
记得在app gradle中引入
compile project(':IMLib')
compile project(':IMKit')
5.将 PushLib 中的 jar 包 和 pushDaemon -> libs 目录下应用所支持平台的 so 拷贝到您应用的 jinlibs 目录下,另外还需要将 pushDaemon -> executable 目录下各平台的可执行文件 push_daemon 拷贝到您应用 Module 的 assets 目录下。如图:
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);
}
});
}