LoginSignup
39

More than 5 years have passed since last update.

Androidで端末内の画像を取得

Posted at

内容

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39