学会这招,让你轻松搞定 Android 开发通讯录更新

在Android开发中,通讯录更新是一个常见的需求,但很多新手开发者可能会觉得这个任务有点棘手。别担心,本文将带你一步步完成这个任务,从获取权限到查询数据,再到更新和保存,每个步骤都会有详细的代码实现和讲解。准备好了吗?让我们一起开始这段有趣的编程之旅吧!

获取通讯录读写权限

我们要确保应用有权限对通讯录进行操作。在AndroidManifest.xml文件中添加以下权限:

xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>

这段代码会向系统请求读取和写入通讯录的权限,确保应用能够对通讯录进行操作。别忘了,权限是基础,没有它,后面的操作都是白搭!

我们还需要在运行时动态请求权限。在Activity或Fragment中添加以下代码:

java
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
}

这段代码会检查应用是否已经拥有读取通讯录的权限,如果没有,就会弹出请求权限的对话框。用户同意后,我们才能继续下一步操作。

查询现有通讯录数据

获取权限后,我们就可以开始查询通讯录数据了。首先,在Activity或Fragment中定义一个方法来查询通讯录数据:

java
private void queryContacts() {
    ContentResolver contentResolver = getContentResolver();
    Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        do {
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Log.d("Contact", "ID: " + id + ", Name: " + name);
        } while (cursor.moveToNext());
        cursor.close();
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
  • 1.
  • 2.

}
}

这段代码使用ContentResolver通过查询ContactsContract.Contacts.CONTENT_URI来获取通讯录数据。然后,通过Cursor遍历查询结果,获取联系人的ID、姓名等信息。每个联系人的信息都会被打印出来,方便我们查看。

查询通讯录数据是更新操作的基础,只有了解了现有的数据,我们才能进行后续的更新操作。所以,这一步非常关键,一定要仔细检查每个联系人的信息是否正确。

更新通讯录数据

更新通讯录数据包括新增、修改和删除操作。以下是具体实现代码:

新增联系人:

java
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
private void queryContacts() {
    ContentResolver contentResolver = getContentResolver();
    Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, null);
    if (cursor != null && cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            // 获取联系人的ID
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            // 获取联系人的名字
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            // 其他信息的获取和处理...
        }
        cursor.close();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.build());
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "New Contact")
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890")
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

这段代码使用ContentProviderOperation构建一个操作列表,通过插入ContactsContract.RawContacts.CONTENT_URI和ContactsContract.Data.CONTENT_URI来新增联系人信息。其中,withValue方法用于设置联系人的名称、电话号码等信息。新增联系人后,通讯录中就会多出一个新的联系人。

修改联系人:

java
Uri updateUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
ContentValues values = new ContentValues();
values.put(ContactsContract.Contacts.DISPLAY_NAME, "Updated Name");
getContentResolver().update(updateUri, values, null, null);
private void addContact(String name, String phoneNumber) {
    ArrayList<ContentProviderOperation> operationList = new ArrayList<>();
    operationList.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
            .build());
    operationList.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .build());
    operationList.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
            .build());
    try {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

这段代码通过ContentUris.withAppendedId方法获取要修改的联系人的URI,然后使用ContentValues设置新的联系人名称,最后调用getContentResolver().update方法进行更新。修改联系人后,通讯录中的联系人名称就会更新为新的名称。

删除联系人:

java
Uri deleteUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
这段代码通过ContentUris.withAppendedId方法获取要删除的联系人的URI,然后调用getContentResolver().delete方法进行删除。删除联系人后,通讯录中就不会再有这个联系人了。
保存通讯录更新结果
更新通讯录数据后,我们需要保存更新结果。通常情况下,Android系统会自动保存更新结果,但我们也可以手动保存,以确保数据的一致性。

java

getContentResolver().notifyChange(ContactsContract.Contacts.CONTENT_URI, null);

这段代码会通知系统通讯录数据已经发生了变化,系统会自动更新通讯录的显示。这样,用户就能看到最新的通讯录数据了。

总结与思考

通过本文的介绍,你应该已经掌握了如何在Android开发中实现通讯录的更新操作。从获取权限到查询数据,再到更新和保存,每个步骤都有详细的代码实现和讲解。希望这篇文章能帮助你更好地理解和掌握Android开发中的通讯录更新操作。

private void updateContact(long contactId, String name, String phoneNumber) {
    ArrayList<ContentProviderOperation> operationList = new ArrayList<>();
    operationList.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(ContactsContract.Contacts._ID + "=?", new String[]{String.valueOf(contactId)})
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .build());
    operationList.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(ContactsContract.Contacts._ID + "=?", new String[]{String.valueOf(contactId)})
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber)
            .build());
    try {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
    } catch (Exception
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

现在,我想问你一个问题:在实际开发中,你遇到过哪些与通讯录更新相关的挑战?你是如何解决这些挑战的?欢迎在评论区分享你的经验和想法,让我们一起学习和进步!

THE END