機種に依りますが、Environment.getExternalpublicStorageDirectoryでディレクトリを掘り出して中身を見ると、ほとんどの端末は内部ストレージ「storage/emulated/0」に画像を保存しています。ですがandroid5.0からは、撮った画像を自動でSDカードにいれる仕様をもった端末がぞくぞく出てきており、「sdcard」や「storage/sdcard1」など、それぞれが全く違うディレクトリを持っています。
この派生が増えすぎたこともあり、ディレクトリを操作する必要のあるアプリでは機種依存による仕様修正を余儀なくされています。今自分が修正しているアプリも例外でなく、内部ストレージと外部ストレージ(SDカード)の使い分ける処理に四苦八苦しております。2016年からはUUIDが付与された外部ストレージや、そもそも外部ストレージがおおやけに公開されていないOSがリリースされており、アプリのメンテナンスにおける弊害が懸念されます。
今自分が書いているコードは、getExternalFilesDirsAPIを用いて端末における全てのストレージのディレクトリを取得し、その中で(外部ディレクトリ)撮った画像が保存されるディレクトリのみを取り出して共有させるという半ば強引なプロセスを基盤にしています。Environmentメソッドを使わなくともディレクトリを取得できる、しかもSDカードが無いときは自動的に一番先頭の配列(内部ストレージ)を探してくれるのでなかなか柔軟ですね。
File photoFile = null; try{ String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File[] storageDir = getActivity().getExternalFilesDirs(null); File dirs = new File(storageDir[0].getPath()); if (!dirs.exists()) dirs.mkdir(); photoFile = File.createTempFile(imageFileName, ".jpg", dirs); System.out.println(dirs); } catch (Exception e) {} imageUri = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", photoFile);
今更なのですが、Environment.getExternalpublicStorageDirectoryってもう古いんですね・・・。2012年ころにリリースされたAPIでもうレガシーだなんて知りませんでした。