Android原生联系人修改
Android native contact modification
我是 android 的新手,我正在使用本地联系人。
所以我的应用程序允许用户输入联系人显示名称及其号码 edit/delete。
万一联系人多于一个号码。
我试了很多但还是不行,应用程序仍然没有更新号码或崩溃。
我的理解是:
- 在联系人中查找与用户输入的姓名相匹配的姓名,并使用它来获取代表此联系人数据组的 contact_id。
- 使用 1. 中的 contact_id 和用户输入的数字来查找代表特定行 ID 的 ._ID。
- 使用我们从 2 获得的 ._ID 完成任务。
这是1.获取contact_id的代码:
public String getPeopleUniqueID(String name, Context context) {
String s = null;
String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" like'%" + name +"%'";
String[] projection = new String[] {ContactsContract.Data.CONTACT_ID};
Cursor c = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, selection, null, null);
if(c.moveToFirst()) {
s = c.getString(c.getColumnIndex(ContactsContract.Data.CONTACT_ID));
}
c.close();
return s;
}
这是 2. 获取 ._ID 的代码(num 是用户插入的数字,名称来自 1。> contact_id)
public String checkPhoneNumber(String num, String name, Context context) {
String s = null;
String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + "=?" + " AND "+ContactsContract.Data.CONTACT_ID+ "=?";
String[] projection = new String[] {ContactsContract.Data._ID};
Cursor c = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, selection, new String[]{u,name}, null);
if(c.moveToFirst()) {
s=c.getString(c.getColumnIndex(ContactsContract.Data._ID));
}
c.close();
if (s==null){
s = "null";
}
return s;
}
做编辑之类的事情(num 是我们从 2 得到的 _.ID,newnum 是用户想要更改的新号码)。
public void editNumber(String num , String newnum) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID + "=? AND " +
Data.MIMETYPE + "='" +
CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'",
new String[]{num})
.withValue(Data.DATA1, newnum)
.build());
try{
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);}
catch (RemoteException e){e.printStackTrace();}catch (OperationApplicationException e) {e.printStackTrace();}
}
当我调用 editNumber() 时它崩溃了。
你能帮我修正我的代码和我的理解吗?
还有一个问题,我可以 edit/insert 以编程方式为联系人分组,比如我想将此联系人添加到家人朋友或同事组(我们可以在联系人编辑页面设置的默认组) ?
使用 ContactsContract.Contacts.CONTENT_FILTER_URI 根据姓名搜索联系人 - 获取 ID 或其他任何内容。 like 运算符无法处理 CONTENT_FILTER_URI 处理的所有情况 - 对于各种语言、特殊字符等。
http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#CONTENT_FILTER_URI
使用以下 uri 从 phone 号码中查找联系人 - 您可以获得人员 ID 或其他任何内容:
Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(phoneNumber));
在set query中你也可以在condition中使用contactId
对于群组,如果默认的 mime 类型不适合您,您可以使用自定义 mime 类型(这对于跨不同帐户类型的群组来说仍然非常原始)
我是 android 的新手,我正在使用本地联系人。
所以我的应用程序允许用户输入联系人显示名称及其号码 edit/delete。
万一联系人多于一个号码。
我试了很多但还是不行,应用程序仍然没有更新号码或崩溃。
我的理解是:
- 在联系人中查找与用户输入的姓名相匹配的姓名,并使用它来获取代表此联系人数据组的 contact_id。
- 使用 1. 中的 contact_id 和用户输入的数字来查找代表特定行 ID 的 ._ID。
- 使用我们从 2 获得的 ._ID 完成任务。
这是1.获取contact_id的代码:
public String getPeopleUniqueID(String name, Context context) {
String s = null;
String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" like'%" + name +"%'";
String[] projection = new String[] {ContactsContract.Data.CONTACT_ID};
Cursor c = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, selection, null, null);
if(c.moveToFirst()) {
s = c.getString(c.getColumnIndex(ContactsContract.Data.CONTACT_ID));
}
c.close();
return s;
}
这是 2. 获取 ._ID 的代码(num 是用户插入的数字,名称来自 1。> contact_id)
public String checkPhoneNumber(String num, String name, Context context) {
String s = null;
String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + "=?" + " AND "+ContactsContract.Data.CONTACT_ID+ "=?";
String[] projection = new String[] {ContactsContract.Data._ID};
Cursor c = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, selection, new String[]{u,name}, null);
if(c.moveToFirst()) {
s=c.getString(c.getColumnIndex(ContactsContract.Data._ID));
}
c.close();
if (s==null){
s = "null";
}
return s;
}
做编辑之类的事情(num 是我们从 2 得到的 _.ID,newnum 是用户想要更改的新号码)。
public void editNumber(String num , String newnum) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID + "=? AND " +
Data.MIMETYPE + "='" +
CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'",
new String[]{num})
.withValue(Data.DATA1, newnum)
.build());
try{
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);}
catch (RemoteException e){e.printStackTrace();}catch (OperationApplicationException e) {e.printStackTrace();}
}
当我调用 editNumber() 时它崩溃了。
你能帮我修正我的代码和我的理解吗?
还有一个问题,我可以 edit/insert 以编程方式为联系人分组,比如我想将此联系人添加到家人朋友或同事组(我们可以在联系人编辑页面设置的默认组) ?
使用 ContactsContract.Contacts.CONTENT_FILTER_URI 根据姓名搜索联系人 - 获取 ID 或其他任何内容。 like 运算符无法处理 CONTENT_FILTER_URI 处理的所有情况 - 对于各种语言、特殊字符等。 http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#CONTENT_FILTER_URI
使用以下 uri 从 phone 号码中查找联系人 - 您可以获得人员 ID 或其他任何内容:
Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(phoneNumber));
在set query中你也可以在condition中使用contactId
对于群组,如果默认的 mime 类型不适合您,您可以使用自定义 mime 类型(这对于跨不同帐户类型的群组来说仍然非常原始)