300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 快速集成融云SDK– Android Studio

快速集成融云SDK– Android Studio

时间:2021-06-12 19:00:26

相关推荐

快速集成融云SDK– Android Studio

现在很多应用都加入了即时通讯功能(客服等),选择第三方的SDK比较省事快捷,这里就介绍一下集成融云SDK时遇到的一些问题。

这个是官网的集成指南:/docs,前3步没啥好说的,关键是第4步:获取Token。这里官网的建议是在服务端来获取Token,但如果我们只是简单的测试Demo,不想弄服务端那么麻烦,我们可以直接在客户端获取Token。写一个获取Token的工具类,代码如下:

import com.alibaba.fastjson.JSON;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.ArrayList;import java.util.List;public class GetToken {public static String GetRongCloudToken(String userName) {StringBuilder sb = new StringBuilder(); String urlString = "https://api./user/getToken.json"; String App_Key = "vnroth0krt5ho";//这里换成你自己的App-key String App_Secret = "p9DtDJLPL7wj";//换成你自己的App-Secret //时间戳,从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。 String Timestamp = String.valueOf(System.currentTimeMillis() / 1000); //随机数 String Nonce = String.valueOf(Math.floor(Math.random() * 1000000)); //数据签名 String Signature = sha1(App_Secret + Nonce + Timestamp); //我这里用的是HttpClient,它已经被Google放弃了,大家如果想用的话,要在app的build.gradle的android标签下 //加上一句 useLibrary 'org.apache.http.legacy' HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(urlString); httpPost.setHeader("App-Key", App_Key);//注意这里的写法,引号里的不是下划线,看融云官网介绍Server端Http请求头的格式就知道 httpPost.setHeader("Timestamp", Timestamp); httpPost.setHeader("Nonce", Nonce); httpPost.setHeader("Signature", Signature); httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); List<NameValuePair> nameValuePairs = new ArrayList<>(1); nameValuePairs.add(new BasicNameValuePair("userId", userName)); HttpResponse httpResponse = null; try {httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8")); httpResponse = httpClient.execute(httpPost); BufferedReader br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); String line = null; while ((line = br.readLine()) != null) {sb.append(line); }} catch (IOException e) {e.printStackTrace(); }//这是新建的一个接收返回数据的类,代码也在下面。 // 看官网介绍“/docs/server.html#API_方法返回值说明”你就知道它应该有哪几个成员变量 //同时也会明白为什么上面的Http请求头要那样写 //还有这里我用了fastjson,搜索添加一下依赖,或者用Gson都行 UserRespone userRespone = JSON.parseObject(sb.toString(), UserRespone.class); return userRespone.getToken(); }private static String sha1(String data) {StringBuilder sb = new StringBuilder(); try {MessageDigest md = MessageDigest.getInstance("SHA1"); md.update(data.getBytes()); byte[] bits = md.digest(); for (int i = 0; i < bits.length; i++) {int a = bits[i];if (a < 0) {a += 256;}if (a < 16) {sb.append("0");}sb.append(Integer.toHexString(a)); }} catch (NoSuchAlgorithmException e) {e.printStackTrace(); }return sb.toString(); }}

public class UserRespone {int code;//返回码,200为正常 String token;//用户Token String userId;//用户Id public int getCode() {return code; }public void setCode(int code) {this.code = code; }public String getToken() {return token; }public void setToken(String token) {this.token = token; }public String getUserId() {return userId; }public void setUserId(String userId) {this.userId = userId; }}

然后在MainActivity中调用获取Token的方法,注意别忘了,网络请求这样的耗时操作一定要放在子线程中,然后联网权限别忘了加。

好了,获取到了Token,可以说我们的工作完成了一大半,接着看/?p=392这里,照着它的步骤来,到最后有个深坑的地方:

<fragment android:layout_width=“match_parent” android:layout_height=“match_parent” android:name=“io.rong.imkit.fragment.ConversationFragment”/> 就是这里,一定要再给这个fragment加上一个id,否则就会报Binary XML file line #7: Error inflating class fragment,,

最后,贴上MainActivity的代码:

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import io.rong.imkit.RongIM;import io.rong.imlib.RongIMClient;public class MainActivity extends AppCompatActivity {String token = null; boolean isFinish = false; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() {@Override public void run() {token = GetToken.GetRongCloudToken("ckp");Log.e("ckp", "类名==MainActivity" + ",方法名==run,token=" + token);if (token.length() > 0) {isFinish = true;}/*** IMKit SDK调用第二步** 建立与服务器的连接**/ RongIM.connect(token, new RongIMClient.ConnectCallback() {@Overridepublic void onTokenIncorrect() {//Connect Token 失效的状态处理,需要重新获取 Token token = GetToken.GetRongCloudToken("hehhki");}@Overridepublic void onSuccess(String userId) {Log.e("ckp", "类名==MainActivity" + ",方法名==onSuccess,userId=" + userId);}@Overridepublic void onError(RongIMClient.ErrorCode errorCode) {Log.e("ckp", "类名==MainActivity" + ",方法名==onSuccess,errorCode=" + errorCode);}});if (RongIM.getInstance() != null) {RongIM.getInstance().startPrivateChat(MainActivity.this, "lck", "hello");}}}).start(); }}

要实现单聊只需要把上下两个useName对调(就是“ckp”和“lck”),在另外一台手机上再运行一次程序(相当于第一次的手机叫”ckp“,第二次注册的用户叫”lck“),再发消息就可以收到了。 第一次写博客,欢迎大家指教,不喜勿喷。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。