将联系人另存为“电话联系人”

问题描述 投票:0回答:1

有没有办法以编程方式将联系人作为“电话联系人”添加到内部电话通讯录?

我已经尝试过:

list.add(ContentProviderOperation
                .newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build());

使用此参数,联系人成功保存到手机,但如果我将过滤器设置为“仅显示手机联系人”,则不会显示创建的联系人。顺便说一句,我读到,与

null
类型的联系人可能会失去干燥帐户同步(不记得完整案例)

然后我尝试从现有电话联系人中检索

ACCOUNT_TYPE
ACCOUNT_NAME
并获取
Phone
Local Phone Account
字符串,但是当我尝试使用相同参数保存联系人时:

list.add(ContentProviderOperation
                .newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "Phone")
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "Local Phone Account")
                .build());

结果与第一个

null
类型的案例相同。

是否有任何常量(或者应该是另一种方式)来保存“电话联系人”等数据?

android android-contacts contactscontract rawcontacts
1个回答
6
投票

普通

phone only
不完全支持“
Android
”帐户,它通常由设备制造商添加(或解锁)。

以下是我所知道的,如果您发现更多,请随时添加。
格式为

<maker>
:
ACCOUNT_TYPE
,
ACCOUNT_NAME

  1. 三星:“vnd.sec.contact.phone”:“vnd.sec.contact.phone”
  2. htc:“com.htc.android.pcsc:”pcsc”
  3. sony:“com.sonyericsson.localcontacts:“电话联系人”
  4. lge:“com.lge.sync:“电话”
  5. lge(选项 2):“com.lge.phone”
  6. t-mobile:“vnd.tmobileus.contact.phone:“MobileLife 联系人”
  7. huawei: "com.android.huawei.phone: "电话"
  8. lenovo:“本地电话帐户:“电话”
  9. xiaomi:“com.xiaomi”
  10. oppo:“com.oppo.contacts.device”
  11. xiaomi(选项 2):“com.android.contacts.default”
  12. 荣誉:“com.android.hihonor.phone”:“电话”

为了在您的设备上找到它们,您可以执行以下操作:

  1. 删除通讯录中的所有联系人。
  2. 运行下面的代码片段并保存列表以查看默认值。
  3. 使用设备的内置联系人应用程序创建新联系人并将其保存在设备存储中。
  4. 再次运行该代码片段,看看有什么不同

我想通过让代码创建新联系人,然后查询并删除它,可以减少步骤,但这种方法也应该很好用。如果有人可以用替代片段更新这个答案,我将不胜感激。

代码:

清单:

<uses-permission android:name="android.permission.READ_CONTACTS" />

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    val permissionsResultLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
        thread {
            contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null)!!.use { contactCursor ->
                val accountTypeColIdx =
                        contactCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)
                val accountNameColIdx =
                        contactCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)
                val accountTypes = HashSet<String>()
                Log.d("AppLog", "found accounts by query of contacts in address book:")
                while (contactCursor.moveToNext()) {
                    val accountType = contactCursor.getString(accountTypeColIdx)
                    if (!accountTypes.add(accountType))
                        continue
                    val accountName = contactCursor.getString(accountNameColIdx)
                    Log.d("AppLog", "accountName:$accountName accountType:$accountType")
                }
            }
        }
    }
    permissionsResultLauncher.launch(arrayOf(Manifest.permission.READ_CONTACTS, Manifest.permission.GET_ACCOUNTS))
}
© www.soinside.com 2019 - 2024. All rights reserved.