怎樣擷取android手機連絡人並按字母展示(三)

來源:互聯網
上載者:User

標籤:

假設擷取contact的頭像資訊並展示:

怎樣依據photoId來擷取bitmap:

public static Bitmap getContactPhoto(Context context, long photoId, BitmapFactory.Options options) {        if (photoId < 0) {            return null;        }        Cursor cursor = null;        try {            cursor = context.getContentResolver().query(                    ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photoId),                    new String[] { Photo.PHOTO }, null, null, null);            if (cursor != null && cursor.moveToFirst() && !cursor.isNull(0)) {                byte[] photoData = cursor.getBlob(0);                               if (options == null) {                    options = new BitmapFactory.Options();                }                options.inTempStorage = new byte[16 * 1024];                options.inSampleSize = 2;                return BitmapFactory.decodeByteArray(photoData, 0, photoData.length, options);            }        } catch (java.lang.Throwable error) {        } finally {            if (cursor != null) {                cursor.close();            }        }        return null;    }


在bindView中增加:

protected void setContactPhoto(Cursor cursor, final ImageView viewToUse, int column) {long photoId = 0;if (!cursor.isNull(column)) {photoId = cursor.getLong(column);}final int position = cursor.getPosition();viewToUse.setTag(new PhotoInfo(position, photoId));if (photoId == 0) {viewToUse.setImageResource(R.drawable.avatar);} else {Bitmap photo = null;SoftReference<Bitmap> ref = mBitmapCache.get(photoId);if (ref != null) {photo = ref.get();if (photo == null) {mBitmapCache.remove(photoId);}}if (photo != null) {viewToUse.setImageBitmap(photo);} else {viewToUse.setImageResource(R.drawable.avatar);mItemsMissingImages.add(viewToUse);if (mScrollState != OnScrollListener.SCROLL_STATE_FLING) {sendFetchImageMessage(viewToUse);}}}}

擷取的頭像的方法:

private class ImageLoaderHandler extends Handler {@Overridepublic void handleMessage(Message message) {if (isFinishing()) {return;}switch (message.what) {case FETCH_IMAGE_MSG: {final ImageView imageView = (ImageView) message.obj;if (imageView == null) {break;}final PhotoInfo info = (PhotoInfo) imageView.getTag();if (info == null) {break;}final long photoId = info.photoId;if (photoId == 0) {break;}SoftReference<Bitmap> photoRef = mBitmapCache.get(photoId);if (photoRef == null) {break;}Bitmap photo = photoRef.get();if (photo == null) {mBitmapCache.remove(photoId);break;}synchronized (imageView) {final PhotoInfo updatedInfo = (PhotoInfo) imageView.getTag();long currentPhotoId = updatedInfo.photoId;if (currentPhotoId == photoId) {imageView.setImageBitmap(photo);mItemsMissingImages.remove(imageView);} else {}}break;}}}public void clearImageFecthing() {removeMessages(FETCH_IMAGE_MSG);}}private class ImageLoader implements Runnable {long mPhotoId;private ImageView mImageView;public ImageLoader(long photoId, ImageView imageView) {this.mPhotoId = photoId;this.mImageView = imageView;}public void run() {if (isFinishing()) {return;}if (Thread.interrupted()) {return;}if (mPhotoId < 0) {return;}Bitmap photo = ContactsUtils.getContactPhoto(getBaseContext(),mPhotoId, null);if (photo == null) {return;}mBitmapCache.put(mPhotoId, new SoftReference<Bitmap>(photo));if (Thread.interrupted()) {return;}Message msg = new Message();msg.what = FETCH_IMAGE_MSG;msg.obj = mImageView;mHandler.sendMessage(msg);}}

下載頭像能夠起線程池:

private void processMissingImageItems(AbsListView view) {for (ImageView iv : mItemsMissingImages) {sendFetchImageMessage(iv);}}protected void sendFetchImageMessage(ImageView view) {final PhotoInfo info = (PhotoInfo) view.getTag();if (info == null) {return;}final long photoId = info.photoId;if (photoId == 0) {return;}mImageFetcher = new ImageLoader(photoId, view);synchronized (ContactsList.this) {if (sImageFetchThreadPool == null) {sImageFetchThreadPool = Executors.newFixedThreadPool(3);}sImageFetchThreadPool.execute(mImageFetcher);}}public void clearImageFetching() {synchronized (ContactsList.this) {if (sImageFetchThreadPool != null) {sImageFetchThreadPool.shutdownNow();sImageFetchThreadPool = null;}}mHandler.clearImageFecthing();}

我們能夠對下載做最佳化,在列表精巧的時候才去下,這個我們讓adatper繼承OnScrollListener,這樣有兩個重載函數:

<span style="white-space:pre"></span>@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (SCROLL_STATE_TOUCH_SCROLL == scrollState) {                View currentFocus = getCurrentFocus();                if (currentFocus != null) {                    currentFocus.clearFocus();                }            }mScrollState = scrollState;if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {clearImageFetching();} else {processMissingImageItems(view);}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {}

在activity銷毀的時候,我們得去釋放資源:

@Overrideprotected void onDestroy() {super.onDestroy();if (mQueryHandler != null) {mQueryHandler.cancelOperation(QUERY_TOKEN);mQueryHandler = null;}if (mAdapter != null && mAdapter.mItemsMissingImages != null) {mAdapter.mItemsMissingImages.clear();mAdapter.clearMessages();}// Workaround for Android Issue 8488// http://code.google.com/p/android/issues/detail?id=8488if (mAdapter != null && mAdapter.mBitmapCache != null) {for (SoftReference<Bitmap> bitmap : mAdapter.mBitmapCache.values()) {if (bitmap != null && bitmap.get() != null) {bitmap.get().recycle();bitmap = null;}}mAdapter.mBitmapCache.clear();}}

代碼:http://download.csdn.net/detail/baidu_nod/7774203

怎樣擷取android手機連絡人並按字母展示(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.