学会这招,让你轻松搞定 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.
现在,我想问你一个问题:在实际开发中,你遇到过哪些与通讯录更新相关的挑战?你是如何解决这些挑战的?欢迎在评论区分享你的经验和想法,让我们一起学习和进步!
作者:小蓝
链接:https://www.lanmiyun.com/content/2406.html
本站部分内容和图片来源网络,不代表本站观点,如有侵权,可联系我方删除。