Obtener contactos en android es muy lento
Había escrito un código para buscar el nombre del contacto, el número de teléfono y la imagen de los contactos y para mostrarlo en un listview en android. Está funcionando bien, pero toma más tiempo para cargar. He intentado utilizar multi-threading en algunas partes del código. Pero el tiempo de carga no se reduce.
Aquí está el método onCreate()
:
- Android cómo enviar múltiples contactos se adjuntan en un archivo .vcf simple y enviar a correo?
- Obtenga todos los nombres y números de contacto como una lista de cadenas en Android
- ¿Error de eliminación o éxito de ContentProviderResult ?
- ¿Cuál es el tipo / nombre de cuenta predeterminado para contactos en la aplicación de contacto de Android?
- ¿Cómo funcionan las columnas unidas implícitas con los datos de los contactos de Android?
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvDetail = (ListView) findViewById(R.id.listView1); fetchcontacts(); lvDetail.setAdapter(new MyBaseAdapter(context, myList)); }
Aquí está el código para buscar contactos:
private void fetchcontacts() { // TODO Auto-generated method stub Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); int count = cursor.getCount(); if (count > 0) { Toast.makeText(context, "count >0", Toast.LENGTH_SHORT).show(); while (cursor.moveToNext()) { String columnId = ContactsContract.Contacts._ID; int cursorIndex = cursor.getColumnIndex(columnId); String id = cursor.getString(cursorIndex); name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Toast.makeText(context, "Toast 1", Toast.LENGTH_SHORT).show(); int numCount = Integer.parseInt(cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); if (numCount > 0) { Toast.makeText(context, "Toast 2", Toast.LENGTH_SHORT).show(); Cursor phoneCursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, CommonDataKinds.Phone.CONTACT_ID+" = ?", new String[] { id }, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); while (phoneCursor.moveToNext()) { Toast.makeText(context, "Toast 3", Toast.LENGTH_SHORT).show(); phoneNo = phoneCursor.getString(phoneCursor .getColumnIndex(ContactsContract.CommonDataKinds. Phone.NUMBER)); String image_uri = phoneCursor .getString(phoneCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); if (image_uri != null) { Toast.makeText(context, "Toast 4", Toast.LENGTH_SHORT).show(); System.out.println(Uri.parse(image_uri)); try { bitmap = MediaStore.Images.Media .getBitmap(this.getContentResolver(), Uri.parse(image_uri)); // sb.append("\n Image in Bitmap:" + bitmap); // System.out.println(bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Toast.makeText(context, name, Toast.LENGTH_SHORT).show(); getDataInList(name,phoneNo,bitmap); name=null; phoneNo=null; Drawable myDrawable = getResources().getDrawable(R.drawable.star1); bitmap = ((BitmapDrawable) myDrawable).getBitmap(); } phoneCursor.close(); } } }
Aquí la función setAdapter () del listview funciona después de buscar todos los contactos en un ArrayList. ¿Alguien tiene idea acerca de cómo mostrar los contactos durante la búsqueda de contactos? Cualquier código de ejemplo?
- Cómo mostrar la tarjeta QuickContact desde el widget
- Menú emergente de Android
- ¿Cuál es la diferencia entre los contactos y los contactos crudos?
- Obtener contactos de fotos que se sincronizan con facebook para android
- Obtener la ID de correo electrónico y el nombre de la guía telefónica integrada de android?
- Android - Weird Contact pic problema en Kitkat
- Obtener el perfil de usuario / propietario de contacto URI y la imagen de usuario con API 8 en adelante
- Obtener número del selector de contactos
1.Leer las columnas del Cursor
que usted requirió solamente, según su requisito usted apenas necesita _ID, HAS_PHONE_NUMBER, DISPLAY_NAME , así que cambie la lectura del cursor
Cursor cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.HAS_PHONE_NUMBER, ContactsContract.Contacts.DISPLAY_NAME }, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");
2. No realice el proceso de toma de tiempo en el hilo de la interfaz de usuario. Utilice AsyncTask
en AsyncTask
lugar.
Nota : Estos dos pasos se resolverán hasta cierto punto … pero no completamente
Los contactos en tamaño normal utilizan en tarea de backround. Uri uri = Uri.withAppendedPath (ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode (number [i]));
ContentResolver contentResolver = getContentResolver(); Cursor search = contentResolver.query(uri, new String[]{ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); try { if (search != null && search.getCount() > 0) { search.moveToNext(); name = search.getString(search.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); id = search.getString(search.getColumnIndex(ContactsContract.Data._ID)); System.out.println("name" + name + "id" + id); /* tv_name.setText(name); tv_id.setText(id); tv_phone.setText(number);*/ } } finally { if (search != null) { search.close(); } }
La manera más rápida para mí soo lejos.
ContentResolver cr = mContext.getContentResolver(); Cursor cursor= mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, "HAS_PHONE_NUMBER <> 0", null, null); if (cursor!= null) { final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); final int numberIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); final int idIndex= cursor.getColumnIndex(ContactsContract.Contacts._ID); String displayName, number = null, idValue; while (cursor.moveToNext()) { displayName = cursor.getString(displayNameIndex); idValue= cursor.getString(idIndex); Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = '" + idValue + "'", null, null); phones.moveToFirst(); try { number = phones.getString(phones.getColumnIndex("data1")); } catch (CursorIndexOutOfBoundsException e) {` } phones.close(); userList.add(new ContactModel(displayName , number , null , }
- La notificación de MediaStyle no responde a eventos de RemoteControl.
- ¿Cómo determinas si una .sqlite o .sqback está dañada en Java?