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äre Nummer für jeden Kontakt zurück, aber ich möchte auch die sekundären Nummern erhalten. Wie kann ich das machen?
Antworten:
Sie können alle mit einem Kontakt verknüpften Telefonnummern folgendermaßen 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);
Bitte beachten Sie, dass dieses Beispiel (wie Ihr Beispiel) die veraltete Kontakt-API verwendet. Ab Eclair wurde dies durch die ContactsContract- API ersetzt.
quelle
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();
quelle
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
bekomme ich 361 Kontakt,ContactsContract.Contacts.CONTENT_URI
bekomme aber 5115 Kontakt! Was ist die Differenz?!Dieser Code zeigt, wie Sie alle Telefonnummern für jeden Kontakt 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(); } } }
quelle
Falls es hilft, habe ich ein Beispiel, das die ContactsContract-API verwendet, um zuerst einen Kontakt anhand seines Namens zu finden, und dann die Details durchläuft, um nach bestimmten Nummerntypen zu suchen:
Verwendung von ContactsContract zum Abrufen von Telefonnummern und E-Mail-Adressen
quelle
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();
quelle
Sie können alle Telefonkontakte wie folgt 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);
Das vollständige Beispiel finden Sie HIER ...........
quelle
Auf die gleiche Weise erhalten Sie einfach ihre anderen Nummern unter Verwendung der anderen "Personen" -Referenzen
People.TYPE_HOME People.TYPE_MOBILE People.TYPE_OTHER People.TYPE_WORK
quelle
Sie können alle Kontakte, die keine Nummer haben, und alle, die keinen Namen haben, aus diesem Code erhalten
public void readContacts() { ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY + " ASC"); ContactCount = cur.getCount(); 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)); String phone = null; if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { System.out.println("name : " + name + ", ID : " + id); // get the phone number Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); while (pCur.moveToNext()) { phone = pCur.getString( pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println("phone" + phone); } pCur.close(); } if (phone == "" || name == "" || name.equals(phone)) { if (phone.equals("")) getAllContact.add(new MissingPhoneModelClass("No Number", name, id)); if (name.equals("") || name.equals(phone)) getAllContact.add(new MissingPhoneModelClass(phone, "No Name", id)); } else { if(TextUtils.equals(phone,null)){ getAllContact.add(new MissingPhoneModelClass("No Number", name, id)); } else { getAllContact.add(new MissingPhoneModelClass(phone, name, id)); } } } } }
Eine Sache, die Sie tun können, ist, dass Sie im Manifest die Berechtigung für den Kontakt READ and WRITE erteilen müssen. Danach können Sie die Modellklasse für die Liste erstellen, mit der der gesamte Kontakt hier hinzugefügt werden kann, ist die Modellklasse
public class PhoneModelClass { private String number; private String name; private String id; private String rawId; public PhoneModelClass(String number, String name, String id, String rawId) { this.number = number; this.name = name; this.id = id; this.rawId = rawId; } public PhoneModelClass(String number, String name, String id) { this.number = number; this.name = name; this.id = id; } public String getRawId() { return rawId; } public void setRawId(String rawId) { this.rawId = rawId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
Genießen :)
quelle
Das eine gab mir schließlich die Antwort , die ich suchte. Hier können Sie 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++; } } } } } }
quelle
Ich habe mein Bedürfnis unten behoben
Manifest-Berechtigungen
<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 im Manifest Berechtigungen erteilt haben, können einige Mobiltelefone dies verweigern, wenn Sie Einstellungen -> Anwendungen -> suchen müssen. Klicken Sie darauf und aktivieren Sie die erforderlichen Berechtigungen
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(); } });
quelle
Akzeptierte Antwort funktioniert, aber keine eindeutigen Nummern.
Siehe diesen Code, er gibt eindeutige Nummern zurück.
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(); } }
quelle
Laden Sie Kontakte im Hintergrund mit CursorLoader:
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); }
quelle
So verwenden Sie die
ContentsContract
API, um Ihre Kontakte in Ihrem Telefonbuch abzurufen. Sie müssen diese Berechtigungen in Ihre hinzufügenAndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
Anschließend können Sie diese Methode ausführen, um alle Ihre Kontakte zu durchlaufen.
Hier ist ein Beispiel für die Abfrage von Feldern wie Name und Telefonnummer. Sie können sich selbst für die Verwendung von CommonDataKinds konfigurieren und andere Felder in Ihrem Kontakt abfragen.
https://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds
private fun readContactsOnDevice() { val context = requireContext() if (ContextCompat.checkSelfPermission( context, Manifest.permission.WRITE_CONTACTS ) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( context, Manifest.permission.READ_CONTACTS ) != PackageManager.PERMISSION_GRANTED ) { requestPermissions( arrayOf(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS), 1 ) return } val contentResolver = context.contentResolver val contacts = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null ) while (contacts?.moveToNext() == true) { val name = contacts.getString( contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) ) val phoneNumber = contacts.getString( contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) ) Timber.i("Name: $name, Phone Number: $phoneNumber") } }
quelle
package com.example.readcontacts; import java.util.ArrayList; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.ContactsContract; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { private ListView mListView; private ProgressDialog pDialog; private Handler updateBarHandler; ArrayList<String> contactList; Cursor cursor; int counter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pDialog = new ProgressDialog(this); pDialog.setMessage("Reading contacts..."); pDialog.setCancelable(false); pDialog.show(); mListView = (ListView) findViewById(R.id.list); updateBarHandler =new Handler(); // Since reading contacts takes more time, let's run it on a separate thread. new Thread(new Runnable() { @Override public void run() { getContacts(); } }).start(); // Set onclicklistener to the list item. mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //TODO Do whatever you want with the list data Toast.makeText(getApplicationContext(), "item clicked : \n"+contactList.get(position), Toast.LENGTH_SHORT).show(); } }); } public void getContacts() { contactList = new ArrayList<String>(); String phoneNumber = null; String email = null; Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI; String _ID = ContactsContract.Contacts._ID; String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; Uri EmailCONTENT_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI; String EmailCONTACT_ID = ContactsContract.CommonDataKinds.Email.CONTACT_ID; String DATA = ContactsContract.CommonDataKinds.Email.DATA; StringBuffer output; ContentResolver contentResolver = getContentResolver(); cursor = contentResolver.query(CONTENT_URI, null,null, null, null); // Iterate every contact in the phone if (cursor.getCount() > 0) { counter = 0; while (cursor.moveToNext()) { output = new StringBuffer(); // Update the progress message updateBarHandler.post(new Runnable() { public void run() { pDialog.setMessage("Reading contacts : "+ counter++ +"/"+cursor.getCount()); } }); String contact_id = cursor.getString(cursor.getColumnIndex( _ID )); String name = cursor.getString(cursor.getColumnIndex( DISPLAY_NAME )); int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex( HAS_PHONE_NUMBER ))); if (hasPhoneNumber > 0) { output.append("\n First Name:" + name); //This is to read multiple phone numbers associated with the same contact Cursor phoneCursor = contentResolver.query(PhoneCONTENT_URI, null, Phone_CONTACT_ID + " = ?", new String[] { contact_id }, null); while (phoneCursor.moveToNext()) { phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(NUMBER)); output.append("\n Phone number:" + phoneNumber); } phoneCursor.close(); // Read every email id associated with the contact Cursor emailCursor = contentResolver.query(EmailCONTENT_URI, null, EmailCONTACT_ID+ " = ?", new String[] { contact_id }, null); while (emailCursor.moveToNext()) { email = emailCursor.getString(emailCursor.getColumnIndex(DATA)); output.append("\n Email:" + email); } emailCursor.close(); } // Add the contact to the ArrayList contactList.add(output.toString()); } // ListView has to be updated using a ui thread runOnUiThread(new Runnable() { @Override public void run() { ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, R.id.text1, contactList); mListView.setAdapter(adapter); } }); // Dismiss the progressbar after 500 millisecondds updateBarHandler.postDelayed(new Runnable() { @Override public void run() { pDialog.cancel(); } }, 500); } } } List item
quelle
Code zum Abrufen des Kontaktnamens (aufsteigende Reihenfolge) und der Nummer
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();
quelle