diadia

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

カメラを使う

カメラアプリを起動する

カメラを起動するにはintentオブジェクトを生成し、アクティビティを起動する必要がある。また以下の2行をボタンやImageViewのタップと同時に起動する仕組みにしておくと良い。またカメラに関してはユーザーのパーミッションマニフェストファイルへのカメラ使用の宣言は不必要となっている。

カメラアプリを起動するコード
    
//intentオブジェクトを生成する方法
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)

startActivityForResult(intent, 200)

カメラアプリ終了後に起動元アクティビティに戻したい場合にはstartActivityForResult()を利用するとよい。つまりカメラアプリを使ったあとに自動的にカメラアプリ起動前のアプリに移動させる仕組みをstartActivityForResultが担っている。

 

またstartActivityForResultには、ついになるメソッドがある。これはカメラアプリ起動前のアプリに再び戻ってきたときに実行されるメソッドである。メソッド名は、onActivityResult()である。

カメラで撮った画像をストレージに保存する

画像をストレージに保存する場合には、ストレージ利用のためのパーミッションを許可する必要がある。ということはマニフェストファイルにその旨を記述すること、ユーザーに許可をとるダイアログの表示が必要だと思われる。
マニフェストファイルには以下のように記述する。

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

ユーザーにパーミッションの許可を取るダイアログを表示する。

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
    PackageManager.PERMISSON_GRANTED) {
    
    val permissions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
    ActivityCompat.requestPermissions(this, permissions, 2000)
    return 
    }

ストレージの画像をImageViewで表示するために使うもの

ImageViewオブジェクト.setImageURI(表示したい画像のUri)で表示することができる。
具体的に表示させる手続きを言えば、

  1. まず表示したい画像のUriオブジェクトを生成する。
  2. 表示したいレイアウトファイルのImageViewをzfindViewByIdで取得する。
  3. ImageViewオブジェクト.setImageURI(表示したい画像のUri)をアクティビティ(.ktファイル)に記述する。

コードに起こすと以下のようになる。

val _imageUri = 画像uri作成コード
val showImage = findViewById<ImageView>(R.id.showImage)
showImage.setImageURI(_imageUri)

ImageViewのその他使い方

ImageViewはレイアウトファイル内にて、android:onClick属性を設定する事ができるようだ。例えばandroid:onClickを設定すると、ImageView全体をタップするとカメラアプリを起動する仕組みを実装する事ができる。

表示するソースの指定(htmlでいうimgタグsrc属性)はImageViewで行われる。属性は以下となる。

app:srcCompat="@android:drawable/ic_menu_camera"

撮影した画像をストレージに保存する方法

カメラアプリを起動するintentオブジェクトにUriオブジェクトをExtraデータに埋め込むだけで良い。

intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri)

_imageUriはUriオブジェクトであり、これはcontentResolverオブジェクトのinsertメソッドを用いて作成する必要がある。

contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values )

valuesはContentValuesオブジェクトであり、Uriオブジェクトを生成するにはContentValuesインスタンスを生成する必要がある。

val values = ContentValues()
//画像ファイル名を設定
values.put(MediaStore.Images.Media.TITLE, filename )
//画像ファイルの種類を設定
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")

まとめ

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
    PackageManager.PERMISSON_GRANTED) {
    
    val permissions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
    ActivityCompat.requestPermissions(this, permissions, 2000)
    return 
    }
    
val dateFormat = SimpleDateFormat("yyyyMMddHHmmss")
//現在の日時を取得
val now = Date()
val nowStr = dateFormat.format(now)
val filename = "UseCameraActvityFoto_${nowStr}.jpg"


val values = ContentValues()
//画像ファイル名を設定
values.put(MediaStore.Images.Media.TITLE, filename )
//画像ファイルの種類を設定
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")

_imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values )

//intentオブジェクトを作成
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)

intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri)
//アクティビティを起動
startActivityForResult(intent, 125)