0

私のアプリでは、電話帳の連絡先画像の画像を取得してリストに表示しようとしています。以下は私のコードです

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を使用して画像の取得を実装したい上記のコードを使用して実装する方法に関する提案

4

1 に答える 1

0

たとえば、ImageViewを使用していて、画像をロードしたい場合(この例では、SDカードから画像を取得します)、次のように実行できます。

-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);
        }
}
于 2012-12-17T16:28:36.450 に答える