Читать номера телефонов всех контактов в android
Я использую этот код, чтобы получить все имена контактов и номера телефонов:
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());
однако, это будет возвращать только основной номер для каждого контакта, но я хочу получить также среднее число. Как я могу это сделать?
12 ответов:
вы можете прочитать все телефонные номера, связанные с контактом следующим образом:
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);обратите внимание, что в этом примере (как и в вашем) используется устаревший API контактов. Начиная с эклера это было заменено на ContactsContract API.
следующий код показывает простой способ прочитать все телефонные номера и имена:
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();
этот код показывает, как получить все номера телефонов для каждого контакта.
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(); } } }
в случае, если это поможет, у меня есть пример, который использует CONTACTSCONTRACT API, чтобы сначала найти контакт по имени, а затем он повторяет детали, ища конкретные типы чисел:
как использовать ContactsContract для получения телефонных номеров и адресов электронной почты
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();
вы можете получить все телефонные контакты, используя это:
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);проверить полный пример здесь...........
таким же образом просто получить их другие номера, используя другие ссылки "люди"
People.TYPE_HOME People.TYPE_MOBILE People.TYPE_OTHER People.TYPE_WORK
этой один наконец-то дал мне ответ, который я искал. Это позволяет получить все имена и номера телефонов контактов на телефоне.
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++; } } } } } }
я исправил свою потребность belove
манифест разрешения
<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" />Примечание: после предоставления разрешений на манифест некоторые мобильные телефоны могут запретить, если вам нужно перейти Настройки - > Приложения-> найти приложение нажмите на него и включите необходимые разрешения
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(); } });
код, чтобы получить имя контакта (в порядке возрастания) и количество
для получения дополнительной информации:показать контакт в listview
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();
загрузка контактов в фоновом режиме с помощью 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); }
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

Comments