wake-up-neo.com

Lesen Sie die Telefonnummern aller Kontakte in Android

Ich verwende diesen Code, um alle Kontaktnamen und Telefonnummern abzurufen:

String[] projection = new String[]
{
    People.NAME,
    People.NUMBER
};

Cursor c = ctx.getContentResolver().query(People.CONTENT_URI, projection, null, null, People.NAME + " ASC");
c.moveToFirst();

int nameCol = c.getColumnIndex(People.NAME);
int numCol = c.getColumnIndex(People.NUMBER);

int nContacts = c.getCount();

do
{
  // Do something
} while(c.moveToNext());

Dies gibt jedoch nur die Primärnummer für jeden Kontakt zurück, aber ich möchte auch die Sekundärnummern. Wie kann ich das machen?

68
shuwo

Sie können alle Telefonnummern, die einem Kontakt zugeordnet sind, auf folgende Weise lesen:

Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, personId);
Uri phonesUri = Uri.withAppendedPath(personUri, People.Phones.CONTENT_DIRECTORY);
String[] proj = new String[] {Phones._ID, Phones.TYPE, Phones.NUMBER, Phones.LABEL}
Cursor cursor = contentResolver.query(phonesUri, proj, null, null, null);

Beachten Sie, dass dieses Beispiel (wie Ihres) die veraltete Kontakt-API verwendet. Ab Eclair wurde dies durch die ContactsContract API ersetzt.

29
Graeme Duncan

Der folgende Code zeigt eine einfache Möglichkeit, alle Telefonnummern und Namen zu lesen:

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
  String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
  String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

}
phones.close();

HINWEIS: getContentResolver ist eine Methode aus dem Activity-Kontext.

144
Dinesh Kumar

Dieser Code zeigt, wie Sie für jeden Kontakt alle Rufnummern erhalten.

ContentResolver cr = getActivity().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
        String id = cur.getString(cur.getColumnIndex(
                  ContactsContract.Contacts._ID));
        String name = cur.getString(cur.getColumnIndex(
                  ContactsContract.Contacts.DISPLAY_NAME));
        if (Integer.parseInt(cur.getString(cur.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()) {
                  int phoneType = pCur.getInt(pCur.getColumnIndex(
                      ContactsContract.CommonDataKinds.Phone.TYPE));
                  String phoneNumber = pCur.getString(pCur.getColumnIndex(
                      ContactsContract.CommonDataKinds.Phone.NUMBER));
                  switch (phoneType) {
                        case Phone.TYPE_MOBILE:
                            Log.e(name + "(mobile number)", phoneNumber);
                            break;
                        case Phone.TYPE_HOME:
                            Log.e(name + "(home number)", phoneNumber);
                            break;
                        case Phone.TYPE_WORK:
                            Log.e(name + "(work number)", phoneNumber);
                            break;
                        case Phone.TYPE_OTHER:
                            Log.e(name + "(other number)", phoneNumber);
                            break;                                  
                        default:
                            break;
                  }
              } 
              pCur.close();
        }
    }
}
24
anivaler

Falls dies hilfreich ist, habe ich ein Beispiel, in dem die ContactsContract-API verwendet wird, um einen Kontakt zunächst anhand des Namens zu suchen. Anschließend werden die Details nach bestimmten Nummernarten durchsucht:

So verwenden Sie ContactsContract zum Abrufen von Telefonnummern und E-Mail-Adressen

14
AndroidRef.com
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
{
    System.out.println("name : " + name + ", ID : " + id);

    // get the <span id="IL_AD4" class="IL_AD">phone
    // number</span>
    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                           null, 
                           ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);

    while (pCur.moveToNext())
    {
        String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        System.out.println("phone" + phone);
    }

pCur.close();
10
user1554037

Sie können alle Telefonkontakte auf diese Weise abrufen:

    Cursor c = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] { ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.RawContacts.ACCOUNT_TYPE },
            ContactsContract.RawContacts.ACCOUNT_TYPE + " <> 'google' ",
            null, null);

vollständiges Beispiel prüfen HIER ...........

9
Gagan Deep

Auf die gleiche Weise erhalten Sie einfach ihre anderen Nummern unter Verwendung der anderen "People" -Referenzen

People.TYPE_HOME
People.TYPE_MOBILE
People.TYPE_OTHER
People.TYPE_WORK
1
Donal Rafferty

Dieses Eins gab mir schließlich die Antwort, die ich suchte. Sie können damit alle Namen und Telefonnummern der Kontakte auf dem Telefon abrufen.

package com.test;

import Android.app.Activity;
import Android.content.ContentResolver;
import Android.database.Cursor;
import Android.os.Bundle;
import Android.provider.ContactsContract;

public class TestContacts extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                              null, null, null, null);
        if (cur != null && cur.getCount() > 0) {
            while (cur.moveToNext()) {

                if (Integer.parseInt.equals(cur.getString(cur.getColumnIndex(
                            ContactsContract.Contacts.HAS_PHONE_NUMBER)))) {
                    String id = cur.getString(cur.getColumnIndex(
                                ContactsContract.Contacts._ID));
                    String name = cur.getString(cur.getColumnIndex(
                                ContactsContract.Contacts.DISPLAY_NAME));
                    Cursor pCur = cr.query(
                                           ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = ?", new String[] { id }, null);
                    int i = 0;
                    int pCount = pCur.getCount();
                    String[] phoneNum = new String[pCount];
                    String[] phoneType = new String[pCount];
                    while (pCur != null && pCur.moveToNext()) {
                        phoneNum[i] = pCur.getString(pCur.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.NUMBER));
                        phoneType[i] = pCur.getString(pCur.getColumnIndex(
                                ContactsContract.CommonDataKinds.Phone.TYPE));
                        i++;
                    }
                }

            }

        }

    }
}
1
craned

Angenommene Antwort funktioniert, aber keine eindeutigen Nummern.

Siehe diesen Code, es werden eindeutige Nummern zurückgegeben.

public static void readContacts(Context context) {
        if (context == null)
            return;
        ContentResolver contentResolver = context.getContentResolver();

        if (contentResolver == null)
            return;

        String[] fieldListProjection = {
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,
                ContactsContract.Contacts.HAS_PHONE_NUMBER
        };

        Cursor phones = contentResolver
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                        , fieldListProjection, null, null, null);
        HashSet<String> normalizedNumbersAlreadyFound = new HashSet<>();

        if (phones != null && phones.getCount() > 0) {
            while (phones.moveToNext()) {
                String normalizedNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER));
                if (Integer.parseInt(phones.getString(phones.getColumnIndex(
                        ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    if (normalizedNumbersAlreadyFound.add(normalizedNumber)) {
                        String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        Log.d("test", " Print all values");
                    }
                }
            }
            phones.close();
        }
    }
0
Yogesh Rathi

Code, um den Kontaktnamen (aufsteigende Reihenfolge) und die Nummer zu erhalten

Weitere Informationen: Kontakt in Listenansicht anzeigen

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");
        while (phones.moveToNext())
        {
            String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));


        }
        phones.close();
0
Parsania Hardik

Ich habe mein Bedürfnis nachgebessert

manifestberechtigungen

        <uses-permission Android:name="Android.permission.READ_CONTACTS" />
        <uses-permission Android:name="Android.permission.WRITE_CONTACTS"/>
        <!-- Read Contacts from phone -->
        <uses-permission Android:name="Android.permission.read_contacts" />
        <uses-permission Android:name="Android.permission.read_phone_state" />
        <uses-permission Android:name="Android.permission.READ_CALL_LOG" />

Hinweis: Nachdem Sie die Berechtigung zum Manifest erteilt haben, können einige Mobiltelefone dies ablehnen, wenn Sie dazu auf Einstellungen -> Anwendungen -> Ihre Anwendung klicken müssen. Klicken Sie darauf und Aktivieren Sie die erforderlichen Berechtigungen. 

 enter image description here

 btn_readallcontacks.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            List<User> userList = new ArrayList<User>();
            while (phones.moveToNext()) {
                User user = new User();
                user.setNamee(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
                user.setPhone(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                userList.add(user);
                Log.d(TAG, "Name : " + user.getNamee().toString());
                Log.d(TAG, "Phone : " + user.getPhone().toString());
            }
            phones.close();
        }
    });
0
Sam

Kontakte mit CursorLoader im Hintergrund laden:

  CursorLoader cursor = new CursorLoader(this, ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            Cursor managedCursor = cursor.loadInBackground();

            int number = managedCursor.getColumnIndex(ContactsContract.Contacts.Data.DATA1);
            int name = managedCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            int index = 0;
            while (managedCursor.moveToNext()) {
                String phNumber = managedCursor.getString(number);
                String phName = managedCursor.getString(name);
            }
0
AskQ