Android получает все телефонные номера контактов в ArrayList

Я пытаюсь сохранить все телефонные номера контактов в ArrayList, но я не могу найти способ. Есть ли способ получить их, а не собирать их один за другим с помощью ContactsContract?

Solutions Collecting From Web of "Android получает все телефонные номера контактов в ArrayList"

ContentResolver cr = mContext.getContentResolver(); //Activity/Application android.content.Context Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if(cursor.moveToFirst()) { ArrayList<String> alContacts = new ArrayList<String>(); do { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ id }, null); while (pCur.moveToNext()) { String contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); alContacts.add(contactNumber); break; } pCur.close(); } } while (cursor.moveToNext()) ; } 

Попробуй это:

 Cursor managedCursor = getContentResolver() .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, Phone.DISPLAY_NAME + " ASC"); 

И, пройдя через курсор, вы можете хранить все эти данные в любой структуре данных по вашему выбору.

Этот код будет работать намного быстрее, чем код в ответе, потому что вы не делаете дополнительный запрос для каждого контакта.

 private static final String CONTACT_ID = ContactsContract.Contacts._ID; private static final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; private static final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; private static final String PHONE_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; public static ArrayList<String> getAll(Context context) { ContentResolver cr = context.getContentResolver(); Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{PHONE_NUMBER, PHONE_CONTACT_ID}, null, null, null ); if(pCur != null){ if(pCur.getCount() > 0) { HashMap<Integer, ArrayList<String>> phones = new HashMap<>(); while (pCur.moveToNext()) { Integer contactId = pCur.getInt(pCur.getColumnIndex(PHONE_CONTACT_ID)); ArrayList<String> curPhones = new ArrayList<>(); if (phones.containsKey(contactId)) { curPhones = phones.get(contactId); } curPhones.add(pCur.getString(pCur.getColumnIndex(PHONE_NUMBER))); phones.put(contactId, curPhones); } Cursor cur = cr.query( ContactsContract.Contacts.CONTENT_URI, new String[]{CONTACT_ID, HAS_PHONE_NUMBER}, HAS_PHONE_NUMBER + " > 0", null,null); if (cur != null) { if (cur.getCount() > 0) { ArrayList<String> contacts = new ArrayList<>(); while (cur.moveToNext()) { int id = cur.getInt(cur.getColumnIndex(CONTACT_ID)); if(phones.containsKey(id)) { contacts.addAll(phones.get(id)); } } return contacts; } cur.close(); } } pCur.close(); } return null; } 

Попробуйте также получить все контакты.

 Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, null , null , null, "upper("+Phone.DISPLAY_NAME + ") ASC");