android получает детали контактов, такие как номер и миниатюра



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



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



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;


Обновление 4/4/2015




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

658   3  

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;
  }
}

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

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

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

Введите описание изображения здесь

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

@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");

    }

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

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

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

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.Контакты.Фото

Получение фотографии от контакта

Comments

    Ничего не найдено.