目的

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

環境

  • Android Studio 4.0.1
  • kotlin

参照ページ

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

参照ページとはかなり変えているので、メモ

作成方法

Android.Manifest設定

現在は以下が必要。

Android.Manifest設定
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

レイアウト

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

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

コード/Kotlinファイル

class Camera: Fragment() {

    private val CAMERA_REQUEST_CODE = 1
    private val CAMERA_PERMISSION_REQUEST_CODE = 2

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ....

        //camera
        materialcamerabutton.setOnClickListener {
            //カメラ機能のチェック
            this.context?.packageManager?.let {
                Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(it)?.let {
                    if (checkCameraPermission()) {
                        takePicture()
                    } else {
                        grantCameraPermission()
                    }
                }
            }
        }

        ...
    }

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

    private fun grantCameraPermission() = activity?.let {
        ActivityCompat.requestPermissions(it, 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()
            }
        }
    }

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

        startActivityForResult(intent, CAMERA_REQUEST_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        data?.extras?.get("data")?.let {
            image.setImageBitmap(it as Bitmap)
        }
    }
}

利用イメージ

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

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

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