目的

Androidで簡易カメラ機能を作成するときのメモ
標準アプリのような潤沢な機能はなく、ただ撮ってimageに貼り付けるだけです。
保存も行いません。


環境

Android Studio 3.5.1
kotlin ※このブログでは今までJavaでコードを書いてきましたが、今回はkotlinで書きます。


参照ページ

KotlinでAndroidのカメラ機能を利用する

参照ページより一部変更しているため、このページでもメモを残します。


作成方法

Android.Manifest設定

ちなみにですが、カメラ撮影だけであれば、Android.Manifestの設定は不要のようです。
画像をストレージに保存する場合はパーミッション設定が必要です。


レイアウト

レイアウトは適切に作りました。
画像はカメラ撮影を貼り付けるために。
ボタンは撮影画面に遷移するためのものです。



カメラ撮影画面はOSが準備しているのを利用します。


コード/Kotlinファイル

import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.camera.*

class Camera: AppCompatActivity() {

    companion object {
        const val CAMERA_REQUEST_CODE = 1
        const val CAMERA_PERMISSION_REQUEST_CODE = 2
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.camera)

        buttonCamera.setOnClickListener {
            //カメラ機能が存在するかチェック
            Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(packageManager)?.let {
                if (checkCameraPermission()) {
                    takePicture()
                } else {
                    grantCameraPermission()
                }
            } ?: Toast.makeText(this, "カメラを扱うアプリがありません", Toast.LENGTH_LONG).show()
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            val image = data?.extras?.get("data")?.let {
                cameraImage.setImageBitmap(it as Bitmap)
            }
        }
    }

    private fun takePicture() {
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
            addCategory(Intent.CATEGORY_DEFAULT)
        }

        startActivityForResult(intent, CAMERA_REQUEST_CODE)
    }

    private fun checkCameraPermission(): Boolean {
        return PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(applicationContext, android.Manifest.permission.CAMERA)
    }

    private fun grantCameraPermission() = ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), CAMERA_PERMISSION_REQUEST_CODE)

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                takePicture()
            }
        }
    }
}



利用イメージ

以下のような撮影画面となります。



イメージは比率そのままで、縦か横の目一杯に設定されます。


カメラ機能作成メモは以上です。