Asynctask:从设备电话簿中检索联系人照片

时间:2012-12-17 13:09:01

标签: android android-asynctask

在我的应用程序中,我试图检索电话簿联系人图像的图像并显示在列表中。下面是我的代码

public InputStream getContactPhoto(Context context, String profileId){
        try{
            ContentResolver cr = context.getContentResolver();
            Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(profileId));
            return ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
        }catch(Exception e){
            return null;
        }
    }

    private Bitmap loadContactPhoto(ContentResolver cr, long id) {
        Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);

        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);

        if (input == null) {
            return null;
        }
        return BitmapFactory.decodeStream(input);
    }

它的工作但不知何故它不顺利,所以想要使用asynctask实现获取图像 关于如何使用上述代码

的任何建议

1 个答案:

答案 0 :(得分:0)

如果您正在使用ImageView并想要加载图片(在此示例中,它从SDCard中检索图像),您可以这样做:

创建一个扩展ImageView的自定义类

public class SDImageView extends CacheableImageView {
    ...
}

使用您需要的参数创建一个名为load()(或任何您想要的)的方法。在我的例子中是图像的路径:

public final void loadImage(final String tpath) {
        if (tpath == null) {
            return;
        }

        SDLoadAsyncTask.load(this, tpath);
    }

- 创建一个扩展AsyncTask的类,并在doInBackground方法中实现您想要执行的操作

private static class SDLoadAsyncTask extends AsyncTask<Void, Void, Bitmap> {

        final SDImageView view;
        final String path;

        private SDLoadAsyncTask(SDImageView view, String path) {
            this.view = view;
            this.path = path;
        }

        @Override
        protected final Bitmap doInBackground(Void... params) {
            Bitmap bmp = null;
            InputStream is = null;
            try {
                is = new FileInputStream(mContext.getExternalFilesDir(null) + "/" + path);
                bmp = BitmapFactory.decodeStream(is);
            } catch (Exception e) {
                Utils.logMsg("Exception for img " + path, e);
            } finally {
                try {
                    is.close();
                } catch (Exception e2) {
                }
            }
            return bmp;

        @Override
        protected final void onPostExecute(Bitmap result) {
            view.setImageBitmap(result);
        }
}