1. 程式人生 > >Android 融雲IMKit的整合和使用

Android 融雲IMKit的整合和使用

1.整合

從官網下載SDK,這裡以Rong_Cloud_Android_IMKit_SDK_v2_8_7_Stable_8d65c為例

首先匯入IMKit和IMLib(IMKit以IMLib為基礎)

Rong_Cloud_Android_IMKit_SDK_v2_8_7_Stable_8d65c\Rong_Cloud_Android_IMKit_SDK_v2_8_7_Stable\IMKit

在專案的Module下的libs下加入融雲SDK中的Rong_Cloud_Android_IMKit_SDK_v2_8_7_Stable_8d65c\PushLib\pushDaemon\libs下的四個資料夾

在專案Module下的src\main\assets下加入融雲SDK中的

Rong_Cloud_Android_IMKit_SDK_v2_8_7_Stable_8d65c\PushLib\pushDaemon\executable下的四個資料夾

2.配置

在IMLib的AndroidManifest.xml中替換融雲的Key

<meta-data
android:name="RONG_CLOUD_APP_KEY"
android:value="" />
在專案的Module的build.gradle中加入
compile project(':IMKit')

在settings.gradle中加入

include  ':IMKit', ':IMLib'
在專案Module中的AndroidManifest.xml中加入
<service
android:name="io.rong.imlib.ipc.RongService"
android:process=":ipc" />
<service android:name="io.rong.imlib.ReConnectService" />
<receiver android:name="io.rong.imlib.ConnectChangeReceiver" />
<receiver
android
:name="io.rong.imlib.HeartbeatReceiver" android:process=":ipc" /> <activity android:name="io.rong.imkit.tools.RongWebviewActivity" android:screenOrientation="portrait" /> <activity android:name="io.rong.imkit.widget.provider.TakingPicturesActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait" /> <receiver android:name=".util.im.NotificationReceiver" 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>

3.初始化

在Application中

RongIM.init(this);
RongCloudEvent.init(this);

獲取Token

public class RongIMUtil {

   // 融雲文件提供:
   // 可搜尋:關於 IMkit 中報“Rong SDK should not be initialized at subprocess”的解決方法
public static String getCurProcessName(final Context context) {
      int pid = android.os.Process.myPid();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
      for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
         if (appProcess.pid == pid) {
            return appProcess.processName;
}
      }
      return null;
}

   public static void connectRongIM(final Context context) {
      // 獲取融雲的Token
final String imToken = PreferenceUtils.getStringValue(context, Preferences.RongYunToken, "");
      if (StringUtil.isEmpty(imToken)) {
         final RongYunResponseHandler nextStep = new RongYunResponseHandler() {

            @Override
public void next(final ValidateResult validateResult) {
               if (validateResult.isOK()) {
                  PreferenceUtils.modifyStringValueInPreferences(context, Preferences.RongYunToken, validateResult.getData());
connect(validateResult.getData());
}
            }
         };
IHealthClient.getRongToken(nextStep, context);
} else {
         connect(imToken);
}
   }

   private static void connect(final String rongYunToken) {

      // 連線融雲伺服器。
try {
         RongIM.connect(rongYunToken, new RongIMClient.ConnectCallback() {

            @Override
public void onTokenIncorrect() {

            }

            @Override
public void onSuccess(final String s) {
               // 此處處理連線成功。
Log.d("RongYun", "Login successfully.");
RongCloudEvent.getInstance().setOtherListener();
}

            @Override
public void onError(final RongIMClient.ErrorCode errorCode) {
               // 此處處理連線錯誤。
Log.d("RongYun", "Login failed.");
}
         });
} catch (final Exception e) {
         // TODO Auto-generated catch block
e.printStackTrace();
}
   }
}
設定監聽
/**
 * 融雲SDK事件監聽處理。 把事件統一處理,開發者可直接複製到自己的專案中去使用。
 * <p/>
* 該類包含的監聽事件有:
 * 1、會話列表介面操作的監聽器:       ConversationListBehaviorListener。
 * 2、接收訊息的監聽器:             OnReceiveMessageListener。
 * 3、使用者資訊的提供者:             UserInfoProvider。
 * 4、群組資訊的提供者:             GroupUserInfoProvider。
 * 5、GroupUserInfo提供者:          GroupUserInfoProvider。
 * 6、連線狀態監聽器,以獲取連線相關狀態:    ConnectionStatusListener。
 * 7、地理位置提供者:                 LocationProvider。
 * 8、會話介面操作的監聽器:            ConversationBehaviorListener。
 */
public final class RongCloudEvent implements
RongIM.ConversationListBehaviorListener,
RongIMClient.OnReceiveMessageListener,
RongIM.UserInfoProvider,
RongIM.GroupInfoProvider,
RongIM.GroupUserInfoProvider,
RongIMClient.ConnectionStatusListener,
RongIM.LocationProvider,
RongIM.ConversationBehaviorListener,
RongIM.OnSendMessageListener{

   private static final String TAG = RongCloudEvent.class.getSimpleName();
   private static RongCloudEvent mRongCloudInstance;
   private final Context mContext;
/**
    * 初始化 RongCloud.
    *
    * @param context
*            上下文。
    */
public static void init(final Context context) {

      if (mRongCloudInstance == null) {

         synchronized (RongCloudEvent.class) {

            if (mRongCloudInstance == null) {
               mRongCloudInstance = new RongCloudEvent(context);
}
         }
      }

   }

   /**
    * 構造方法。
    *
    * @param context
*            上下文。
    */
private RongCloudEvent(final Context context) {
      mContext = context;
initDefaultListener();
}

   /**
    * RongIM.init(this) 後直接可註冊的Listener。
    */
private void initDefaultListener() {
      RongIM.setConversationBehaviorListener(this);//設定會話介面操作的監聽器。
RongIM.setConversationListBehaviorListener(this);//設定會話列表介面操作的監聽器
RongIM.setUserInfoProvider(this, true);// 設定使用者資訊提供者。
RongIM.setGroupInfoProvider(this, true);// 設定群組資訊提供者。
RongIM.setLocationProvider(this);//設定地理位置提供者,不用位置的同學可以注掉此行程式碼
}

   /*
    * 連線成功註冊。 <p/> 在RongIM-connect-onSuccess後呼叫。
    */
public void setOtherListener() {
      RongIM.setOnReceiveMessageListener(this);// 設定發出訊息接收監聽器.
RongIM.setConnectionStatusListener(this);// 設定連線狀態監聽器。
RongIM.setOnReceiveMessageListener(this);// 設定訊息接收監聽器。
setUserInfoEngineListener();   //使用者資訊提供者回調監聽
//    setGroupInfoEngineListener();  //群組資訊提供者回調監聽
}

   /**
    * 獲取RongCloud 例項。
    *
    * @return RongCloud。
    */
public static RongCloudEvent getInstance() {
      return mRongCloudInstance;
}

   @Override
public void onChanged(ConnectionStatus connectionStatus) {

      switch (connectionStatus){
         case KICKED_OFFLINE_BY_OTHER_CLIENT://使用者賬戶在其他裝置登入,本機會被踢掉線
ActivityUtil.reLogout(IHealthActivity.INSTANCE);
             break;
}
   }

   @Override
public boolean onUserPortraitClick(Context context, Conversation.ConversationType conversationType, UserInfo userInfo) {
      return false;
}

   @Override
public boolean onUserPortraitLongClick(Context context, Conversation.ConversationType conversationType, UserInfo userInfo) {
      return false;
}

   @Override
public boolean onMessageClick(Context context, View view, Message message) {
      return false;
}

   @Override
public boolean onMessageLinkClick(Context context, String s) {
      return false;
}

   @Override
public boolean onMessageLongClick(Context context, View view, Message message) {
      return false;
}

   @Override
public boolean onConversationPortraitClick(Context context, Conversation.ConversationType conversationType, String s) {
      return false;
}

   @Override
public boolean onConversationPortraitLongClick(Context context, Conversation.ConversationType conversationType, String s) {
      return false;
}

   @Override
public boolean onConversationLongClick(Context context, View view, UIConversation uiConversation) {
      return false;
}

   @Override
public boolean onConversationClick(Context context, View view, UIConversation uiConversation) {
      return false;
}

   @Override
public Group getGroupInfo(String s) {
      return GroupInfoEngine.getInstance(mContext).startEngine(s);
}

   @Override
public GroupUserInfo getGroupUserInfo(String s, String s1) {
      return null;
}

   @Override
public void onStartLocation(Context context, LocationCallback locationCallback) {

   }

   @Override
public boolean onReceived(Message message, int i) {
      return false;
}

   @Override
public UserInfo getUserInfo(String s) {
      return UserInfoEngine.getInstance(mContext).startEngine(s);
}

   @Override
public Message onSend(Message message) {
      return null;
}

   @Override
public boolean onSent(Message message, RongIM.SentMessageErrorCode sentMessageErrorCode) {
      return false;
}

   /**
    * 需要 rongcloud connect 成功後設置的 listener
    */
public void setUserInfoEngineListener() {
      UserInfoEngine.getInstance(mContext).setListener(new UserInfoEngine.UserInfoListener() {
         @Override
public void onResult(UserInfo info) {
            if (info != null && RongIM.getInstance() != null) {
               RongIM.getInstance().refreshUserInfoCache(info);
}
         }
      });
}

   /**
    * 需要 rongcloud connect 成功後設置的 listener
    */
public void setGroupInfoEngineListener() {
      GroupInfoEngine.getInstance(mContext).setListener(new GroupInfoEngine.GroupInfoListeners() {
         @Override
public void onResult(Group info) {
            if (info != null && RongIM.getInstance() != null) {
               RongIM.getInstance().refreshGroupInfoCache(info);
}
         }
      });
}
}
提供使用者資訊
/**
 * 使用者資訊提供者的非同步請求類
 * Created by AMing on 15/12/10.
 * Company RongCloud
 */
public class UserInfoEngine {


    private static UserInfoEngine instance;
    private UserInfoListener mListener;
    public static UserInfoEngine getInstance(Context context) {
        if (instance == null) {
            instance = new UserInfoEngine(context);
}
        return instance;
}

    private UserInfoEngine(Context context) {
        this.context = context;
}

    private static Context context;
    private String userid;
    public String getUserid() {
        return userid;
}

    public void setUserid(String userid) {
        this.userid = userid;
}

    private UserInfo userInfo;
    public UserInfo getUserInfo() {
        return userInfo;
}

    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
}

    public UserInfo startEngine(String userid) {
        setUserid(userid);
((IHealthApplication)context).getCircleService(context).tyeGetUserInfoByUid(userid,getGetUserInfoResponseHandler());
        return getUserInfo();
}

    private ResponseHandler getGetUserInfoResponseHandler() {
        return new ResponseHandler() {

            @Override
public void onRequestSucceeded(final Object data) {
                final JSONObject jsonObject = JSON.parseObject(data.toString());
                final String uId       = jsonObject.getString("userId");
                final String uName         = jsonObject.getString("userName");
                final String uImg         = jsonObject.getString("avatar");
userInfo = new UserInfo(uId, uName, Uri.parse(uImg));
                if (mListener != null) {
                    mListener.onResult(userInfo);
}
            }

            @Override
public void onRequestFailed(final Object data) {
                try {
                    if ((Integer) data > -1)
                        super.onLoginError(IHealthActivity.INSTANCE, data);
} catch (final Exception ex) {
                    PromptUtil.show(IHealthActivity.INSTANCE, data.toString());
}
            }
        };
}

    public void setListener(UserInfoListener listener) {
        this.mListener = listener;
}

    public interface UserInfoListener {
        void onResult(UserInfo info);
}
}
4.呼叫會話列表
if (RongIM.getInstance() != null){
   Map<String, Boolean> map = new HashMap<>();
// 會話列表需要顯示私聊會話, 第二個引數 true 代表私聊會話需要聚合顯示
map.put(Conversation.ConversationType.PRIVATE.getName(), false);
/*
      // 會話列表需要顯示群組會話, 第二個引數 false 代表群組會話不需要聚合顯示
             map.put(Conversation.ConversationType.GROUP.getName(), false);
   */
RongIM.getInstance().startConversationList(getActivity(), map);
}else {
   PromptUtil.show(getActivity(), "連線IM伺服器異常");
}
會話列表
public class ConversationListActivity extends FragmentActivity {

   @Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
setContentView(R.layout.conversationlist);
}

   public void onTitleBackClicked(final View view) {
      onBackPressed();
}

}

佈局

<fragment
android:id="@+id/conversationlist"
android:name="io.rong.imkit.fragment.ConversationListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
AndroidManifest.xml設定
<activity
android:name=".controller.ConversationListActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
android:host="包名"
android:pathPrefix="/conversationlist"
android:scheme="rong" />
    </intent-filter>
</activity>
5.啟用會話介面

傳入使用者Id和name

personalUserID = data.toString();
if (!StringUtil.isEmpty(personalUserID)) {
    //啟動會話介面
if (RongIM.getInstance() != null) {
        RongIM.getInstance().startPrivateChat(XX.this, personalUserID, residentName);
} else {
        PromptUtil.show(ResidentDetailActivityNew.this, "連線IM伺服器異常");
}
}
會話介面
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
setContentView(R.layout.conversation);
Intent intent = getIntent();
   if (intent == null || intent.getData() == null){
      return;
}
   mTargetId = intent.getData().getQueryParameter("targetId");
mConversationType = Conversation.ConversationType.valueOf(intent.getData().getLastPathSegment().toUpperCase(Locale.getDefault()));
title = intent.getData().getQueryParameter("title");
佈局
<fragment
android:id="@+id/conversation"
android:name="io.rong.imkit.fragment.ConversationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
AndroidManifest.xml設定
<activity
android:name=".controller.ConversationActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
android:host="包名"
android:pathPrefix="/conversation/"
android:scheme="rong" />
    </intent-filter>
</activity>

相關推薦

Android IMKit整合使用

1.整合 從官網下載SDK,這裡以Rong_Cloud_Android_IMKit_SDK_v2_8_7_Stable_8d65c為例 首先匯入IMKit和IMLib(IMKit以IMLib為基礎) Rong_Cloud_Android_IMKit_SDK_v2_8_7_S

Android IM整合以及使用詳解(二)

Android 融雲IM整合以及使用詳解(二) 上篇講解了整合和好友列表和訊息記錄的使用,這篇將講解聊天介面和群聊介面的使用 先附上一張效果圖 先介紹佈局檔案 <LinearLayout xmlns:android="http://schema

Android IM整合以及使用詳解(一)

Android 融雲IM整合以及使用詳解(一) 整合 1.具體的整合步驟就不在詳細介紹,我們只說乾貨,附上融雲IM官方文件地址,裡面有更為詳細的整合介紹 https://www.rongcloud.cn/docs/#necessary 整合後效果 2.Android

Android SDK整合單聊

一 、下載 SDK 您可以到融雲官方網站下載融雲 SDK。融雲 SDK 各部分功能以外掛化的形式獨立提供,開發者可以根據自己的需要,自由組合下載。各元件的功能如下: IMKit – 融雲 IM 介面元件 IMLib – 融雲 IM 通訊能力庫 CallKit – 融雲音視訊

Android 整合注意事項使用教程

在這裡我使用的融雲集成的單人音視訊通話,其實套路都是一樣的,在這裡我給大家介紹一下,整合遇到的問題。 一.在myapplication初始化的時候找不到嵌入modle或者匯入依賴時的依賴包,或者是匯入了modle,modle下又有依賴,但是匯入依賴有的方法找不到,問題有

客服端客戶端SDK整合思路介紹

這裡只介紹思路,程式碼只提供融雲的! 開始介紹整合思路之前,先介紹一下產品經理要實現產品是什麼 客戶頁面,客戶點選人工客服,客服將在此跟客戶進行溝通。 每個客服最多隻能接待5個客戶,當所有客服接待人數都滿了,客戶將進行排隊 客服可檢視客戶與上一個客服的聊天曆史記錄

Android判斷是否使用者已經加入黑名單加入&移除黑名單

disturb_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton

android + 科大訊飛 實現仿微信語音訊息轉換為文字(附DEMO原始碼)

融雲SDK 使用很方便,簡單配置就可以搭建即時通訊功能,配合科大訊飛的語音識別, 即可實現微信中語音訊息轉換為文字的功能 融雲sdk的基本使用就不細說了, 網上很多資料 使用融雲sdk自帶的聊天會話介面,想要在此會話介面上增加語音訊息長按時彈出 “轉換為文

Android微信支付整合踩過的坑

近公司需要微信支付,所以不得不去看看微信支付文件。但是你懂得,那文件寫的真帶勁,看不懂。我直接放棄,開始整合。但是調起微信支付的時候:結果碼為-1,心裡一驚,肯定哪裡錯了,就開始找坑。所以把自己解決的過程分享給大家,讓整合微信支付成為很容易的一件事。 2、我們需要的資源

Android實戰——Tinker的整合使用

前言 對於熱修復我相信很多小夥伴都已經知道它們普遍的操作套路,Tinker主要是依賴自己的gradlePlugin生成拆分包,所以其拆分包的生成就由Gradle來完成,當然也可以通過命令列的方式,這裡就不對命令列做講解,Tinker接入指南 專案結構

android 客服接入,看這一個就行了!

B了狗,整了三天終於整好了客服系統的demo,中途出了一大堆的問題,網上查詢各種資料,並且找論壇裡面的大神,實在是折騰的頭疼,避免再出現拖這麼久解決一個問題,特此記錄 app裡的build.gradle加入 implementation ‘cn.rongclou

IM通訊行業步入快車道,或將Twilio一樣實現資本上市

2016年,Twilio的成功上市,以及搶眼的股價表現,拓寬了全球雲通訊行業的想象空間,行業內公司估值水平也集體上調。 在中國,IM雲通訊行業也從2016年開始進入了一個“黃金髮展時期”,一批如融雲、容聯、環信等專業服務商以及阿里悟空、騰訊雲通訊、網易雲信等巨頭型企業紛紛

Android會話及會話列表的實現

一、服務端好友關係列表在自己的伺服器上已部署完成,並且實現了與融雲伺服器的互動 二、通過App傳送訊息到自己的服務端,得到App與自己伺服器互動的token以及App與融雲伺服器互動的token 1、App自己伺服器token(令牌),用於App與自己伺服器互動 2、App

android專案中整合IM之實現訊息提供者來顯示群名

        融雲的訊息提供者可以用來設定群名,暱稱,頭像等等。由於套路都是一樣的,正好現在做到顯示群名這塊。所以就說說這個,其他訊息提供者跟這個是大同小異。 思路: 1.建立一個類,整合群組資訊

快速整合SDK– Android Studio

    現在很多應用都加入了即時通訊功能(客服等),選擇第三方的SDK比較省事快捷,這裡就介紹一下整合融雲SDK時遇到的一些問題。      這個是官網的整合指南:http://www.rongcloud.cn/docs,前3步沒啥好說的,關鍵是第4步:獲取Token。這裡

Android開發遇到的坑-----2.8.+版本修改插件列表

rsa 圖片 項目需求 tex 顯示 根據 -- 移除 pre 簡介   融雲在2.8.+的時候,對輸入區域進行了重構,輸入區域整個為RongExtension,插件為RongExtension區域的Plugin模塊 List<IPluginModule&g

區塊鏈電商全程溯源系統:為企業消費者解決信任難題!

img 不可 企業 終端 結構 市場價格 vpd type 分布 區塊鏈技術從誕生之初就被給予厚望,不同於虛無縹緲的炒空氣幣,區塊鏈本身就是大有可為的下一代互聯網技術。在所有的場景應用中,溯源防偽被認為是最有前景的,也是巨頭們爭奪區塊鏈技術落地的第一個領域。國內重點城市紛紛

一個尖括號能幹什麼,畫一個笑臉開始(為了支援互動,它又增添了JavaScript。HTML頁面也越來越臃腫。於是CSS便誕生了。API核心程式碼的出現使HTML能夠訪問更復雜的軟體功能--支援更高階的互動和雲服務整合。這就是今天的HTML5)

一個尖括號 < 一個尖括號能幹什麼 < ? 你可以編出一頂帽子 <(:-p 或一張笑臉 :-> 再或者更直接一些   20世紀90年代初,html作為一種簡單標記語言面世,用於在網際網路上顯示超文字。經過發展,html逐漸包含圖片和佈局設計功能。為了支援互動,

IM使用小結---Android

首先按照融雲官方文件,接入SDK,基於IMKit,具體接入就不多廢話啦啦… 此時AndroidManifest.xml在遇到第一個問題點: 1、android.support.v4.content.FileProvider衝突 <provider

【技術分享】安卓整合推送可能會碰到的問題

1.在融雲官網http://www.rongcloud.cn/ 註冊自己的開發者賬號。 2.建立自己的應用 建立應用 3.下載sdk,注意只選擇“第三方推送”相關就行。 4.以 Module 形式匯入前面下載的融雲 SDK 裡面的需要的元件,看圖