Android 融雲IM集成方法以及解決的一些問題


融雲IM的集成方式網上資料也就幾篇,看一下還是可以的,官網的資料以及QA還是比較好的,就是官方提供的Demo可能比較老了,現在Android端一天一個樣,demo好像很難運行起來。

官方文檔寫的很詳細了:https://www.rongcloud.cn/docs/#necessary

  1. 首先是注冊,獲取 App Key / Secret,其中Android端只需要APP key就可以。
  2. 下載導入imLib 和IMkIt,其中IMLib是核心庫,IMkit是UI界面庫,建議先引入Lib,再進入Kit,最后檢查一下,Kit需要依賴Lib.
  3. 在AndroidManifest中配置,需要在自己的app的manifest中增加對應的activity,還要修改包名,我就是換了一個項目,找了半天才發現包名有問題。另外,還需要在imLib中修改appKey。
  4. 在application中進行初始化。

 

到這差不多就算集成進去了,下面就到代碼階段了

  1. 首先就是用戶連接IM服務器,需要傳入一個用戶Token,在添加用戶的時候,融雲會返回該用戶的Token,該token需要永久保存到自己服務器的數據庫中,用戶登錄自己系統的賬戶之后,把該Token下發回去,然后再用Token登錄IM。
  2. 融雲不提供用戶添加好友,以及用戶列表的功能,如果需要該功能,可以在自己的服務器中進行管理。發送消息只需要targetId即可發送。
  3. 下面應該就是配置消息界面,這里可以采用官方提供的UI界面。由於我是采用AndroidX所以遇到了fragment無法轉換的異常,不過我在看了官方的QA之后,說報錯依然可以執行(我也嘗試了AS自帶的migrate to androidX功能,不過感覺沒啥用)
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.fragment.app.FragmentManager;
    import android.net.Uri;
    import android.os.Bundle;
    import io.rong.imkit.fragment.ConversationListFragment;
    import io.rong.imlib.model.Conversation;
    
    public class ConversationListActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_conversation_list);
    
            FragmentManager fragmentManage = getSupportFragmentManager();
            ConversationListFragment fragement = (ConversationListFragment) fragmentManage.findFragmentById(R.id.conversationlist);
            Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon()
                    .appendPath("conversationlist")
                    .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false")
                    .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")
                    .appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")
                    .appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")
                    .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")
                    .build();
            fragement.setUri(uri);
    
        }
    }

    這里報錯是正常的 

  4. 最后就是具體的聊天頁面了,這里需要自己寫title頁面,可以從Intent中獲取一些數據。
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.fragment.app.FragmentManager;
    import android.net.Uri;
    import android.os.Bundle;
    import io.rong.imkit.fragment.ConversationFragment;
    import io.rong.imlib.model.Conversation;
    
    public class ConversationActivity extends AppCompatActivity {
    
    
    //    private Conversation.ConversationType mConversationType;
    //    private String mTargetId;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_conversation);
    
    //        mTargetId = getIntent().getStringExtra("targetId");
    //        mConversationType = (Conversation.ConversationType) getIntent().getSerializableExtra("conversationType");
            Uri data = getIntent().getData();
            String title = getIntent().getData().getQueryParameter("title");
            String targetId = getIntent().getData().getQueryParameter("targetId");
            String conversation = getIntent().getData().getQueryParameter("conversation");
            Conversation.ConversationType type= Conversation.ConversationType.CHATROOM;
    
            FragmentManager fragmentManage = getSupportFragmentManager();
            ConversationFragment fragement = (ConversationFragment) fragmentManage.findFragmentById(R.id.conversation);
    //        Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon()
    //                .appendPath("conversation").appendPath(type.getName().toLowerCase())
    //                .appendQueryParameter("targetId", targetId).build();
    
            fragement.setUri(data);
        }
    }

    下面是遇到的一些問題

  1. 我項目的消息列表頁面采用的是fragment+viewPage的方式,而官方提供的方式卻是activity中的,而且我還需要在消息列表頁面添加其他控件,所以我采用了fragment中套IM提供的fragment。
    public class MessageFragment extends BaseFragment  {
    
        String packageName;
        public MessageFragment(String packageName){
            this.packageName=packageName;
        }
    
        @Override
        protected int provideContentViewId() {
            return R.layout.fragment_message_list;
        }
    
        @BindView(R2.id.vp_contain)    FrameLayout vp_contain;
        @BindView(R2.id.toolbar)   Toolbar toolbar;
    
        @Override
        public void initView(View rootView) {
            super.initView(rootView);
            FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
            Fragment homeFragment= setConversationView();
            transaction.add(vp_contain.getId(), homeFragment);
            transaction.show(homeFragment).commit();
        }private Fragment setConversationView() {
            ConversationListFragment conversationListFragment = new ConversationListFragment();
            conversationListFragment.setAdapter(new ConversationListAdapterEx(RongContext.getInstance()));  //自定義列表頁面(下面有講,不需要,可以刪除)
            Uri uri = Uri.parse("rong://" + packageName).buildUpon().appendPath("activity_chat_main")
                    .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false")
                    .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")
                    .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true").build();
            conversationListFragment.setUri(uri);
            return conversationListFragment;
        }
    }
     
               
    activity_conversation.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/tv_title"
            android:text="用戶名"
            android:textSize="30sp"
            android:gravity="center_horizontal"
            android:layout_width="match_parent"
            android:layout_height="50dp"/>
        <fragment
            android:id="@+id/conversation"
            android:name="io.rong.imkit.fragment.ConversationFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    2.該IM最新版本好像只能獲取ID信息,無法獲取用戶名,所以在消息列表頁面,展示的是用戶ID,而我想展示的是用戶名。這就需要修改列表頁面的數據了。而用戶名需要從自己的服務器中獲取,然后緩存在手機中,這需要考慮不同項目的情況。可以在查詢對方手機號的時候,返回對方的ID以及用戶名,也可以在本地沒有找到的情況下,去請求自己的服務器。

    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    
    import io.rong.imkit.model.UIConversation;
    import io.rong.imkit.userInfoCache.RongUserInfoManager;
    import io.rong.imkit.widget.adapter.ConversationListAdapter;
    import io.rong.imlib.model.Conversation;
    import io.rong.imlib.model.UserInfo;
    
    public class ConversationListAdapterEx extends ConversationListAdapter {
        public ConversationListAdapterEx(Context context) {
            super(context);
        }
    
        @Override
        protected View newView(Context context, int position, ViewGroup group) {
            return super.newView(context, position, group);
        }
    
        @Override
        protected void bindView(View v, int position, UIConversation data) {
            if(data.getConversationType().equals(Conversation.ConversationType.DISCUSSION))
                data.setUnreadType(UIConversation.UnreadRemindType.REMIND_ONLY);
            UserInfo userInfo =  RongUserInfoManager.getInstance().getUserInfo(data.getUIConversationTitle());
            if (userInfo!=null){
                String s = userInfo.toString();
                data.setUIConversationTitle(s);
            }
            super.bindView(v, position, data);
        }
    }
        @Override
        public void getUserIdSuccess(UserBean user) {
            RongIM.getInstance().startConversation(getContext(), Conversation.ConversationType.PRIVATE,user.getUserId()+"", "悟空");
            UserInfo userInfo = new UserInfo(user.getUserId()+"",user.getUserName(),null);
            RongUserInfoManager.getInstance().setUserInfo(userInfo);
        }

     

    這里采用了IM提供的用戶緩存工具:RongUserInfoManager.getInstance().getUserInfo(data.getUIConversationTitle()),需要在成功獲取用戶信息之后,保存到本地。

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM