學(xué)會(huì)這招,讓你輕松搞定 Android 開發(fā)通訊錄更新
在Android開發(fā)中,通訊錄更新是一個(gè)常見的需求,但很多新手開發(fā)者可能會(huì)覺得這個(gè)任務(wù)有點(diǎn)棘手。別擔(dān)心,本文將帶你一步步完成這個(gè)任務(wù),從獲取權(quán)限到查詢數(shù)據(jù),再到更新和保存,每個(gè)步驟都會(huì)有詳細(xì)的代碼實(shí)現(xiàn)和講解。準(zhǔn)備好了嗎?讓我們一起開始這段有趣的編程之旅吧!
獲取通訊錄讀寫權(quán)限
我們要確保應(yīng)用有權(quán)限對(duì)通訊錄進(jìn)行操作。在AndroidManifest.xml文件中添加以下權(quán)限:
xml <uses-permission android:name="android.permission.READ_CONTACTS"/>
這段代碼會(huì)向系統(tǒng)請求讀取和寫入通訊錄的權(quán)限,確保應(yīng)用能夠?qū)νㄓ嶄涍M(jìn)行操作。別忘了,權(quán)限是基礎(chǔ),沒有它,后面的操作都是白搭!
我們還需要在運(yùn)行時(shí)動(dòng)態(tài)請求權(quán)限。在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); }
這段代碼會(huì)檢查應(yīng)用是否已經(jīng)擁有讀取通訊錄的權(quán)限,如果沒有,就會(huì)彈出請求權(quán)限的對(duì)話框。用戶同意后,我們才能繼續(xù)下一步操作。
查詢現(xiàn)有通訊錄數(shù)據(jù)
獲取權(quán)限后,我們就可以開始查詢通訊錄數(shù)據(jù)了。首先,在Activity或Fragment中定義一個(gè)方法來查詢通訊錄數(shù)據(jù):
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來獲取通訊錄數(shù)據(jù)。然后,通過Cursor遍歷查詢結(jié)果,獲取聯(lián)系人的ID、姓名等信息。每個(gè)聯(lián)系人的信息都會(huì)被打印出來,方便我們查看。
查詢通訊錄數(shù)據(jù)是更新操作的基礎(chǔ),只有了解了現(xiàn)有的數(shù)據(jù),我們才能進(jìn)行后續(xù)的更新操作。所以,這一步非常關(guān)鍵,一定要仔細(xì)檢查每個(gè)聯(lián)系人的信息是否正確。
更新通訊錄數(shù)據(jù)
更新通訊錄數(shù)據(jù)包括新增、修改和刪除操作。以下是具體實(shí)現(xiàn)代碼:
新增聯(lián)系人:
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()) { // 獲取聯(lián)系人的ID String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); // 獲取聯(lián)系人的名字 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構(gòu)建一個(gè)操作列表,通過插入ContactsContract.RawContacts.CONTENT_URI和ContactsContract.Data.CONTENT_URI來新增聯(lián)系人信息。其中,withValue方法用于設(shè)置聯(lián)系人的名稱、電話號(hào)碼等信息。新增聯(lián)系人后,通訊錄中就會(huì)多出一個(gè)新的聯(lián)系人。
修改聯(lián)系人:
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方法獲取要修改的聯(lián)系人的URI,然后使用ContentValues設(shè)置新的聯(lián)系人名稱,最后調(diào)用getContentResolver().update方法進(jìn)行更新。修改聯(lián)系人后,通訊錄中的聯(lián)系人名稱就會(huì)更新為新的名稱。
刪除聯(lián)系人:
java Uri deleteUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); 這段代碼通過ContentUris.withAppendedId方法獲取要?jiǎng)h除的聯(lián)系人的URI,然后調(diào)用getContentResolver().delete方法進(jìn)行刪除。刪除聯(lián)系人后,通訊錄中就不會(huì)再有這個(gè)聯(lián)系人了。 保存通訊錄更新結(jié)果 更新通訊錄數(shù)據(jù)后,我們需要保存更新結(jié)果。通常情況下,Android系統(tǒng)會(huì)自動(dòng)保存更新結(jié)果,但我們也可以手動(dòng)保存,以確保數(shù)據(jù)的一致性。
java
getContentResolver().notifyChange(ContactsContract.Contacts.CONTENT_URI, null);
這段代碼會(huì)通知系統(tǒng)通訊錄數(shù)據(jù)已經(jīng)發(fā)生了變化,系統(tǒng)會(huì)自動(dòng)更新通訊錄的顯示。這樣,用戶就能看到最新的通訊錄數(shù)據(jù)了。
總結(jié)與思考
通過本文的介紹,你應(yīng)該已經(jīng)掌握了如何在Android開發(fā)中實(shí)現(xiàn)通訊錄的更新操作。從獲取權(quán)限到查詢數(shù)據(jù),再到更新和保存,每個(gè)步驟都有詳細(xì)的代碼實(shí)現(xiàn)和講解。希望這篇文章能幫助你更好地理解和掌握Android開發(fā)中的通訊錄更新操作。
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.
現(xiàn)在,我想問你一個(gè)問題:在實(shí)際開發(fā)中,你遇到過哪些與通訊錄更新相關(guān)的挑戰(zhàn)?你是如何解決這些挑戰(zhàn)的?歡迎在評(píng)論區(qū)分享你的經(jīng)驗(yàn)和想法,讓我們一起學(xué)習(xí)和進(jìn)步!
作者:小藍(lán)
鏈接:http://www.haitaopa.cn/content/2406.html
本站部分內(nèi)容和圖片來源網(wǎng)絡(luò),不代表本站觀點(diǎn),如有侵權(quán),可聯(lián)系我方刪除。