7

連絡先の画像をビューの背景として取得および設定するのに問題があります。驚くべきことに、その方法の例はほとんどありません。大きな連絡先の写真を表示するPeopleアプリに似たものを作成しようとしています。

これは私が今していることです:

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri);
Bitmap bm = BitmapFactory.decodeStream(input);
Drawable d = new BitmapDrawable(bm);
button.setBackgroundDrawable(drawable);

これは機能しますが、使用するURIはサムネイル画像を取得するため、大きな写真がある場合でも、imageViewに合わせて拡大縮小すると非常に見栄えが悪くなります。私は実際に大きな写真を取得するURIを取得する別の方法を知っています:

final Uri imageUri = Uri.parse(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)));

しかし、私はそれをimageViewに到達させることができませんでした。おそらく、上記のコードは2番目のURIを使用するように適合させることができます。2番目のURIの使用方法を知っている場合、またはURIを使用するよりも簡単に連絡先画像を取得する方法がある場合は、教えてください。どんな情報でも感謝されます。

4

7 に答える 7

8

URIを取得するのに良い仕事です。もうすぐです。まず、PHOTO_URIの代わりにPHOTO_THUMBNAIL_URIを使用することを検討してください。これは、サイズの点で必要な場合があるためです。

編集:参考までに、PHOTO_THUMBNAIL_URIはAPI11から利用できます。引き続き条件付きで使用できます。

外部ライブラリを使用したい場合は、「Android Universal Image Loader」が間違いなく探しているものです。数日前の1.7.1バージョンから、コンテンツスキームのサポートが追加され、非常にスマートなメモリです。賢い。また、多くのカスタマイズオプションがあります。

編集:このlibはすでに死んでいます。代わりにFrescoを使用してください。

最終的なバンドルサイズをより良くして、自分でコードを記述したい場合は、

そのコンテンツの入力ストリームを取得してデコードする必要があります。これは、バックグラウンドスレッドで実行する必要があります。このconnivenceメソッドをチェックしてください。画像ビューと取得したURIを使用して初期化し、ImageViewをロードするときに開始します。

private class ContactThumbnailTask extends AsyncTask<Void, Void, Bitmap> {

    private WeakReference<ImageView> imageViewWeakReference;
    private Uri uri;
    private String path;
    private Context context;


    public ContactThumbnailTask(ImageView imageView, Uri uri, Context context) {
        this.uri = uri;
        this.imageViewWeakReference = new WeakReference<ImageView>(imageView);
        this.path = (String)imageViewWeakReference.get().getTag(); // to make sure we don't put the wrong image on callback
        this.context = context;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        InputStream is = null;
        try {
            is = context.getContentResolver().openInputStream(uri);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Bitmap image = null;
        if (null!= is)
            image=  BitmapFactory.decodeStream(is);

        return image;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewWeakReference != null && imageViewWeakReference.get() != null && ((String)imageViewWeakReference.get().getTag()).equals(path) && null != bitmap)
            imageViewWeakReference.get().setImageBitmap(bitmap);
    }
}
于 2013-02-02T00:06:56.340 に答える
2

提案です。まず、1つのことを知ってください。

連絡先画像を設定する場合。最初のAndroidは、その画像のトリミングアクティビティを表示します。好き ここに画像の説明を入力してください

****上の画像を注意深く見てください。Androidは画像を正方形としてトリミングします。そして、正方形の画像をブロブとして連絡先に保存します(これは個々の画像ではありません。ブロブです)。
コーディングから、画像ビューの正方形の画像を取得します。そのため、上下は黒色のみを表示します。長方形の携帯電話だからです。****

フルスクリーン画像を表示したい場合。プログラムで連絡先に大きなイメージを設定してください。インターネットで利用できる多くの例。

あなたの試みのためにすべて最高。疑問がある場合。コメントをお願いします。

于 2013-02-07T13:43:55.897 に答える
0

おそらくこれはあなたを助けるでしょう(連絡先はgetId()によって識別されます):

/**
 * @return the photo URI
 */

public Uri getPhotoUri() {
    try {
        Cursor cur = this.ctx.getContentResolver().query(
                ContactsContract.Data.CONTENT_URI,
                null,
                ContactsContract.Data.CONTACT_ID + "=" + this.getId() + " AND "
                        + ContactsContract.Data.MIMETYPE + "='"
                        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null,
                null);
        if (cur != null) {
            if (!cur.moveToFirst()) {
                return null; // no photo
            }
        } else {
            return null; // error in cursor process
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long
            .parseLong(getId()));
    return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}

使用法は次のとおりです。

Uri u = objItem.getPhotoUri();
if (u != null) {
        mPhotoView.setImageURI(u);
} else {
        mPhotoView.setImageResource(R.drawable.ic_contact_picture_2);
}
于 2013-02-06T07:46:30.090 に答える
0

SmartImageViewの使用を試すことができます:http://loopj.com/android-smart-image-view/ imageviewを拡張し、非同期で画像をロードします。

于 2013-02-05T22:08:11.600 に答える
0

外部ライブラリを使用してそれを行います。または、コードを参照して、独自の方法で似たようなものを作成します。

これが私が自分のアプリのいくつかで使用しているものです:UrlImageViewHelper

コードは次のようになります。

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id));  
UrlImageViewHelper.setUrlDrawable(button, uri.toString(), R.drawable.dummy_contact_photo); 
于 2013-02-06T04:43:02.753 に答える
0

次の方法で、連絡先の写真を画像ビューに簡単に設定できます。

public String getImageUriString(String phoneNumber)
{
    ContentResolver resolver = context.getContentResolver();
    Cursor names = resolver.query(
            Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)),
            null, null, null, null);

    names.moveToFirst();
    String name = "";
    if(!names.isAfterLast())
    {
        name = names.getString(names.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI));

    }
    else
    {
        name = null;
    }

    names.close();

    return name;
}





public void setImageView(ImageView contactPhoto) {

String photoUriString = di.getImageUriString(contactNumber);
        if(photoUriString != null) {
            Uri photoUri = Uri.parse(photoUriString);
            contactPhoto.setImageURI(photoUri);
        } else {
            contactPhoto.setImageResource(R.drawable.icon_contact);
        }
}

クラスから、上記のメソッドから取得したURIを使用して画像ビューを設定します。

于 2013-05-18T15:11:56.653 に答える
0

これを実行するには、最後のパラメーターpreferHighres=trueを1つ追加するだけです。

openContactPhotoInputStream (ContentResolver cr, Uri contactUri, boolean preferHighres)

PreferredHighresがtrueで、連絡先に高解像度の写真が用意されている場合は、写真が返されます。falseの場合、この関数は常にサムネイルを取得しようとします

     Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id));
     InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri, true);

すべての画像はおそらく異なるサイズになります。それらのサイズを変更するために、次のコードを使用します。

    Bitmap bm = BitmapFactory.decodeStream(input);
    bm = Bitmap.createScaledBitmap(photo, contactImageWidth, contactImageheight, false);
    Drawable d = new BitmapDrawable(getContext(), bm);
    button.setBackgroundDrawable(d);
于 2014-01-31T18:48:16.927 に答える