美文网首页
Android获取手机通讯录-根据排序方式进行

Android获取手机通讯录-根据排序方式进行

作者: J_xs | 来源:发表于2018-11-20 07:55 被阅读130次
获取手机通讯录要求和手机上的通讯录软件排序一样,即使手机通讯录更改了排序方式和显示方式 `名字和姓氏的方式 ` 

在英文模式下可以进行更改联系人设置,由于安卓系统已经将获取联系人排序方式这个取消掉了,所以部分安卓手机也就没有提供这个更改联系人排序这个功能,通过查看源码可知新版本中关于联系人排序的参数放在 SharePreference的privatemode中。

获取系统的排序方式

根据下面代码能够获取到当前系统的排序参数,这个参数在大部分系统中被屏蔽不能获取,经过测试在小米的miui上面可以拿到,这样久能保证和系统的排序一致的方式显示通讯录

        try {
            sortOrder = Settings.System.getInt(contentResolver, "android.contacts.SORT_ORDER")
            Toast.makeText(this, "Have SortOrder " + sortOrder.toString(), Toast.LENGTH_SHORT).show()
        } catch (e: Exception) {
            Toast.makeText(this, "No SortOrder " + e.message, Toast.LENGTH_SHORT).show()
            e.printStackTrace()
        }

获取联系人

获取联系人,按照默认排序,根据从上面拿到的 sortOrder看直接获取。当sortOrder能够拿到的时候在小米miui上面不是1则说明不是按照默认排序,那么使用 SORT_KEY_ALTERNATIVE 顺序获取联系人列表

    fun getContacts(): ArrayList<String> {
        // 联系人的Uri,也就是content://com.android.contacts/contacts
        val uri = ContactsContract.Contacts.CONTENT_URI
        //指定获取_id和display_name两列数据,display_name即为姓名
        val projection = arrayOf(ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME)
        val sortOrderStr = when(sortOrder){
            1 -> {
                ContactsContract.Contacts.SORT_KEY_PRIMARY + " COLLATE LOCALIZED asc"
            }
            else -> {
                ContactsContract.Contacts.SORT_KEY_ALTERNATIVE + " COLLATE LOCALIZED asc"
            }
        }

        val cursor = contentResolver.query(uri, projection, null, null, sortOrderStr)
        val arr = arrayListOf<String>()
        var i = 0
        if (cursor != null && cursor.moveToFirst()) {
            do {
                val id = cursor.getLong(0)
                // 获取姓名
                val name = cursor.getString(1)
                // 指定获取NUMBER这一列数据
                val phoneProjection = arrayOf(ContactsContract.CommonDataKinds.Phone.NUMBER)
                arr.add(i, id.toString() + " , 姓名:" + name)

                // 根据联系人的ID获取此人的电话号码
                val phonesCusor = this.contentResolver.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        phoneProjection,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
                        null,
                        null)

//                //因为每个联系人可能有多个电话号码,所以需要遍历
                if (phonesCusor != null && phonesCusor.moveToFirst()) {
//                    do {
                        val num = phonesCusor.getString(0)
                        arr[i] += " , 电话号码:$num"
//                        break
//                    } while (phonesCusor.moveToNext())
                }
                i++
            } while (cursor.moveToNext())
        }
        cursor.close()
        return arr
    }

相关文章

  • Android获取手机通讯录-根据排序方式进行

    在英文模式下可以进行更改联系人设置,由于安卓系统已经将获取联系人排序方式这个取消掉了,所以部分安卓手机也就没有提供...

  • Android通讯录(6.0)操作简介

    添加权限 Android6.0获取手机通讯录动态权限 获取权限回调 读取手机联系人通讯录 共享数据监听 注册监听通...

  • 2018-03-06

    Android获取手机通讯录信息 使用场景以及方向 可运用于所有的需要获取手机通讯录的app,例如消费金融的风控系...

  • 获取手机通讯录且排序

    嗯,获取通讯录还有问题,使用静态检查发现有内存泄漏的问题就先不写了先把排序加上去 //获取字符串(或汉字)首字母 ...

  • 常用的小方法(持续添加中...)

    1、数组套对象排序(根据对象内的某个键进行排序) 2、数组套对象去重(根据某个键值进行去重) 3、获取当前之前某天...

  • Mac 获取SHA1值

    Android 进行百度地图或高德地图相关开发需要获取SHA1值,SHA1值根据调试和发布有不同的值。获取方式: ...

  • 十月二十

    根据索引进行排序 ksort()根据索引进行升序排序 krsort()根据索引进行降序排序 $arr=array(...

  • Swift & OC 获取手机通讯录

    '获取手机通讯录,分为两种方式,一是跳转到系统的UI视图上进行选择,这种方式是不需要添加权限的,二是,自定义视图选...

  • iOS通讯录开发

    前言 记录下在应用内获取通讯录的相关知识点,涉及到通讯录权限配置,通讯录数据的获取以及数据按首字母排序。 系统通讯...

  • iOS最新获取手机通讯录方式

    一、iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面、联系人详情界面、添加联系人...

网友评论

      本文标题:Android获取手机通讯录-根据排序方式进行

      本文链接:https://www.haomeiwen.com/subject/fxttqqtx.html