如果您尝试使用Android 2.2 Froyo附带的联系人管理器,它将允许您通过Contact ContentProvider访问sqlite数据库中的所有联系人.但是,如果您编写的应用程序不是com.android.contacts,则只能访问受限制的表,因为此处的代码如下:
如果您尝试任何类似ContactManager或市场上的任何应用程序的示例,则无法访问完整的联系人列表,只能访问受限制的视图.
限制表似乎只包含电话号码的联系人,并排除了一些Facebook联系人.我找不到任何关于为何在开发人员文档中限制联系人的文档?
除了手动或使用自定义固件生根和打开sqlite数据库之外,还有其他解决方法吗?
每个联系人都没有时间戳吗?
我需要通过更改(添加,删除或更改)通知联系人.我已经实现了一个ContentObserver
,但通过这种方法,我只能在联系人发生更改时收到通知,但我不知道哪个联系人已被修改!有什么建议?
android contacts contactscontract android-contacts contentobserver
我想创建一个包含给定名称,姓氏和手机号码的Cursor.这些列不是位于ContactsContract下可用的任何容器中,我能够获得此信息的唯一方法是首先获取名称的光标,然后通过为每个联系人创建单独的光标来获取电话号码.这个解决方案迫使我将数据读取到本地数据结构,而不是仅使用光标上的适配器,并且会产生大量的性能开销(大约约5秒,带有约140个电话号码的联系人).
有没有办法创建两个游标然后加入表?或者还有其他方法吗?在过去的两天里,我一直在努力解决这个问题并阅读我在谷歌上找到的所有内容,但实际上我也无法获得任何工作.这真的不可能,或者是不是?
提前致谢!
如何使用您自己的应用程序(并使用Android Beam)将联系人发送到另一台设备并将其保存在其联系人列表中(即默认联系人应用程序).发送设备上的联系人将由ContactsContract
提供商提供.
我最好不要让其他设备运行我的应用程序.内置联系人应用程序(Android的默认应用程序)可以发送和接收联系人.因此,应该可以使用自定义应用程序将联系人发送到内置联系人应用程序.
目前,我的应用程序将通过电话号码搜索联系人,然后将其显示在新活动(即内置联系人应用程序)中.见下文.
Uri uri = Uri.fromParts("tel", number.getText().toString(), "");
Log.d("ContactPicker", uri.toString());
startActivity(new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, uri));
// Example log message for the number (123)-123-1234 is "tel:(123)%20123-1234"
Run Code Online (Sandbox Code Playgroud)
我更喜欢这样做,但不要认为这是可能的,因为我无法返回找到的联系人(或者如果找不到现有的联系人,则返回创建的联系人).如果我想要发送特定联系人,我需要这些信息.
我可能需要查询所有联系人,找到我正在寻找的联系人并保存其ID.
注意:我正在使用API 14
我做了一个概念证明应用程序,它执行此操作:https://github.com/dideler/HiFive
该应用程序可能是错误的.它没有维护,但欢迎拉取请求.
是否可以使用ContactsContract获取用户经常交谈的联系人?
我知道我可以使用CallLog ContentProvider并尝试找出答案,但是我想知道是否已经有办法做到这一点。
我的应用程序将手机上的所有联系人与服务器"同步".但是,部分要求是,如果插入,更新或删除任何联系人,则必须再次进行同步以保持数据完整性.我知道注册一个ContentObserver
on ContactsContract.Contacts.CONTENT_URI
,但任何这样的观察者都必须在Activity上取消注册onPause()
,因此如果该应用程序当时没有运行则不会收到通知.
我也不想在服务中实现内容观察者,因为服务也不是永久性的.另外,我不喜欢24x7全天候运行的想法.
那么,有什么方法可以检测到自同步后联系人已经改变了吗?我不需要实时通知,所以只有在下次运行应用程序时才会发生此检测.
我在我的应用程序中显示那些联系人时遇到问题,这些联系人位于我手机的地址簿中.
从谷歌联系人应用程序我发现了许多不同的版本,如何查询这些联系人:
不使用选择
Uri uri = ContactsContract.CONTACT.CONTENT_URI;
getActivity().getContentResolver().query(uri,PROJECTION, null, null, null);
Run Code Online (Sandbox Code Playgroud)仅使用具有可见组= = 1的联系人
Uri uri = ContactsContract.CONTACT.CONTENT_URI;
String selection = Contacts.IN_VISIBLE_GROUP + "=1"
getActivity().getContentResolver().query(uri,PROJECTION, selection, null, null);
Run Code Online (Sandbox Code Playgroud)或者使用目录查询参数
Uri uri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)).build();
getActivity().getContentResolver().query(uri, PROJECTION, null, null, null);
Run Code Online (Sandbox Code Playgroud)最后一次提供最佳结果,但没有任何查询真正令人满意!:(我在不同的设备上测试了所有这些,但从来没有能够准确地获得电话簿中的联系人数量.
有人有一个想法,为什么没有查询适用于所有设备?
以下是我的测试结果:
================================================== ===============
| 设备\选择| 电话簿 | 不(1)| 可见组(2)| Directory.Default(3)|
================================================== ===============
| Galaxy S | 288 | 302 | 288 | …
我的应用数据库中存储的数字很少.我想在联系人应用中匹配这些数字并更新与mimetype的联系.基本上是Whatsapp的作用.他们同步所有联系人,他们的应用程序图标联系.
我已完成同步部分,如果我添加新的联系人,那么我可以在联系人中显示我的应用程序图标.但我的要求是只更新现有联系人.
这是我试图更新联系人,
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
.withValueBackReference(Data.RAW_CONTACT_ID,id)
.withValue(Data.MIMETYPE, MIMETYPE)
.withValue(Data.DATA1, "Username")
.withValue(Data.DATA2, "Ite's Me")
.build());
try {
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
而且rawContactid
我从中获取
Cursor cursor = context.getContentResolver().query(Data.CONTENT_URI, new String[] {Data.RAW_CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.CONTACT_ID },
ContactsContract.CommonDataKinds.Phone.NUMBER + "= ?",
new String[] {phonenumb}, null);
Run Code Online (Sandbox Code Playgroud)
我无法在该联系人中添加连接.我究竟做错了什么.有人可以帮我这个.
提前致谢.
android contactscontract android-syncadapter android-contacts rawcontactid
/**
* Account type id
*/
public static final String ACCOUNT_TYPE = "com.test.app";
/**
* Account name
*/
public static final String ACCOUNT_NAME = "Test";
public static void addContact(Context context, User contact) {
ContentResolver resolver = context.getContentResolver();
resolver.delete(RawContacts.CONTENT_URI, RawContacts.ACCOUNT_TYPE
+ " = ?", new String[] { AccountConstants.ACCOUNT_TYPE });
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newInsert(
addCallerIsSyncAdapterParameter(
RawContacts.CONTENT_URI, true))
.withValue(RawContacts.ACCOUNT_NAME,
AccountConstants.ACCOUNT_NAME)
.withValue(RawContacts.ACCOUNT_TYPE,
AccountConstants.ACCOUNT_TYPE)
// .withValue(RawContacts.SOURCE_ID, 12345)
// .withValue(RawContacts.AGGREGATION_MODE,
// RawContacts.AGGREGATION_MODE_DISABLED)
.build());
ops.add(ContentProviderOperation
.newInsert(
addCallerIsSyncAdapterParameter(Settings.CONTENT_URI,
true))
.withValue(RawContacts.ACCOUNT_NAME,
AccountConstants.ACCOUNT_NAME)
.withValue(RawContacts.ACCOUNT_TYPE,
AccountConstants.ACCOUNT_TYPE)
.withValue(Settings.UNGROUPED_VISIBLE, 1).build()); …
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码从android联系人中检索名字和姓氏.DISPLAY_NAME给出了联系人的姓名,而firstname和lastname分别返回1和null.以下是代码.
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = ?", new String[] { id }, null);
while (pCur.moveToNext()) {
String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String firstname = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String lastname = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
System.out.println("firstname and lastname" + firstname+ " "+lastname);
phoneNo = phoneNo.replaceAll("\\D", "");
names.add(name);
phnno.add(phoneNo);
}
pCur.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我将行cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI)更改为cr.query(ContactsContract.Data.CONTENT_URI)时,我将日志更改为 …
android ×10
contactscontract ×10
android-beam ×1
calllog ×1
contact-list ×1
contacts ×1
nfc ×1
rawcontactid ×1