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 裡面的需要的元件,看圖