実現したいこと
カメラ起動というボタンを押したらAndroidのカメラが起動し、
撮ったものを表示できるようにしたいです。
今回はカメラ起動をメインに教えていただきたいです。
前提
Android Studioを使ってKotlinでスマホアプリの開発を行なっています。
https://qiita.com/naoi/items/04e44308221f6eb73024
上記のサイトを参考にしてみましたが、内部カメラが存在するかどうかのところで、存在していないというエラーメッセージがでるようになってしまいます。
もともとスマホ内にカメラアプリは御座います。
該当のソースコード
AndroidMinifest.xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools"> 4 5 <uses-permission android:name="android.permission.CAMERA"/> 6 <uses-feature android:name="android.hardware.camera" /> 7 <uses-feature android:name="android.hardware.camera.autofocus" /> 8 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 9 10 <application 11 android:allowBackup="true" 12 android:dataExtractionRules="@xml/data_extraction_rules" 13 android:fullBackupContent="@xml/backup_rules" 14 android:icon="@mipmap/ic_launcher" 15 android:label="@string/app_name" 16 android:roundIcon="@mipmap/ic_launcher_round" 17 android:supportsRtl="true" 18 android:theme="@style/Theme.SampleBtn" 19 tools:targetApi="31"> 20 <activity 21 android:name=".MainActivity" 22 android:exported="true" 23 android:label="@string/app_name" 24 android:theme="@style/Theme.SampleBtn"> 25 <intent-filter> 26 <action android:name="android.intent.action.MAIN" /> 27 28 <category android:name="android.intent.category.LAUNCHER" /> 29 </intent-filter> 30 </activity> 31 </application> 32 33</manifest>
activity_main.xml
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 tools:context=".MainActivity" 9 android:gravity="center"> 10 11 <TextView 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:id="@+id/cameraImage" /> 15 16 <Button 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:id="@+id/btnLaunchCamera" 20 android:text="@string/launch_camera"/> 21 22</LinearLayout> 23
MainActivity.kt
1package com.example.samplebtn 2 3import android.content.Context 4import android.content.Intent 5import android.content.pm.PackageManager 6import androidx.appcompat.app.AppCompatActivity 7import android.os.Bundle 8import android.provider.MediaStore 9import android.widget.Button 10import android.widget.TextView 11import android.widget.Toast 12import androidx.core.app.ActivityCompat 13import androidx.core.content.ContextCompat 14import android.Manifest 15import android.app.Activity 16 17 18class MainActivity : AppCompatActivity() { 19 companion object { 20 const val CAMERA_REQUEST_CODE = 1 21 const val CAMERA_PERMISSION_REQUEST_CODE = 2 22 } 23 24 override fun onCreate(savedInstanceState: Bundle?) { 25 super.onCreate(savedInstanceState) 26 setContentView(R.layout.activity_main) 27 } 28 29 //カメラ起動ボタン 30 override fun onResume(){ 31 super.onResume() 32 33 val cameraImage = findViewById<TextView>(R.id.cameraImage) 34 val btnLaunchCamera = findViewById<Button>(R.id.btnLaunchCamera) 35 36 btnLaunchCamera.setOnClickListener{ 37 38 Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(packageManager)?.let { 39 if(checkCameraPermission()) { 40 takePictire() 41 } 42 else { 43 grantCameraPermission() 44 } 45 } ?: Toast.makeText(this, "カメラがありません。", Toast.LENGTH_LONG).show() 46 } 47 } 48 49 //撮影した写真をビューに追加 50 //override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 51 // if(requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 52 // val image = data?.extras?.get("data")?.let { 53 // cameraImage.setImageBitmap(it as Bitmap) 54 // } 55 // } 56 //} 57 58 private fun takePictire(){ 59 val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { 60 addCategory(Intent.CATEGORY_DEFAULT) 61 } 62 startActivityForResult(intent, CAMERA_REQUEST_CODE) 63 } 64 65 //カメラへのアクセス許可 66 private fun checkCameraPermission() = PackageManager.PERMISSION_GRANTED == 67 ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.CAMERA) 68 69 private fun grantCameraPermission() = 70 ActivityCompat.requestPermissions(this, 71 arrayOf(Manifest.permission.CAMERA), 72 CAMERA_PERMISSION_REQUEST_CODE) 73 74 override fun onRequestPermissionsResult(requestCode: Int, 75 permissions: Array<out String>, 76 grantResults: IntArray) { 77 super.onRequestPermissionsResult(requestCode, permissions, grantResults) 78 if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) { 79 if (grantResults.isNotEmpty() && 80 grantResults[0] == PackageManager.PERMISSION_GRANTED) { 81 takePictire() 82 } 83 } 84 } 85 86} 87
試したこと
撮影した写真をビューに追加ところはエラーが出てしまうため、とりあえずコメントアウトしています。
デバックで確認すると、
Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(packageManager)?.let {
のあとは、
} ?: Toast.makeText(this, "カメラがありません。", Toast.LENGTH_LONG).show()
にとんでしまって、現在ボタンを押したら、カメラがありませんとメッセージが出ます。
実行するスマホ側に問題があるのか、書いているコード自体に問題があるのかが分からないので、考えられる原因だけでも教えていただけると嬉しいです。よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
Android Studio 2022.2.1
Android Gradle Plugin Version 8.0.2
Gradle Version 8.0
Compile Sdk Version 33
Kotlin プラグインバージョン 222-1.8.20
回答1件
あなたの回答
tips
プレビュー