Android原生联系人修改

Android native contact modification

我是 android 的新手,我正在使用本地联系人。

所以我的应用程序允许用户输入联系人显示名称及其号码 edit/delete。

万一联系人多于一个号码。

我试了很多但还是不行,应用程序仍然没有更新号码或崩溃。

我的理解是:

  1. 在联系人中查找与用户输入的姓名相匹配的姓名,并使用它来获取代表此联系人数据组的 contact_id。
  2. 使用 1. 中的 contact_id 和用户输入的数字来查找代表特定行 ID 的 ._ID。
  3. 使用我们从 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 类型(这对于跨不同帐户类型的群组来说仍然非常原始)