1

Я использую этот код, который может получить номер контакта и миниатюра контакта, но это не подходит и длится для загрузки и подготовки контактов.андроид получить контактную информацию, такую ​​как номер и миниатюру

, пожалуйста, помогите мне улучшить производительность этого кода:

List<Contact_Pojo> list = new ArrayList<Contact_Pojo>(); 
ContentResolver cr = getActivity().getContentResolver(); 
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
     null, null, Phone.DISPLAY_NAME + " ASC"); 

int i = 0; 
if (cur.moveToFirst()) { 
    while (cur.moveToNext()) { 

     Cursor phoneCursor = getActivity() 
       .getContentResolver() 
       .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER, }, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
           + " = ?", 
         new String[] { cur.getString(cur 
           .getColumnIndex(ContactsContract.Contacts._ID)) }, 
         null); 

     if (phoneCursor.moveToFirst()) { 
      Contact_Pojo personContact = new Contact_Pojo(); 
      /* 
      * Id 
      */ 
      personContact.setId(cur.getString(1)); 
      /* 
      * Name 
      */ 
      personContact 
        .setName(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
      /* 
      * Photo ID 
      */ 
      personContact 
        .setImageUrl(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI))); 
      /* 
      * Number 
      */ 
      personContact.setNumber(phoneCursor.getString(0)); 
      // 
      list.add(personContact); 
     } 

     phoneCursor.close(); 

    } 
} 

cur.close(); 
return list; 

Update 4/4/5015

  • это очень медленный процесс, потому что он получает все колонки от контакта поставщика, в этом таблица имеет +20 столбцов, которые занимают много времени.
+0

предложение? –

ответ

1

Это медленно, потому что, вы получают весь столбец f rom, поэтому используйте проекцию, чтобы получить только те столбцы, которые требуются. как

String[] projection = {
ContactsContract.Contacts.DISPLAY_NAME // this is just example, add fields that required } ;

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

enter image description here

и мой метод для получения всех контактов является

@SuppressLint("InlinedApi") 
    public void readContacts() { 

     long l1 = System.currentTimeMillis(); 

     Log.d("DEBUG", 
       "starting readContacts() time " + l1); 

     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
       null, null, null); 
     if (cur.getCount() > 0) { 

      while (cur.moveToNext()) { 

       Contact_pojo cp = new Contact_pojo(); 

       String Contact_Id = cur.getString(cur 
         .getColumnIndex(ContactsContract.Contacts._ID)); 
       String Contact_Name = cur 
         .getString(cur 
           .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       String photothumb = ""; 
       try { 
        photothumb = cur 
          .getString(cur 
            .getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); 
        if (photothumb != null 
          && !photothumb.toString().equalsIgnoreCase("")) { 
         cp.setImageUri(photothumb); 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       cp.setId(Contact_Id); 

       cp.setName(Contact_Name); 


Cursor phones = cr.query(Phone.CONTENT_URI, null, 
        Phone.CONTACT_ID + " = " + Contact_Id, null, null); 
      while (phones.moveToNext()) { 
       String number = phones.getString(phones 
         .getColumnIndex(Phone.NUMBER)); 
       int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 

       Log.d("DEBUG", "number " + number + " type " + type); 
       cp.setNumber(number); 

      } 
      phones.close(); 
       contactList.add(cp); 

      } 
     } 
     long l2 = System.currentTimeMillis(); 
     Log.d("DEBUG", 
       "Finished readContacts() time " + l2); 
     Log.d("DEBUG","Total contact loaded "+contactList.size()+" within "+ (l2 - l1) + "ms"); 

    } 
+0

да, ты прав. и у вас есть другое предложение. подумайте об этом и отредактируйте свой вопрос более подходящим для меня и других программистов. –

+0

второй запрос подготовит номер контакта, потому что в первом запросе контактный номер не существует и просто сообщит вам, что контакт имеет номер телефона или нет. –

+0

не проверяют этот алгоритм в виртуальном устройстве Android.этот результат отличается от виртуального устройства и реального устройства. –

3

Как об использовании AsyncTaskLoader,

писать этот код, если вы хотите, чтобы получить список контактов

getLoaderManager() or getSupportLoaderManager().initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> loadingCallback)

public class LoadingCallback implements LoaderManager.LoaderCallbacks<Void> { 
    @Override 
    public Loader<Void> onCreateLoader(int i, Bundle bundle) { 
    // Show your dialog; 
    return new InitializeContactsTask(context, (ArrayList) contactList, mAdapter); 
    } 

    @Override 
    public void onLoadFinished(Loader<Void> voidLoader, Void aVoid) { 
    // UI Work here after background task and hide dialog. 
    } 

    @Override 
    public void onLoaderReset(Loader<Void> voidLoader) { 
    } 
} 

и

public class InitializeApplicationsTask extends AsyncTaskLoader<Void> { 
    @Override 
    protected void onStartLoading() { 
     forceLoad(); 
    } 

    @Override 
    public Void loadInBackground() { 
     // Query the contacts here and return null 

     return null; 
    } 
} 
+0

Можете ли вы объяснить больше? –

+0

@ adnan9011 Вам лучше прочитать [this] (http://stackoverflow.com/questions/7120813/asynctaskloader-vs-asynctask) <- http://stackoverflow.com/questions/7120813/asynctaskloader-vs-asynctask –

0

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

Вы также можете получить контакт с одним запросом ..

Используйте ниже код ..

public void fetchContacts() 
    { 

     String[] projection = new String[] { 
       ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, 
       ContactsContract.CommonDataKinds.Phone.NUMBER, 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; 



     String _ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; 
     String DISPLAY_NAME = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME; 
     String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 

     Cursor cursor = mActivity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       projection, ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + "=?", new String[] { "1" }, 
       ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 

     System.out.println("contact size.."+cursor.getCount()); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 

       String contact_id = cursor.getString(cursor.getColumnIndex(_ID)); 
       String name = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME)); 
       String phoneNumber = cursor.getString(cursor.getColumnIndex(NUMBER)); 



       System.out.println(" name : "+name); 
       System.out.println(" number : "+phoneNumber); 

      } 
     } 
    } 

Проверьте ниже ссылки на прибудете фотографию контакта.

ContactsContract.Contacts.Photo

Getting a Photo from a Contact

+0

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

+0

@ adnan9011 Я обновил свой ответ, пожалуйста, просто добавьте эту строку ** String image = cursor.getString (курсор .getColumnIndex (ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); ** –

+0

Спасибо, позвольте мне проверить. –

Смежные вопросы