[Android] Camera で撮影、Intentで簡単に

AndroidでCameraを扱うケースでAPI21以上はCamera2を使うことが推奨されますが、これはそれより低いバージョンでは使えない上に旧方式とはやり方が異なります。本格的なカメラアプリであれば別ですが、オプション的に画像をカメラで撮って使いたい場合はIntentを使うことで「比較的」簡単にできます。

API24から、このあたりが多少変わったようです。また、External Storageを使う方法を後半で紹介していますが、API24から android.os.FileUriExposedException というエラーがでるようになりました。

device-2016-07-30-113612
device-2016-07-30-112639
device-2016-07-30-112725

 

Android Studio 2.1.3
Android 7.0

 

sponsored link

ACTION_IMAGE_CAPTURE

 
Intentで飛ばして間接的にカメラを起動させるのでAndroid6.0からのRuntime Permissionに引っかかりません。
 

 
Intentで飛ばしたので結果を受け取るためにonActivityResultを使います。
 

シンプルなカメラ起動

 
上記内容をまとめると

MainActivity.java

 
activity_main.xml

 
これをemulatorで使ってみたいと思います。AVDでemulatorの設定を変更します。
 
スクリーンショット 2016-07-29 17.02.46
 
設定詳細の中にあるCameraのFrontあるいはBackを「emulated」にします。
これでアプリを起動すると、
 
cameraIntent01
 
撮影したあとはチェック「✔︎」をクリックすると画像が表示されます。
 
cameraIntent02
 
ただし、これはサムネイル程度のとても小さい画像です。ここでは拡大するようにしていますが、emulatorでは(160 x 120pix)しかありません、また端末によっては画像が回転しているケースもあります。
また、Webcam0はPCのカメラですが、これもサムネイルサイズです。
 

外部メモリ領域に保存してカメラ画像を取得

 
ある程度大きい画像で表示したい場合は画像をファイルとして保存して、その画像を表示させます。ただし、カメラアプリをintentで起動させるので、アプリ自身は再起動することになり、Uriを何らかの方法を保存しておかないといけません。
 
Bundle savedInstanceState
Bundle outState
を使ってみます
 

 
また、外部メモリー領域を使いますので「WRITE_EXTERNAL_STORAGE」のPermissionを追加します。これはAndroid 6.0 Runtime Permission の dangerous permissionに該当するため、ユーザーに許可を求める必要があります。(やっぱりPermission Checkが必要になるのか…)
Runtime Permission, Android 6.0 からの変更
 
更に、API24からはUriをfile://xxx という使い方ができなくなったためFileProviderを使います。
https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en
 

FileProvider tag を AndroidManifestに追加します。

AndroidManifest.xml

 
android:resource=”@xml/provider_paths”
の箇所を設定します。res¥xml¥provider_paths.xml ファイルを作って以下のように記述します。
 
provider_paths.xml

 
あとは、Uri.fromFileの変更です。
 

 

これでまとめると
MainActivity.java

 

API23までは

 
API23まではこれでできました。簡単な方法として、

とすれば今の所継続して使用できます。
MainActivity.java

 
レイアウトファイルは前と同じですが、
ManifestにはPermissionを追加します。
AndroidManifext.xml

 
device-2016-07-30-112639
 
device-2016-07-30-112725
機種により画像が回転したりフォルダパスの依存性がありますが、これが一番汎用性があると思っています。

 
References:
https://developer.android.com/guide/topics/media/camera.html#intent-image
https://developer.android.com/training/permissions/requesting.html