How to get android mobile phone contacts and display them by letter (3): android contacts
If you get the contact Profile and display it:
How to obtain bitmap Based on photoId:
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; }
Add the following to 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);}}}}
How to get the Avatar:
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);}}
Download the Avatar to start the thread pool:
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();}
We can optimize the download, and only go down when the list is static. This allows adatper to inherit OnScrollListener, so there are two overload functions:
<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) {}
When the activity is destroyed, we have to release the resource:
@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();}}
Code: http://download.csdn.net/detail/baidu_nod/7774203
How can I find contacts in alphabetical order on my Android phone?
When you click on the screen, a menu appears. You choose to add a contact to the desktop.
In android, how does one obtain all the numbers and Corresponding names of contacts on the local mobile phone through a program?
Contentprovider