美文网首页
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获取手机通讯录-根据排序方式进行

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