Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
59 / 4 / 1
Регистрация: 31.07.2013
Сообщений: 42
1

Список контактов с аватарками

19.08.2013, 12:23. Показов 2150. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно, есть у меня в программе список контактов. Сейчас появилась необходимость выводить аватарки.

За основу вывода картинок в ListView я взял пример, прилагающийся к Universal ImageLoader. Соответственно, его я и использовал. Адаптер сейчас у меня выглядит так:

Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
    class ContactAdapter extends BaseAdapter{
        
        private class ViewHolder {
            public TextView name;
            public TextView telephone;
            public ImageView image;
        }
 
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return userContacts.size();
        }
 
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return userContacts.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            
            View view = convertView;
            final Contact p = getContact(position);
            
            listener = new OnTouchListener() {
                 
                @Override
                public boolean onTouch(View v, MotionEvent event) {
 
                    ...
 
            };
            
            final ViewHolder holder;
            
            if (convertView == null) {
                view = getLayoutInflater().inflate(R.layout.item, parent, false);
                holder = new ViewHolder();
                holder.name = (TextView) view.findViewById(R.id.name_tv);
                holder.telephone = (TextView) view.findViewById(R.id.tel_tv);
                holder.image = (ImageView) view.findViewById(R.id.contact_icon);
                view.setTag(holder);
            }
            else{
                holder = (ViewHolder) view.getTag();
            }
            
            if (view != convertView) {
                view.setOnTouchListener(listener);
            }
            
            holder.name.setText(p.name);
            holder.telephone.setText(p.tel);
            
            final Uri uri = getPhotoUri(p.id);
            
            Log.i("log_tag", p.id + " " + p.name + " " + p.tel + " URI = " + uri);
 
            ImageLoader.getInstance().displayImage(uri != null?
                        uri.toString(): null, holder.image, options);
            
            return view;
        }
        
        Contact getContact(int position) {
            return ((Contact) getItem(position));
          }
        
        public Uri getPhotoUri(long contactId) {
            Uri person = ContentUris.withAppendedId(
                    ContactsContract.Contacts.CONTENT_URI, contactId);
            return Uri.withAppendedPath(person,
                    ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        }


Инициализация ImageLoader

Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
options = new DisplayImageOptions.Builder()
        .showStubImage(R.drawable.standart_contact)
        .showImageForEmptyUri(R.drawable.standart_contact)
        .showImageOnFail(R.drawable.standart_contact)
        .cacheInMemory()
        .cacheOnDisc()
        //.displayer(new RoundedBitmapDisplayer(20))
        .build();
        
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        .threadPriority(Thread.NORM_PRIORITY - 2)
        .denyCacheImageMultipleSizesInMemory()
        //.discCacheFileNameGenerator(new Md5FileNameGenerator())
        //.tasksProcessingOrder(QueueProcessingType.LIFO)
        .enableLogging()
        .build();
        
        ImageLoader.getInstance().init(config);


Получается следующее:

На моем телефоне, где около 80 телефонов, выводит аватарку от контакта с id = 1111 на контакт с id=237. Больше ни одной аватарки в списке.

Лог на один из тестовых контактов, созданных у меня на телефоне:

Кликните здесь для просмотра всего текста

08-19 12:04:01.983: I/getView(8572): 1105 Собакен 1235 URI = content://com.android.contacts/contacts/1105/photo
08-19 12:04:01.983: I/ImageLoader(8572): Start display image task [content://com.android.contacts/contacts/1105/photo_480x800]
08-19 12:04:01.983: I/ImageLoader(8572): Load image from network [content://com.android.contacts/contacts/1105/photo_480x800]
08-19 12:04:01.983: I/ImageLoader(8572): Cache image on disc [content://com.android.contacts/contacts/1105/photo_480x800]
08-19 12:04:01.993: E/ImageLoader(8572): content://com.android.contacts/contacts/1105/photo
08-19 12:04:01.993: E/ImageLoader(8572): java.io.FileNotFoundException: content://com.android.contacts/contacts/1105/photo
08-19 12:04:01.993: E/ImageLoader(8572): at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel( DatabaseUtils.java:149)
08-19 12:04:01.993: E/ImageLoader(8572): at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.ja va:617)
08-19 12:04:01.993: E/ImageLoader(8572): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.jav a:717)
08-19 12:04:01.993: E/ImageLoader(8572): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:614 )
08-19 12:04:01.993: E/ImageLoader(8572): at android.content.ContentResolver.openInputStream(ContentResolver.java:449)
08-19 12:04:01.993: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFro mContent(BaseImageDownloader.java:164)
08-19 12:04:01.993: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(Ba seImageDownloader.java:88)
08-19 12:04:01.993: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(Loa dAndDisplayImageTask.java:347)
08-19 12:04:01.993: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDi sc(LoadAndDisplayImageTask.java:314)
08-19 12:04:01.993: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(Loa dAndDisplayImageTask.java:254)
08-19 12:04:01.993: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDispla yImageTask.java:134)
08-19 12:04:01.993: E/ImageLoader(8572): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-19 12:04:01.993: E/ImageLoader(8572): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-19 12:04:01.993: E/ImageLoader(8572): at java.lang.Thread.run(Thread.java:856)
08-19 12:04:02.003: E/ImageLoader(8572): content://com.android.contacts/contacts/1105/photo
08-19 12:04:02.003: E/ImageLoader(8572): java.io.FileNotFoundException: content://com.android.contacts/contacts/1105/photo
08-19 12:04:02.003: E/ImageLoader(8572): at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel( DatabaseUtils.java:149)
08-19 12:04:02.003: E/ImageLoader(8572): at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.ja va:617)
08-19 12:04:02.003: E/ImageLoader(8572): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.jav a:717)
08-19 12:04:02.003: E/ImageLoader(8572): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:614 )
08-19 12:04:02.003: E/ImageLoader(8572): at android.content.ContentResolver.openInputStream(ContentResolver.java:449)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFro mContent(BaseImageDownloader.java:164)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(Ba seImageDownloader.java:88)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.getImageStream(Ba seImageDecoder.java:84)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageD ecoder.java:70)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadA ndDisplayImageTask.java:297)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(Loa dAndDisplayImageTask.java:256)
08-19 12:04:02.003: E/ImageLoader(8572): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDispla yImageTask.java:134)
08-19 12:04:02.003: E/ImageLoader(8572): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-19 12:04:02.003: E/ImageLoader(8572): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-19 12:04:02.003: E/ImageLoader(8572): at java.lang.Thread.run(Thread.java:856)



У этого контакта есть аватарка и она отображается в стандартном контакт листе.

В чем косяк?

З.Ы. По логам выяснил, что после вывода той единственной косячной иконки getView() почему-то начинает заново перебирать элементы списка, которые видны на самой верхней позиции.

Добавлено через 16 минут
Сейчас убрал из параметров ImageLoader все "заглушки" и получился довольно интересный результат:
При первой прокрутке списка, аватарок ни у кого нет - просто пустые ImageView. Когда я долистал до той единственной аватарки, то при пролистывании в любую сторону, как только эта аватарка исчезает за экраном, то у первого появившегося контакта будет эта-же аватарка. Так-же будет и с этой аватаркой. Если много раз пролистать список от начала до конца, то постепенно заполняется весь список этой аватаркой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2013, 12:23
Ответы с готовыми решениями:

Список контактов на форме
Помогите найти метод создания на форме блоков пользователей (По типу WhatsApp или viber), то есть,...

Получить полный список контактов
Привет форумчане, Кто-нибудь может подсказать, как получить все контакты из адресной книги? ...

Список контактов с использованием RecyclerView и SQLite
В продолжение темы - https://www.cyberforum.ru/android-dev/thread1840113.html Пример - обычная...

Список контактов
Вам предоставляется список сотовых операторов и список контактов ваших друзей. Затем вам...

2
106 / 106 / 1
Регистрация: 09.04.2012
Сообщений: 655
19.08.2013, 14:22 2
Кастомизация списков http://www.coderzheaven.com/20... n-android/
0
59 / 4 / 1
Регистрация: 31.07.2013
Сообщений: 42
20.08.2013, 17:03  [ТС] 3
Сдается мне, что аватарки имеют свои ID, которые не совпадают с ID контакта. У меня так получилось, что ID одной из аватарок случайно совпало с одним из контактов.

Добавлено через 17 часов 59 минут
Взял метод, предоставленный гуглем - та же фигня. Ничего не помогает.
Во всех случаях получаю иконку от контакта #1111 на контакте #237

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public InputStream openPhoto(long contactId) {
     Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
     Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);
     Cursor cursor = getContentResolver().query(photoUri,
          new String[] {Contacts.Photo.PHOTO}, null, null, null);
     if (cursor == null) {
         return null;
     }
     try {
         if (cursor.moveToFirst()) {
             byte[] data = cursor.getBlob(0);
             if (data != null) {
                 return new ByteArrayInputStream(data);
             }
         }
     } finally {
         cursor.close();
     }
     return null;
 }
Добавлено через 8 часов 11 минут
Вопрос решен!

Решил так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private Bitmap queryContactImage(int imageDataRow) {
            Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {
                ContactsContract.CommonDataKinds.Photo.PHOTO
            }, ContactsContract.Data._ID + "=?", new String[] {
                Integer.toString(imageDataRow)
            }, null);
            byte[] imageBytes = null;
            if (c != null) {
                if (c.moveToFirst()) {
                    imageBytes = c.getBlob(0);
                }
                c.close();
            }
            if (imageBytes != null) {
                return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
            } else {
                return null;
            }
        }
На вход подается Photo.PHOTO_ID.
0
20.08.2013, 17:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2013, 17:03
Помогаю со студенческими работами здесь

Скайп, восстановить список контактов
Помогите пожалуйста восстановить список контактов в скайпе. Решила погруппировать.....

Клиент ICQ: как получить список контактов
Здравствуйте. Возникло несколько вопросов, буду благодарна, если поможете разобраться. Пишу...

Получить список контактов imap/pop3/smtp
Доброго времени суток, можно ли как-то получить список контактов с помощью imap/pop3/smtp ?...

Врзможно л получить список контактов из gmail в wordpress плагине?
Возможно ли получить список контактов из gmail в wordpress плагине и всем им разослать сообщение о...

Создать класс, который выведет список деловых контактов в отсортированном виде
Помогите мне пожалуйста! У меня все время выводит ошибку "Ссылка на объект не указывает на...

Считать список контактов из телефонной книжки смартфона на базе windows mobile
Приветствую уважаемые форумчане. У меня вопрос: Какие средства нужно использовать чтобы решить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru