Help us understand the problem. What is going on with this article?

Androidで端末内の画像を取得

More than 1 year has passed since last update.

内容

ボタンを押して、端末内の画像を取得(表示)します。
完成イメージ。

14870041770Ys5q7cJNpeK3vN1487004176.gif

Layout

画像選択Buttonと取得した画像を表示するImageViewを用意します。

activty_main.xml
    <Button
        android:id="@+id/button2"
        android:text="get image"
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/image_view"
        android:scaleType="fitStart"
        android:adjustViewBounds="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

Activity

ボタンの押下時の処理でドキュメントを開くインテントを作成して、画像フォルダの読み込みを設定します。
結果の画像を取得するため、startActivityForResultで起動します。
第2引数には任意のIDを付与します。(戻ってきた時の判定で使用)

MainActivity.java(1)
public class MainActivity extends AppCompatActivity {
    private static final int RESULT_PICK_IMAGEFILE = 1000;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
        imageView = (ImageView)findViewById(R.id.image_view);

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent, RESULT_PICK_IMAGEFILE);
            }
        });

    }

startActivityForResult 終了後 onActivityResult が呼ばれて、
「結果コード、呼び出し時のID、結果」が渡されます。

結果コード(resultCode)には正常終了[RESULT_OK]、キャンセル[RESULT_CANCELED]が入っており、
呼び出し時のIDは startActivityForResult の第二引数が入っています。
resultDataの中身は画像パスが入っています。
その画像パスからBitmapを作成してLayoutのImageViewにセットします。

MainActivity.java(2)
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == RESULT_OK) {
            Uri uri = null;
            if (resultData != null) {
                uri = resultData.getData();

                try {
                    Bitmap bmp = getBitmapFromUri(uri);
                    imageView.setImageBitmap(bmp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
    }

}

リファレンス

・ストレージ アクセス フレームワーク
https://developer.android.com/guide/topics/providers/document-provider.html?hl=ja

・アクティビティから結果を取得する
https://developer.android.com/training/basics/intents/result.html?hl=ja

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away