4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ギャラリーから画像を選択し表示するAndoroidアプリ

Last updated at Posted at 2020-08-23

この記事は、株式会社富士通システムズウェブテクノロジーが企画する「いのべこ夏休みアドベントカレンダー 2020」の22日目の記事です。
(お約束)本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。

#はじめに
Andoroid Studioで画像を選択し画面に表示するソースを書いたので、本記事ではそのソース、手順などを紹介します。

##背景
前回の記事(Google Cloud Vision APIを使って食べ物の写真を判定してみる)を踏まえ、選択した写真をAPIで判定するアプリを作ってみようと思い、1段階目として、ギャラリーから画像を選択する部分を記事にしました。

#事前準備
下記に関しては今回のアドベントカレンダー16日目の記事「Androidアプリ「HelloWorld」を作って、好き勝手に弄ってみた」で記載されているので参照していただければと思います。ここでは省略します。

・Andoroid Studioのインストール
・プロジェクトの新規作成
・エミュレーターの作成と起動

##エミュレーターの日本語化
おそらくデフォルトで英語になっているので、日本語化します。
エミュレーター上で[Settings]画面を表示し、[System]-[Languages & input]-[Languages]の順に選択します。
Englishだけ表示されていると思うので、[Language preferences]から日本語を選択すると、Englishの下に日本語が表示されるので、ドラッグで順番を入れ替えることで日本語化完了です。

エミュレーター_日本語化.PNG

##エミュレーター上に画像を保存する
画像選択をするために、画像をエミュレーターで確認できるようにします。

方法としては2つ
・エミュレーターに画像をドラッグ&ドロップ
  DownLoadのフォルダに画像が入ります。
・Device File Explorerでアップロード
  [View]-[Tool Windows]-[Device File Explorer]で開きます。
  任意のフォルダで右クリックでファイル追加可能です。

#ソース
ボタン押下でギャラリーを開き、選択した画像を画面に表示させます。

##ギャラリーを開く

Intent intent = new Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 1);

Intent(アクションの種類, 対象のアプリ)
startActivityForResult(インテント, リクエストコード)
Intentクラスで別のアプリでアクティビティを開始できます。
今回は、ギャラリー(画像一覧)を開いて選択した画像を取得しています。

Intentに関する詳細は一般的なインテントを参照。

引数に指定している内容はざっくりと以下のような意味です。
・Intent.ACTION_PICK      :データから選択したものを返すアクション
・Media.EXTERNAL_CONTENT_URI :画像データが取得できるURI
 ※「EXTERNAL_CONTENT_URI」はSDカード等の外部ストレージを参照します。内部ストレージの場合は「INTERNAL_CONTENT_URI」にすればよいみたいです。

startActivityForResultのパラメータで指定するリクエストコードは遷移元を判断するためのものです。
ここでは、1をハードコーディングで指定していますが、定数等で管理するのがいい気がします。

##選択結果を表示する

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == 1 && resultCode == RESULT_OK && null != data) {
            ImageView imgView = findViewById(R.id.imageView);
            BufferedInputStream inputStream = null;
            try {
                inputStream = new BufferedInputStream
                             (getContentResolver().openInputStream(data.getData()));
                imgView.setImageBitmap(BitmapFactory.decodeStream(inputStream));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
      }
}

「onActivityResult」メソッドは前段の「startActivityForResult」の実行結果を受け取ります。
選択した結果を画面のImageViewに設定します。

また、引数のrequestCodeは「startActivityForResult」メソッドで指定したリクエストコードが返ってきます。
前段で述べた通り、遷移元を判断できるので下記のような書き方ができます。

public void button1_onClick(View view) {
      Intent intent = new Intent(Intent.ACTION_PICK, Media.INTERNAL_CONTENT_URI);
      startActivityForResult(intent, 1);
}

public void button2_onClick(View view) {
      Intent intent = new Intent(Intent.ACTION_PICK, Media.INTERNAL_CONTENT_URI);
      startActivityForResult(intent, 2);
}
    
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == 1) {
            // button1用の処理
      } else if (requestCode == 2) {
            // button2用の処理
      }
}

##画面
上記までのソースをエミュレーターで実行すると、当初目的の「画像を選択し画面に表示する」ができました。

①ボタンを押下する
②③画像を選択
④選択した画像を表示

image.pngimage.png
image.pngimage.png

#最後に
Andoroid Studioを初めて使いましたが、Form系アプリとソースが似ていたので、大きく苦労はしませんでした。

次回はAndoroidアプリからCloud Vision APIを呼び出すところをやってみたいです。

4
2
0

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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?