ANDROID之擷取連絡人

來源:互聯網
上載者:User

標籤:

Android入門中,記錄學習中的遇到的問題和一些個人總結。

連絡人資料庫路徑為:/data/data/com.android.providers.contacts/database/contacts2.db

許可權問題:安卓6.0以上只是在XML中寫入權限還不夠,代碼中也需要寫。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
  requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 10);
}

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  if (requestCode == 10) {
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      //有許可權,可以進行擷取連絡人操作
    } else {
      Toast.makeText(this, "您阻止了許可權", Toast.LENGTH_SHORT).show();
    }
}


第一種方法,代碼也最簡潔,SORT_KEY_PRIMARY還能按中文名字拼音排序,個人推薦:
 1 Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, Phone.SORT_KEY_PRIMARY); 2         if (cursor != null) { 3             while (cursor.moveToNext()) { 4                 ContactBean contact = new ContactBean(); 5                 contact.setName(cursor.getString(0)); 6                 contact.setPhone(cursor.getString(1)); 7                 lists.add(contact); 8             } 9             cursor.close();10         }

第二種方法:可根據連絡人id擷取相關資訊

 1 Uri uri = Uri.parse("content://com.android.contacts/contacts"); 2         ContentResolver resolver = context.getContentResolver(); 3         Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null); 4         if (cursor != null && cursor.getCount() > 0){ 5             while (cursor.moveToNext()) { 6                 Contact contact = new Contact(); 7                 int contactId = cursor.getInt(0); 8                 uri = Uri.parse("content://com.android.contacts/contacts/" + contactId + "/data"); 9                 Cursor cursor1 = resolver.query(uri, new String[]{"mimetype", "data1"}, null, null, null);10                 if (cursor1 != null && cursor1.getCount() > 0){11                     while (cursor1.moveToNext()) {12                         String mimeType = cursor1.getString(0);13                         String data1 = cursor1.getString(1);14                         if ("vnd.android.cursor.item/name".equals(mimeType)) { //是姓名15                             contact.setName(data1);16                         } else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)) { //手機17                             contact.setPhone(data1);18                         }19                     }20                     cursor1.close();21                     lists.add(contact);22                 }23             }24             cursor.close();25         }

 

第三種方法:跟第二種方法比較,只有第二個uri不同,(PS:此方法有BUG,擷取到一部分人的資料為NULL,但連絡人總數是一樣的。據說是因為以前刪除過連絡人,本人手機未ROOT,也沒法看資料庫表的資料,希望有人能給個解釋)

 1 Uri uri4Contacts = Uri.parse(ContactsContract.AUTHORITY_URI + "/contacts"); 2         Uri uri4Data = Uri.parse(ContactsContract.AUTHORITY_URI + "/data"); 3         List<Contact> lists = new ArrayList<>(); 4         Cursor cursor1 = context.getContentResolver().query(uri4Contacts, new String[]{"_id"}, null, null, null); 5         if (cursor1.moveToNext()) { 6             Contact contact = new Contact(); 7             String id = cursor1.getString(0); 8             Cursor cursor2 = context.getContentResolver().query(uri4Data, new String[]{"data1", "mimetype"}, "row_contact_id = ?", new String[]{id}, null); 9             if (cursor2.moveToNext()) {10                 String data = cursor2.getString(0);11                 String mimetype = cursor2.getString(1);12                 if (mimetype.equals("vnd.android.cursor.item/name")) {13                     contact.setName(data);14                 } else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {15                     contact.setPhone(data);16                 }17             }18         }

ANDROID之擷取連絡人

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.