有没有办法以编程方式将联系人作为“电话联系人”添加到内部电话通讯录?
我已经尝试过:
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
类型的案例相同。
是否有任何常量(或者应该是另一种方式)来保存“电话联系人”等数据?
普通
phone only
不完全支持“Android
”帐户,它通常由设备制造商添加(或解锁)。
以下是我所知道的,如果您发现更多,请随时添加。
格式为
<maker>
: ACCOUNT_TYPE
, ACCOUNT_NAME
为了在您的设备上找到它们,您可以执行以下操作:
我想通过让代码创建新联系人,然后查询并删除它,可以减少步骤,但这种方法也应该很好用。如果有人可以用替代片段更新这个答案,我将不胜感激。
代码:
清单:
<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))
}