はじめに
DreamHanksのMOONです。
前回は機器のギャラリーから写真を取得し、画面に表示しました。
17. 【Android/Kotlin】ギャラリーから写真を取得
今回はカメラで写真を撮り、その写真を画面に表示していきます。
カメラの権限を取得することについては下記の「Permission」を参考してください。
16. 【Android/Kotlin】Permission(権限設定)
設定事項
今回は下記の作業が必要です。
・Manifestにカメラの権限について設定を追加
・fileproviderに対するxmlファイルを作成
・Manifestにprovider設定
・Activityに権限とイメージファイルについて設定
Manifestにカメラの権限について設定を追加
AndroidManifest.xml
1 2 3 4 5 6 7 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.practiceapplication"> .... .... .... <uses-permission android:name="android.permission.CAMERA" /> </manifest> |
カメラに対するパーミッションを追加
fileproviderに対するxmlファイルを作成
「res→xml」に下記のファイルを追加
file_paths.xml
1 2 3 4 |
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="Android/data/com.example.practiceapplication/files/Pictures" /> </paths> |
Manifestにprovider設定
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<application> ..... ..... ..... <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.practiceapplication.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> </application> |
「xml」パースに追加したproviderファイルについて設定
Activityに権限とイメージファイルについて設定
CameraActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
package com.example.practiceapplication import android.Manifest import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.graphics.ImageDecoder import android.net.Uri import android.os.Build import android.os.Bundle import android.os.Environment import android.provider.MediaStore import android.util.Log import android.widget.Button import android.widget.ImageView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import java.io.File import java.io.IOException import java.text.SimpleDateFormat import java.util.* class CameraActivity : AppCompatActivity() { private val REQUEST_IMAGE_CAPTURE = 2 private val RECORD_REQUEST_CODE = 1000 private lateinit var camera_iv: ImageView private lateinit var camera_btn: Button private lateinit var currentPhotoPath: String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_camera) camera_iv = findViewById<ImageView>(R.id.camera_iv) camera_btn = findViewById<Button>(R.id.camera_btn) setupPermissions() //EditTextのクリックイベントを設定 camera_btn.setOnClickListener { dispatchTakePictureIntent() } } // カメラを開くためのメソッド private fun dispatchTakePictureIntent() { Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent -> if (takePictureIntent.resolveActivity(this.packageManager) != null) { // カメラで撮った写真をイメージファイルに作り val photoFile: File? = try { createImageFile() } catch (ex: IOException) { Log.d("TAG", "イメージファイルを生成中にエラーが発生") null } // イメージファイルを成功に作った場合onActivityForResultに送る photoFile?.also { val photoURI: Uri = FileProvider.getUriForFile( this, "com.example.practiceapplication.fileprovider", it ) takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } } } } // カメラで撮った写真をイメージファイルに格納するためのメソッド @Throws(IOException::class) private fun createImageFile(): File { // Create an image file name val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date()) val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES) return File.createTempFile( "JPEG_${timeStamp}_", /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ).apply { // Save a file: path for use with ACTION_VIEW intents currentPhotoPath = absolutePath } } // onActivityResultにイメージ設定 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode){ 2 -> { if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK){ // カメラから受け取ったデーターがある場合 val file = File(currentPhotoPath) // SDKのバージョンが28以下の場合 if (Build.VERSION.SDK_INT < 28) { val bitmap = MediaStore.Images.Media .getBitmap(contentResolver, Uri.fromFile(file)) //Deprecated camera_iv.setImageBitmap(bitmap) } else{ val decode = ImageDecoder.createSource(this.contentResolver, Uri.fromFile(file)) val bitmap = ImageDecoder.decodeBitmap(decode) camera_iv.setImageBitmap(bitmap) } } } } } //パーミッションのチェックを設定するためのメソッド private fun setupPermissions() { val permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) if (permission != PackageManager.PERMISSION_GRANTED) { makeRequest() } } //パーミッションをリクエストするためのメソッド private fun makeRequest() { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), RECORD_REQUEST_CODE) } //パーミッションの許可の結果による実行されるメソッド override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { when(requestCode){ RECORD_REQUEST_CODE ->{ if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) { Toast.makeText(applicationContext, "カメラ機能が許可されませんでした。", Toast.LENGTH_SHORT).show() }else{ Toast.makeText(applicationContext, "カメラ機能が許可されました。", Toast.LENGTH_SHORT).show() } return } } } } |
①権限の取得について設定(パーミッション設定リンク参考)
②カメラにIntentするためのメソッド追加
③カメラの写真に対するイメージファイルを生成するためのメソッドを追加
④onActivityResultメソッドにカメラからのイメージファイルをSDKバージョンによってImageViewに設定
activity_camera.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".CameraActivity" android:gravity="center"> <ImageView android:layout_width="300dp" android:layout_height="300dp" android:id="@+id/camera_iv" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/camera_btn" android:text="カメラ"/> </LinearLayout> |
レイアウトのxmlファイルを追加
アプリ起動
※アプリがカメラのアクセス権限について許可されていると仮定
・初期の画面
・「カメラ」ボタンをクリックした場合(カメラの画面に遷移)
・写真を撮り、「OK」した場合(画面に写真が表示)
終わりに
今回はカメラで写真を撮り、その写真を画面に表示しました。
次回はViewPagerとTabLayoutでタブビュー機能をしていきます。
コメント