【问题标题】:How do I create a user profile in ContactsContract?如何在 ContactsContract 中创建用户个人资料?
【发布时间】:2017-02-23 03:45:30
【问题描述】:

我正在尝试在 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 标志设置条目。

您可以从应用程序创建用户个人资料吗?如果是这样,关于为什么这不起作用的任何想法?

非常感谢! 斯科特

【问题讨论】:

  • 我正在努力解决同样的问题。当不存在时,我似乎无法添加个人资料联系人! (请参阅我的问题:stackoverflow.com/questions/33981594/…)你是如何解决这个问题的?

标签: android


【解决方案1】:

@ozmank 给出了一个很好的指导 - 考虑从针对 API 级别 15-23 的应用添加一个更当前的工作示例

我主要在 Samsung 设备上遇到此问题 - 其中配置文件不存在,但可以在存在时将其删除。

  1. WRITE_PROFILE

    添加到 AndroidManifest.xml uses-permission
    <uses-permission android:name="android.permission.WRITE_PROFILE"/>
    
  2. 创建一个属于个人资料的空原始联系人 - 这将生成个人资料条目

    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
}

【讨论】:

    【解决方案2】:

    var values = new ContentValues (); values.Put (ContactsContract.Contacts.InterfaceConsts.is_user_profile,"1"); ontentResolver.Update(ContactsContract.Profile.ContentRawContactsUri,values, null, null);

    【讨论】:

    • 那是新的还是旧的 API?我正在运行 API 15 (4.0.3),并且 API 中没有 ContactsContract.Contacts.InterfaceConsts.is_user_profile。
    • 在 API 级别 14 中添加
    【解决方案3】:

    在模拟器中运行 Contacts 应用并使用它设置您的个人资料。

    您可能需要先添加一个常规联系人,然后才能看到“设置我的个人资料”选项。
    对我来说,“添加帐户”按钮什么也没做,但屏幕右下角的 fab 按钮开始添加新的常规联系人。

    添加联系人后,点击返回返回主屏幕。现在,它会列出您刚刚添加的联系人以及“ME”组中的“设置我的个人资料”选项,而不是说您没有联系人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多