我正在使用ContactsContract api intent来显示活动中的所有联系人.此意图返回联系人的ID.我需要获得此联系人的邮政地址.
这是我用于显示联系人的代码:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);
我在onActivityResult
函数中得到了结果.
请帮忙,我该怎么做.
我最近为我的应用创建了一个同步适配器,它将通过网络请求与手机中的联系人同步我获得的联系人.添加联系人没有问题,但是当联系信息发生变化时,我无法正确更新联系信息.例如联系人上的公司名称字段.以下是我尝试过的一些示例查询,这些查询无法正常工作或仅部分工作(即 - 某些联系人已更新但未正确):
ContentValues values = new ContentValues();
values.put(ContactsContract.CommonDataKinds.Organization.COMPANY, "New Company");
context.getContentResolver().update(Uri.parse("content://com.android.contacts/data/"), values, BaseColumns._ID + "=?", new String[] { String.valueOf(id) } );
Run Code Online (Sandbox Code Playgroud)
我也尝试按照android文档的建议批量执行此操作:
builder = ContentProviderOperation
.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(BaseColumns._ID + " =?", new String[]{String.valueOf(id)});
builder.withValue(
ContactsContract.CommonDataKinds.Organization.COMPANY,
"New Company Name!");
operationList.add(builder.build());
Run Code Online (Sandbox Code Playgroud)
我已阅读ContactContracts文档,最初是在阅读本教程.我也检查AuthenticatorActivity
了api中的示例无济于事.任何帮助是极大的赞赏.
我能够获得联系人列表及其基本信息,如:姓名.用于备份目的的电话,电子邮件,即时消息,备注,组织,ContactsContract.Contacts.CONTENT_URI
用于联系人列表以及针对不同信息类型的其他特定URI.
我需要,为了完全恢复所有信息两个字段:
ContactsContract.RawContacts.ACCOUNT_TYPE
ContactsContract.RawContacts.ACCOUNT_NAME
任何人都可以指导我如何获取此信息,知道来自ContactsContract.Contacts.CONTENT_URI的联系人ID?
谢谢
我需要对ContactsContract.Data
表进行查询,CONTACT_ID
列中的值将是不同的(不同的).
码:
final Uri uri = ContactsContract.Data.CONTENT_URI;
final String[] projection = new String[] {//
ContactsContract.Data.CONTACT_ID, //
ContactsContract.Data._ID, //
ContactsContract.Data.DISPLAY_NAME,//
ContactsContract.Data.LOOKUP_KEY //
};
final StringBuilder selectionBuilder = new StringBuilder();
selectionBuilder.append(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID);
selectionBuilder.append("= ? AND ");
selectionBuilder.append(ContactsContract.Data.MIMETYPE);
selectionBuilder.append("= ? ");
final String selection = selectionBuilder.toString();
final String[] selectionArgs = new String[] {//
String.valueOf(groupId), //
ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE //
};
return context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)
首先,我试图在投影中添加" DISTINCT
" ContactsContract.Data.CONTACT_ID
.但有一个例外:java.lang.IllegalArgumentException: Invalid column DISTINCT contact_id
然后,我这样写:
"'DISTINCT "+ContactsContract.Data.CONTACT_ID+"'".
java.lang.IllegalArgumentException: Invalid column …
Run Code Online (Sandbox Code Playgroud) 以下查询在我的设备上运行正常(API 15).它在运行API 8或API 10的模拟器中不起作用.
这是查询:
Cursor contactsCur = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] { ContactsContract.Data._ID,
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Organization.COMPANY,
ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.Data.LOOKUP_KEY,
ContactsContract.CommonDataKinds.Phone.NUMBER,
Contacts.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredPostal.CITY,
ContactsContract.CommonDataKinds.StructuredPostal.STREET,
ContactsContract.CommonDataKinds.StructuredPostal.REGION,
ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE},
ContactsContract.Data.HAS_PHONE_NUMBER + " >? ",
new String[] { "0" },
ContactsContract.Data.DISPLAY_NAME + " COLLATE NOCASE ASC");
Run Code Online (Sandbox Code Playgroud)
以下是它抛出的异常:
android.database.sqlite.SQLiteException: no such column: has_phone_number: , while compiling: SELECT _id, contact_id, display_name, data1, data2, lookup, data1, mimetype, mimetype, data7, data4, data8, data9 FROM view_data_restricted data WHERE (1) AND (has_phone_number >? ) ORDER BY display_name COLLATE NOCASE ASC …
android android-emulator contactscontract android-contacts android-sqlite
根据https://developer.android.com/guide/components/intents-common#Contacts上的官方文档
您可以使用选择意图
public void selectContact() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}
Run Code Online (Sandbox Code Playgroud)
}
有关在获取联系人URI后如何检索联系人详细信息的信息,请阅读检索联系人的详细信息。记住,当你检索联系人URI与上面的意图,你不会需要READ_CONTACTS权限读取该联系人的详细信息。
它指向https://developer.android.com/training/contacts-provider/retrieve-details以获取联系人的详细信息
当我按照上面链接中的说明进行操作时,我得到
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data from pid=5313, uid=10087 requires android.permission.READ_CONTACTS, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)
我试图通过获取联系方式
每一种方式都需要require android.permission.READ_CONTACTS异常。是否有一个示例可以按照文档中的说明工作?
最小,完整和可验证的示例,位于
https://github.com/aaronvargas/ContactsSSCCE
要测试是否使用READ_CONTACTS,必须在“系统应用设置”中进行更改
- 编辑
在Android问题跟踪器上通过https://issuetracker.google.com/issues/118400813创建了问题
android android-contentresolver contactscontract android-contacts android-permissions
我正在修改我的应用程序,以使用LOOKUP_KEY而不是API文档建议的_ID来存储有关联系人的信息.我遇到的唯一问题是我无法再加载联系人的照片.
有问题的代码是这样的:
InputStream s = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(), contactUri);
Run Code Online (Sandbox Code Playgroud)
这将返回以下错误: java.lang.IllegalArgumentException: URI: content://com.android.contacts/contacts/lookup/1424i118.2312i1220228108/photo
我用作参数的contactUri通过以下方式获取: Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, contact_key);
在这个例子中,contact_key
是1424i118.2312i1220228108
基于API文档,这个帮助方法应该适用于我正在使用的两个CONTENT_URI
或者CONTENT_LOOKUP_URI
.
有任何想法吗?谢谢.
我已经构建了一个联系人同步适配器.这一切都很好,但我还需要一件事.如果由于某种原因导致同步无法成功完成,我希望在同步失败时显示Google帐户显示的消息
android sync contactscontract android-syncadapter android-contacts
从API 14(Android 4.0以后)开始,我可以使用ContactsContract.Profile.CONTENT_URI
获取手机所有者的联系人资料Uri,并通过它获取他们的头像/联系人照片.
我想知道如何从API 8(Android 2.2)到API 13.我只需要照片(所以如果在API 14之前没有用户配置文件联系人的概念就可以了),尽管我是不能确定它实际上是可能的.
我正在尝试维护一个联系人数据库,并在 URI 中的某些内容发生更改时立即获取对添加/更新/删除的回调。
我写了一个 ContentObserver 来观察ContactsContract.Contacts.CONTENT_URI上的联系人。一旦联系人发生变化,我就会收到回调,然后通过检查ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP 来更新我的数据库。虽然这适用于添加/更新,但它不适用于删除联系人。
我不想解析内存中的所有联系人并检查 android 数据库。这需要时间和 CPU。
我知道这些类型存在许多问题,但我无法弄清楚删除联系人的具体内容。
是否存在执行此操作的方法?
android contacts contactscontract android-contacts contentobserver
android ×10
contactscontract ×10
contacts ×4
sync ×2
distinct ×1
rawcontacts ×1
sdk ×1
sql ×1
uri ×1