我有一个"转储"实用程序,我用它来研究ContactsContract,因为我没有在文档中得到它.当我转储联系人时,它会计算表中的263条记录,但是,我的设备上的联系人应用程序列出了我有244条("显示244个联系人".)
有人可以解释这种差异吗?
我的Sprint LG的联系人应用程序为我同步的每个帐户都有显示选项,我已经进入并检查了所有帐户,因此不应该进行任何过滤.
我在该实用程序中使用的主要URI是:
Uri uriRawContacts = ContactsContract.RawContacts.CONTENT_URI;
String[] projection = new String [] {
ContactsContract.RawContactsEntity._ID,
ContactsContract.RawContactsEntity.CONTACT_ID,
ContactsContract.RawContactsEntity.DELETED,
ContactsContract.RawContactsEntity.AGGREGATION_MODE,
};
Cursor cursorRaw = cr.query(uriRawContacts, projection, null, null, null);
DumpCursor.dumpAnyCursor(getApplicationContext(), "RawContacts", cr, cursorRaw, ",");
Run Code Online (Sandbox Code Playgroud)
接下来是(对于上面的查询中的每个_ID):
long rawContactId = Long.parseLong(anyCursor.getString(anyCursor.getColumnIndex(RawContacts.CONTACT_ID)));
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
Log.d(TAG, "rawContactUri: " + rawContactUri.toString());
Log.d(TAG, "entityUri: " + entityUri.toString());
Cursor c = cr.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null);
Run Code Online (Sandbox Code Playgroud)
然后我遍历第一个查询,显示我的投影中的所有列,然后,使用第一个查询循环中的_ID字段,我发出第二个查询并转储其所有列.
为方便起见,答案中的子弹转换到此处: 有关详细说明,请参阅参考.更具体地说,建议您阅读有关聚合规则的内容. 参考:点击此处查看随后的原始引用文本
- 联系人数据库分为3个表联系人,原始联系人和数据. …
我正在尝试向现有联系人添加新的RawContact,以便我的自定义数据字段显示在原始联系人中.我尝试将StructuredName数据行添加到我的新RawContact,其DisplayName与原始RawContact的DisplayName相匹配.我认为匹配的DisplayNames足以聚合两个RawContacts但联系人应用程序似乎将RawContacts显示为不同的联系人.
这是我的代码
public static void addContact(Context context, Account account, String number, String displayname) {
Log.e(Global.TAG, "adding contact: " + number + " / " + displayname);
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
//Create our RawContact
ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
builder.withValue(RawContacts.ACCOUNT_NAME, account.name);
builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);
operationList.add(builder.build());
//Create a Data record of common type 'StructuredName' for our RawContact
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, 0);
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayname);
operationList.add(builder.build());
//Create a Data record of custom type "vnd.android.cursor.item/vnd.be.ourservice.profile" to display a link to the profile
builder …Run Code Online (Sandbox Code Playgroud) 我正在进行联系人备份和同步.
目标是将所有联系人的所有详细信息发送到服务器(定义的自定义协议)作为备份.
在首次启动应用程序期间,所有联系人都将排队并发送到服务器.之后,后台服务将一直运行,将收听新的联系人添加/联系人更新,这个新的/更新的联系人将由后台服务发送到服务器.
我正在使用RawContactsEntity来获取记录.
我尝试ContentObserver在RawContacts/Data表上使用以获取联系人添加或联系人更改的通知.但是,AFAIK,在整个表格中ContentObserver给出onChange()了已更改数据的通知(),而不是单个记录的ID.
现在我的问题是,如何获得更改/新记录的确切ID?
我想创建一个备份表来与本机联系人表进行比较并获取更改的记录.但随着接触次数的增加,性能会急剧下降,这也会妨碍电池的使用寿命.
你能否建议我,从性能和内存使用的角度来看,实现这种联系备份操作的最佳方法是什么?联系人同步操作还有其他方法吗?
如果有人可以分享可以帮助我的例子,将会非常有帮助.
android contacts rawcontacts android-contacts contentobserver
我能够获得联系人列表及其基本信息,如:姓名.用于备份目的的电话,电子邮件,即时消息,备注,组织,ContactsContract.Contacts.CONTENT_URI用于联系人列表以及针对不同信息类型的其他特定URI.
我需要,为了完全恢复所有信息两个字段:
ContactsContract.RawContacts.ACCOUNT_TYPE
ContactsContract.RawContacts.ACCOUNT_NAME
任何人都可以指导我如何获取此信息,知道来自ContactsContract.Contacts.CONTENT_URI的联系人ID?
谢谢
我成功地将联系人插入到地址簿中,我需要在我的应用程序中保存联系人的参考.我认为保存引用的最佳方法是获取RawContacts ID本身.
有没有办法让我在插入新联系人后立即从地址簿中取回ID?或者我是否必须获取所有记录并将其与我的数据进行比较以获取RawContacts ID?
我使用此代码执行插入操作:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED)
.build());
Run Code Online (Sandbox Code Playgroud)
我感谢任何输入,无论是变通方法还是API.谢谢!
有没有办法以编程方式将联系人添加到内部电话通讯录中作为“电话联系人”?
我试过了:
list.add(ContentProviderOperation
.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
Run Code Online (Sandbox Code Playgroud)
使用此参数,联系人成功保存到手机,但如果我将过滤器设置为“仅显示手机联系人” - 不会显示创建的联系人。顺便说一句,我读过nulltype 的联系人可能会丢失干燥帐户同步(不记得完整的案例)
然后我尝试从现有的电话联系人中检索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());
Run Code Online (Sandbox Code Playgroud)
结果与nulltype的第一种情况相同。
是否有任何常量(或者应该是另一种方式)来保存“电话联系人”等数据?