diadia

興味があることをやってみる。自分のメモを残しておきます。

カメラを使うアプリの実装方法

カメラ使用にはパーミッションが必要である

<uses-permission android:name="android.permission.CAMERA"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

当初カメラを使う場合にはandroid.permission.CAMERAのみを使えば使えると思っていたが、それは間違いであった。カメラアプリで撮影した画像を保存すること、また保存するディレクトリを作成する際にandroid.permission.WRITE_EXTERNAL_STORAGEが必要になる。

パーミッションのチェック

カメラの場合はマニフェスト.xmlファイルにパーミッションについての旨を記述する他、アプリ起動中にユーザーに聞く事が必要になる。 またandroid6以上から聞く必要があるようで、それ以前は聞く必要がないようだ。

撮った画像を外部ストレージに共有する方法

撮った写真を共有するためには、外部ストレージに保存し、その外部ストレージから画像を読み込む必要があることが分かった。 外部ストレージの保存場所としてuriを使う事がわかった。

uriに関してはUriクラスを使って、例えば以下のように

val uri:Uri = Uri.parse("file/path")

uriを生成することができる。しかしながらこのuriを使っても外部ストレージから画像を読み込むことができないようだ。

uriはcontentProviderを使わないと他のアプリと画像を共有できない縛りがある事がわかった。 つまりcontentProviderで作成したuriを使わないと他のアプリと共有することができない。

ここでまとめると、カメラアプリで撮った写真を自分のアプリで利用する場合には、ContentProviderで生成したuriを利用する。 uriはファイルパスなのでファイルパスは自分で生成しておく。 そしてファイルパス(Fileクラス)をContentProviderにわたす手続きとなる。 またContentProviderにはファイル専用のuriを生成するサブクラスがあるらしい。これを使うと以下のような感じでuriを生成できる。

val uri = FileProvider.getUriForFile(this, applicationContext.packageName + ".fileprovider" ,contentFile)

contentFile(Fileクラス)は以下のように生成する。

val contentFile = File("file/path")

カメラアプリの起動方法

intentを使えば良い。

var uri = "hoge"
val CODE = 200 
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply{
    putExtra(MediaStore.EXTRA_OUTPUT, uri)
    startActivityForResult(intent, CODE)
}

putExtraメソッドでMediaStore.EXTRA_OUTPUT, uriを渡しているが、このuriはFileProviderオブジェクトである。このオブジェクトを使うことでカメラアプリが保存した写真を自前アプリで扱う事ができる。 FileProviderのドキュメント:

FileProvider  |  Android Developers

撮った写真を画面に表示する場合

onActivityResultメソッドをoverrideして以下のコードをその中に記述する。

imageView.setImageURI(Uri.parse(strUri))

撮った写真を削除する場合

撮った写真の削除はつまり、スマホ本体にある画像を削除することである。 contentResolverを使えば良い。 ContentResolver  |  Android Developers

サンプルコード

GitHub - chiaki1990/CameraSample_kotlin: カメラを使う場合のパーミッション、FileProvider、写真の削除等のサンプル