我正在尝试在ContactsContract中创建一个用户配置文件...因为没有一个,我需要一个用于测试.我没有真实的Android设备,只有AVD模拟器进行测试.
这是我正在使用的代码块:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
    .withValue(RawContacts.ACCOUNT_TYPE, null)
    .withValue(RawContacts.ACCOUNT_NAME, null)
    .build());        
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID, 0)
    .withValue(Data.MIMETYPE, Profile.CONTENT_RAW_CONTACTS_URI)
    .withValue(Profile.IS_USER_PROFILE, 1)
    .build()); 
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID, 0)
    .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
    .withValue(StructuredName.DISPLAY_NAME, name)
    .build());
this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
如果删除用于使此条目成为用户配置文件的行,则它可以正常工作(即,将插入名称).但是,我无法弄清楚如何使用IS_USER_PROFILE标志设置条目.
您可以从应用程序创建用户配置文件吗?如果是这样,任何关于为什么这不起作用的想法?
非常感谢!斯科特
@ozmank给出了一个很好的指导 - 考虑从针对 API 级别 15-23 的应用程序添加更新的工作示例
我主要在三星设备上遇到这个问题 - 该配置文件不存在,当它存在时可以将其删除。
添加到 AndroidManifest.xml使用WRITE_PROFILE的权限
<uses-permission android:name="android.permission.WRITE_PROFILE"/>
创建属于配置文件的空原始联系人 - 这将生成配置文件条目
ContentValues values = new ContentValues();            
context.getContentResolver().insert(Profile.CONTENT_RAW_CONTACTS_URI, values);
从返回的 Uri 中,您可以查询原始联系人条目。
注意- 这不会将信息添加到配置文件中,因此如果您使用以下命令查询配置文件中的信息
Uri uri = Uri.withAppendedPath(Profile.CONTENT_URI, Contacts.Data.CONTENT_DIRECTORY);
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
结果光标将为空,也许如果您决定再次运行 #2 中的代码并进入股票联系人应用程序,您将在我的个人资料下看到多个空条目-所以我的建议是将我的个人资料保留为在创建新的原始联系人之前,尽可能清理并跟踪您创建的原始联系人并检查它是否仍然有效。
Uri uri = Uri.withAppendedPath(Profile.CONTENT_RAW_CONTACTS_URI, String.valueOf(lastLocalProfileManualRawId));
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
if (cursor != null && cursor.getCount() > 0){
    // The profile exists
} else {
    // Create a new raw contact
}