Skip to content

接入外部通讯录

如果接入方已实现自研的通讯录页面,并希望替换掉协作中台SDK 内置通讯录,可以通过实现相关协议方法实现效果。

接入方需要实现 KIMExpContacts 接口,并将其注入到协作中台 SDK 中。

接口定义

方法参数返回值说明
openContactsactivity: FragmentActivity打开通讯录
openContactsPickeractvity: FragmentActivity
params: ContactsPickerParams
callback: (selectedUids: Array<String>?, chatIds: Array<String>?) -> Unit
打开通讯录选择器,
接入方可以根据 params 参数非 null 字段修改页面的 UI 交互,例如修改标题、显示默认选中的人员等。
完成选择后,接入方必须回调 callback 函数,第一个参数为已选中的用户Id(selectedUids)注意该用户Id为SDK内部使用的用户Id,需要与自身账户系统进行转换时可调用`KIM.getService().getLinkUpService(KIMISdkUserInfoService::class.java)?.thirdUidConverter?.convert3rdUidToWoaUid(thirdUninIds),第二个参数为选中的会话 Id 数组。

ContactsPickerParams

参数类型说明
titleString?通讯录title
funcTypeInt?打开通讯录意图, 参考com.kingsoft.kim.kit.contacts.service.constant.FuncType
singleModeBoolean?是否为单选模式
selectedThirdUidsArray<String>?已选用户id列表,可以取消选中。注意:用户id为SDK内部使用的用户Id。
defaultThirdUidsArray<String>?默认用户id列表,不能取消选中。注意:用户id为SDK内部使用的用户Id。
maxSelectCountInt?最大选择数量, 默认400
okButtonTextInt?确认按钮文案StringResId
showRecentBoolean?是否显示最近会话
recentChatTypeInt?显示最近会话的类型
requestCodeInt

代码示例

  1. 接入方需要创建一个自定义类 MyContactsExp 并实现 KIMExpContacts 接口:
kotlin
class AccessOpenContactExp : KIMExpContacts {

    override fun openContacts(context: Context) {
        context.startActivity(Intent(context, DemoContactsActivity::class.java))
    }

    override fun openContactsPicker(
        context: Context,
        params: KIMExpContacts.ContactsPickerParams,
        callback: (selectedUids: Array<String>?, chatIds: Array<String>?) -> Unit
    ) {
        val activity = context as? FragmentActivity?: return
        val intent = Intent(context, AccessOpenContactActivity::class.java)
        intent.putExtra(AccessOpenContactActivity.EXTRA_CONTACTS_PICKER_PARAMS, params)
        val resTag = "get_picker_result"
        ActivityResultUtils.startActivityByFragment(activity, intent, params.requestCode, resTag, object : ActivityResultUtils.OnResultHandler {
            override fun onActivityResult(result: ActivityResultUtils.ActivityResult) {
                if (result.requestCode == params.requestCode && result.resultCode == Activity.RESULT_OK) {
                    result.data?.let {
                        val chatIdArr = it.getStringArrayExtra(AccessOpenContactActivity.KEY_RESULT_CHAT_ID)
                        val uidArr = it.getStringArrayExtra(AccessOpenContactActivity.KEY_RESULT_UID)
                        callback(uidArr, chatIdArr)
                    }
                }
            }
        })
    }
}
  1. 创建一个自定义类 MyContactsSdkApplication 并继承自 KIMSdkApplication,重写 confMeatsOnBone 方法:然后将 MyContactsExp 类注入到协作中台 SDK 中:
kotlin
class MyContactsSdkApplication : KIMSdkApplication() {

    override fun confMeatsOnBone(): KConf<Meat> {
        return kConfOf(
            // 配置通讯录扩展类
            KIMExpContacts::class.java confTo AccessOpenContactExp::class.java
        )
    }
}
  1. 在 AndroidManifest.xml 文件中声明 MyContactsSdkApplication 类:
Xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kingsoft.kim.kit.sample">
    <application>
        ...
        <meta-data
            android:name="com.kingsoft.kim.kit.sample.p.kop.contacts.MyContactsSdkApplication"
            android:value="@string/kim_sdk_application" />
    </application>
</manifest>

通过以上步骤即可完成外部通讯录的接入,实现 协作中台 SDK 内所有涉及调用通讯录的功能,全部替换为外部通讯录,例如通讯录tab、创建群聊/添加群聊成员等。