正在为每个电话号码构建一个需要自定义联系人字段(“白名单”,如果您想知道)的应用程序。
但是,我只找到了一种方法,可以使用Data.RAW_CONTACT_ID
为每个联系人保存自定义数据,但不会为每个电话号码保存。我尝试使用Phone._id
,但我收到java.nullpointerexception
错误。
这是我现在的代码:
try{ //phoneId = get Phone._ID from cursor
ContentValues values = new ContentValues();
values.put(Data.DATA1, "yes");
int state = getContentResolver().update(Phone.CONTENT_URI, values, Phone._ID + " = "
+ phoneId + " AND " + Data.MIMETYPE + "='" + MIMETYPE_WHITELIST_CONTACT+"'", null);
if (state == 0) {
values.put(Phone._ID, phoneId);
values.put(Data.DATA1, "yes");
values.put(Data.MIMETYPE, MIMETYPE_WHITELIST_CONTACT);
getContentResolver().insert(Data.CONTENT_URI, values);
}
}catch (Exception e) {
Toast.makeText(ChooseContactsActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
有没有人知道需要更改哪些内容,因此可以保存电话号码的自定义字段,而不是联系人?
答案 0 :(得分:2)
尝试使用此代码添加自定义标签号。 这是我的应用程序中的工作代码...
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
if (CustomLabelNo != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, id)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, CustomLabelNo)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM)
.withValue(ContactsContract.CommonDataKinds.Phone.LABEL, "mayurbhola_newCustomTest").build());
}
描述: CustomLabelNo:您要在联系人中添加的任何数字。 ops:这是ArrayList。
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
[了解getContentResolver的参考链接]:http://developer.android.com/guide/topics/providers/content-providers.html 此代码用于添加联系人......
您可以根据需要添加其他类型的号码和显示名称。
答案 1 :(得分:0)
好吧,我明白了。也许有更好的解决方案,但这对我有用:
values.put(Data.RAW_CONTACT_ID, contactId);
values.put(Data.DATA1, phoneId);
values.put(Data.DATA2, "1");
values.put(Data.DATA5, phoneNum);
values.put(Data.MIMETYPE, MIMETYPE_WHITELIST_CONTACT);
getContentResolver().insert(Data.CONTENT_URI, values);
当我查询时,我只需要添加phoneId以获得我需要的结果:
getContentResolver().query(Data.CONTENT_URI, {Data.DATA1, Data.DATA2},
Data.RAW_CONTACT_ID + " = " + contactId + " AND " +
Data.DATA1 + " = " + phoneId + " AND " +
Data.MIMETYPE + "='" + MIMETYPE_WHITELIST_CONTACT+"'", null, null);
答案 2 :(得分:0)
This is how you do it if you want your custom label:
Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);
intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
ArrayList<ContentValues> data = new ArrayList<>();
ContentValues phonesRow = new ContentValues();
phonesRow.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
phonesRow.put(ContactsContract.CommonDataKinds.Phone.NUMBER,number);
phonesRow.put(ContactsContract.CommonDataKinds.Phone.LABEL,type); phonesRow.put(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM);
data.add(phonesRow);
答案 3 :(得分:-1)
由于班级联系人已弃用且已被ContactsContract取代,因此您最好尝试使用新版本。较新的API允许访问多个帐户并支持类似联系人的聚合。
对于新的Phone类,它已定义了三列。