1. 程式人生 > >快速整合融雲SDK– Android Studio

快速整合融雲SDK– Android Studio

    現在很多應用都加入了即時通訊功能(客服等),選擇第三方的SDK比較省事快捷,這裡就介紹一下整合融雲SDK時遇到的一些問題。

     這個是官網的整合指南:http://www.rongcloud.cn/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.cn.ronghub.com/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(); } //這是新建的一個接收返回資料的類,程式碼也在下面。 // 看官網介紹“http://www.rongcloud.cn/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,可以說我們的工作完成了一大半,接著看http://blog.rongcloud.cn/?p=392這裡,照著它的步驟來,到最後有個深坑的地方:

  1.     <fragment  
  2.         android:layout_width=“match_parent”  
  3.         android:layout_height=“match_parent”  
  4.         android:name=“io.rong.imkit.fragment.ConversationFragment”/>  
就是這裡,一定要再給這個fragment加上一個id,否則就會報 Binary XML file line #7: Error inflating class fragment,,

最後,貼上MainActivity的程式碼:

importandroid.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() {
                    @Override
public void onTokenIncorrect() {
                        //Connect Token 失效的狀態處理,需要重新獲取 Token
token = GetToken.GetRongCloudToken("hehhki");
}

                    @Override
public void onSuccess(String userId) {
                        Log.e("ckp", "類名==MainActivity" + ",方法名==onSuccess,userId=" + userId);
}

                    @Override
public 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“),再發訊息就可以收到了。 第一次寫部落格,歡迎大家指教,不喜勿噴。