実現したいこと
- AndroidStudioにて端末標準カメラとの連携をする
前提
Androidアプリ開発の教科書 という書籍にて十五章のカメラアプリの実装をそのまま行ってもエラーになってしまっている
https://books.google.co.jp/books?id=xTCwEAAAQBAJ&lpg=PA390&ots=Xam-ZKS4As&dq=_cameraLauncher&hl=ja&pg=PA395#v=onepage&q=_cameraLauncher&f=true
書籍はここから見ることが出来ます
発生している問題・エラーメッセージ
ソースコード41行目のgetParcelableExtraに線が引かれており、非推奨となっている
また実行後logcatではonCameraImageClickメソッドでの例外判定が出ているため
実機で起動しても起動するとアプリが落ちてしまう
logcat におけるエラー文 FATAL EXCEPTION: main Process: com.example.cameraintentsample, PID: 20500 java.lang.IllegalStateException: Could not execute method for android:onClick at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:473) at android.view.View.performClick(View.java:7463) at android.view.View.performClickInternal(View.java:7432) at android.view.View.access$3600(View.java:817) at android.view.View$PerformClick.run(View.java:28324) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:368) at android.app.ActivityThread.main(ActivityThread.java:7710) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method)
該当のソースコード
Kotlin
1package com.example.cameraintentsample 2 3import android.app.Instrumentation 4import android.content.Intent 5import android.graphics.Bitmap 6import android.os.Build 7import androidx.appcompat.app.AppCompatActivity 8import android.os.Bundle 9import android.provider.MediaStore 10import android.view.View 11import android.widget.ImageView 12import androidx.activity.result.ActivityResult 13import androidx.activity.result.ActivityResultCallback 14import androidx.activity.result.contract.ActivityResultContracts 15 16class MainActivity : AppCompatActivity() { 17 //cameraアクティビティを起動するためのランチャーオブジェクト 18 private val _cameraLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult() 19 ,ActivityResultCallbackFromCamera()) 20 override fun onCreate(savedInstanceState: Bundle?) { 21 super.onCreate(savedInstanceState) 22 setContentView(R.layout.activity_main) 23 } 24 //画像部分がタップされた時の処理メソッド 25 fun onCameraImageClick(view: View){ 26 //Intentオブジェクト 27 val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) 28 //アクティビティを起動 29 _cameraLauncher.launch(intent) 30 } 31 //Cameraアクティビティから戻ってきたときの処理が記述されたコールバッククラス 32 private inner class ActivityResultCallbackFromCamera : ActivityResultCallback<ActivityResult>{ 33 override fun onActivityResult(result: ActivityResult) { 34 //カメラアプリで撮影成功の場合 35 if(result?.resultCode == RESULT_OK){ 36 //撮影された画像のビットマップデータを取得 37 val bitmap = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){ 38 result.data?.getParcelableExtra("data",Bitmap::class.java) 39 } 40 else{ 41 result.data?.getParcelableExtra<Bitmap>("data") 42 } 43 //画像を表示する 44 val ivCamera = findViewById<ImageView>(R.id.ivCamera) 45 //撮影された画像をimageviewに設定 46 ivCamera.setImageBitmap(bitmap) 47 } 48 } 49 } 50}
xml
1<?xml version="1.0" encoding="utf-8"?> 2<ImageView 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:id="@+id/ivCamera" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:layout_gravity="center" 9 android:onClick="onCameraImageClick" 10 android:scaleType="center" 11 app:srcCompat="@android:drawable/ic_menu_camera" 12 tools:ignore="SpeakableTextPresentCheck" />
Manifest
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-feature android:name="android.hardware.camera.any" /> 6 <uses-permission android:name="android.permission.CAMERA" /> 7 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 8 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 9 android:maxSdkVersion="33" /> 10 11 <application 12 android:allowBackup="true" 13 android:dataExtractionRules="@xml/data_extraction_rules" 14 android:fullBackupContent="@xml/backup_rules" 15 android:icon="@mipmap/ic_launcher" 16 android:label="@string/app_name" 17 android:roundIcon="@mipmap/ic_launcher_round" 18 android:supportsRtl="true" 19 android:theme="@style/Theme.CameraIntentSample" 20 tools:targetApi="31"> 21 <activity 22 android:name=".MainActivity" 23 android:exported="true"> 24 <intent-filter> 25 <action android:name="android.intent.action.MAIN" /> 26 27 <category android:name="android.intent.category.LAUNCHER" /> 28 </intent-filter> 29 </activity> 30 </application> 31 32</manifest>
試したこと
線が引かれて非推奨の部分を変えてみたりSDKバージョンを変更してみたが出来なかった
またlogcatのエラーにあるonCameraImageClickメソッドのonClickの設定忘れでもなかった

回答1件
あなたの回答
tips
プレビュー