仕事でAndroidアプリを開発することになり、Storage Access Frameworkというものを使い画像取込機能を作ったのですが、日本語の資料が少なく手間取ったので備忘録です。
開発してから内容をまとめるまで期間が空いたのと、初めてのAndroid開発のため間違いがあったらすみません。
環境
・Android 6.0.1
ギャラリーの呼び出し方
Androidでは、他アプリやAndroid標準の色々な機能を呼び出すときにintentというものを使うらしいです。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 0);
setTypeで"image/*"を設定することで、画像のみ取り込めるようにしてます。
startActivityForResultの2つ目の引数で0を設定していますが、ここではrequestCodeというものを設定してます。
これは、どのアプリや機能からの呼び出しかを判断するのに使うもので、後述の戻りの処理で使います。
値はintであればなんでもいいと思いますが、実装の際は定数化して呼び出しと戻りで同じ値を使えるようにしとくといいと思います。
複数選択
一つ一つちまちま選ぶのが嫌なので、複数画像を選択できるようにします。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
余計なアプリを呼び出したくない場合
上のままだと、ネットワークドライブや他アプリからもファイルが選択できます。
この場合、操作手順書を作る際に余計な機能について触れる必要がありめんどくさいので消します。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
画像形式を選択
取り扱う画像形式を制限したいので、選択可能な画像形式を設定します。
形式が1つの場合(例はJPEG)
Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
2つ以上の場合(例はJPEGとPNG)
Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/jpeg", "image/png"});
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
呼び出しは大体こんな感じです。
ギャラリーからの戻りの処理
ここからは受け取り側の処理についてです。
mainActivityの中に書けば動きます。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
Uri = uri;
if (data.getData() != null) {
// 選択画像が単数の場合の処理
uri = data.getData();
} else {
// 選択画像が複数の場合の処理
ClipData cd = data.getClipData();
for (int i=0; i<cd.getItemCount(); i++) {
uri = cd.getItemAt(i).getUri();
}
}
}
}
}
requestCodeは、呼び出し側のstartActivityForResult()で設定したものが返ってきます。
複数機能からの戻りがある場合は、ifやらswichtやらで機能ごとに処理を変えてください。
resultCodeは、呼び出しの成否です。
これで選択画像のURIを取得できるので、あとは自由に。