質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3181閲覧

Android(Kotlin)でフルサイズの写真を撮影して保存する処理ができません

afterhiroshima

総合スコア6

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/02/15 07:18

前提・実現したいこと

Androidのdevelopersドキュメントの写真を撮影する(https://developer.android.com/training/camera/photobasics.html?hl=ja)
を参考にしてフルサイズの写真を保存する処理をKotlinで書いています。
起動されたAndroid カメラアプリで写真を撮影して、「レ点」をクリックすると、
下記のスマホの実機に「問題が発生したため・・・」というエラーメッセージが表示されてしまいます。この原因と対策方法をご教示ください。

発生している問題・エラーメッセージ

「問題が発生したため○○アプリを終了します」 Logcatで表示されたエラーメッセージは以下になります。 02-05 22:52:00.673 435-435/com.cosmoserv.facephotoresize E/AndroidRuntime: FATAL EXCEPTION: main Process: com.cosmoserv.facephotoresize, PID: 435 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.cosmoserv.facephotoresize/com.cosmoserv.facephotoresize.MainActivity}: kotlin.TypeCastException: null cannot be cast to non-null type android.graphics.Bitmap at android.app.ActivityThread.deliverResults(ActivityThread.java:3839) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3882) at android.app.ActivityThread.access$1300(ActivityThread.java:178) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1519) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5637) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) Caused by: kotlin.TypeCastException: null cannot be cast to non-null type android.graphics.Bitmap at com.cosmoserv.facephotoresize.MainActivity.onActivityResult(MainActivity.kt:227) at android.app.Activity.dispatchActivityResult(Activity.java:6294) at android.app.ActivityThread.deliverResults(ActivityThread.java:3835) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3882)  at android.app.ActivityThread.access$1300(ActivityThread.java:178)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1519)  at android.os.Handler.dispatchMessage(Handler.java:111)  at android.os.Looper.loop(Looper.java:194)  at android.app.ActivityThread.main(ActivityThread.java:5637)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 

該当のソースコード

xml

1(AndroidManifest.xml ファイル) 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.cosmoserv.facephotoresize"> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 5 <uses-feature android:name="android.hardware.camera" 6 android:required="true" /> 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/AppTheme"> 14 <activity android:name=".SettingActivity"></activity> 15 <activity android:name=".PhotoUploadActivity" /> 16 <activity android:name=".PhotoResizeActivity" /> 17 <activity android:name=".MainActivity"> 18 <intent-filter> 19 <action android:name="android.intent.action.MAIN" /> 20 <category android:name="android.intent.category.LAUNCHER" /> 21 </intent-filter> 22 </activity> 23 <provider 24 android:name="android.support.v4.content.FileProvider" 25 android:authorities="com.cosmoserv.android.fileprovider" 26 android:exported="false" 27 android:grantUriPermissions="true"> 28 <meta-data 29 android:name="android.support.FILE_PROVIDER_PATHS" 30 android:resource="@xml/file_paths"></meta-data> 31 </provider> 32 </application> 33</manifest> 34

Kotlin

1class MainActivity : AppCompatActivity() { 2 … 省略 3 4 //インテントを呼び出して写真を撮影する関数 5 private fun dispatchTakePictureIntent() { 6 //WRITE_EXTERNAL_STORAGEの許可が下りていないなら… 7 if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 8 //WRITE_EXTERNAL_STORAGEの許可を求めるダイアログを表示。その際、リクエストコードを2000に設定。 9 val permissions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE) 10 ActivityCompat.requestPermissions(this, permissions, 2000) 11 return 12 } 13 // Create the File where the photo should go 14 val photoFile: File? = try { 15 createImageFile() 16 } catch (ex: IOException) { 17 // Error occurred(エラーが発生しました) while creating the File 18 //エラーメッセージ トースト表示 19 var show = "★createImageFile()呼び出しでエラーあり!" 20 Toast.makeText(applicationContext, show, Toast.LENGTH_LONG).show() 21 null 22 } 23 if (photoFile != null) { 24 // Continue only if the File was successfully created 25 val photoURI: Uri = FileProvider.getUriForFile( 26 this, 27 "com.cosmoserv.android.fileprovider", 28 photoFile 29 ) 30 //カメラ起動のIntentオブジェクトを生成。 31 val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) 32 intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) 33 //カメラのアクティビティを起動(リクエストコード:100) 34 startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) 35 } 36 } 37

Kotlin

1 //写真ファイル名のフィールド 2 var _currentPhotoPath: String? = null 3 4 //タイムスタンプを使用して新しい写真の一意のファイル名を返すメソッド 5 @Throws(IOException::class) 6 private fun createImageFile(): File { 7 // Create an image file name 8 val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date()) 9 val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES) 10 return File.createTempFile( 11 "JPEG_${timeStamp}_", /* prefix */ 12 ".jpg", /* suffix */ 13 storageDir /* directory */ 14 ).apply { 15 // Save a file: path for use with ACTION_VIEW intents (absolutePath:絶対的なパス) 16 _currentPhotoPath = absolutePath 17 } 18 } 19

試したこと

・写真の一意のファイル名を返すメソッドcreateImageFile()は、問題なく処理できていました。

・ストレージへ保存するための「intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)」この行を
コメントアウトすると、上記のエラーは発生しません。
(当然ながらストレージに保存されていません)

・Android カメラアプリで撮影した写真のファイル名とファイルパスについてですが、
▼_currentPhotoPath(生成したファイル名)の値が、
/storage/sdcard0/Android/data/com.cosmoserv.facephotoresize/files/Pictures/JPEG_20200205_224524_-2019103798.jpg で、
このファイルがサイズ:0バイトで作成されていました。
これとは別に撮影した写真ファイルが、別のファイル名で、同一パスの場所に保存されていました。
(保存できたファイル名と、生成したファイル名がなぜ異なるのか不明です)

補足情報(FW/ツールのバージョンなど)

Language : Kotlin
Minimum API level :API 15: Android 4.0.3 (IceCreamSandwich)

Android Studio 3.5.2
Build #AI-191.8026.42.35.5977832, built on October 31, 2019
JRE: 1.8.0_202-release-1483-b03 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

スマホ実機 機種
Plus One Japan Limited FTJ152A
Androidバージョン 5.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージには

Caused by: kotlin.TypeCastException: null cannot be cast to non-null type android.graphics.Bitmap at com.cosmoserv.facephotoresize.MainActivity.onActivityResult(MainActivity.kt:227)

とあるので、Bitmap が null ということですね。おそらく MainActivity.kt の 227 行には

kotlin

1 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { 2 if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 3 val imageBitmap = data.extras.get("data") as Bitmap 4 imageView.setImageBitmap(imageBitmap) 5 } 6 }

と書いてあるんだと思いますが、data.extras.get("data") が null(つまり data の値が設定されてない)ためにエラーになるんだと思います。

で、stackoverflow で検索すると、EXTRA_OUTPUT を設定すると data は取れないことが分かります。写真をまるっと保存するんだからサムネイル(data)は不要でしょってことだと思われます。
Android Camera : data intent returns null - Stack Overflow

写真のファイルが空な理由は分かりませんが、もしかして、上記エラーのせいで写真のファイル名を変更する前にクラッシュしてるのかも。

投稿2020/02/15 08:49

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

afterhiroshima

2020/02/15 09:39

早速のご回答ありがとうございました。 data.extras.get("data") ←ここの行をコメントアウトしたら上記のエラーが無くなり処理ができるようになりました。 Logcatのエラー発生個所の見方も分かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問