実現したいこと
Androidのスマホ上で、Bitmapの画像データをjpeg形式にしてスマホ内のStrageに保存したい。
発生している問題・分からないこと
Bitmapの画像データをjpegやpngにしてスマホに保存する方法について、いくつかのサイトを参考にさせていただいて下記のようなコードを書きましたが、buttonを押したところでエラーが起き、画像の保存はできません。エラーが出るのは、saveBitmap関数の中の val out = FileOutputStream(attachName) のところです。
Bitmapを何とかしてスマホに保存したいと思っており、どうかご教示いただければありがたいです。
エラーメッセージ
error
1Caused by: java.io.FileNotFoundException: /storage/emulated/0/BitmapTest/MyJpegFile.jpg: open failed: ENOENT (No such file or directory)
該当のソースコード
MainActivity
1package ・・・bitmaptest 2 3import・・・ 4 5class MainActivity : AppCompatActivity() { 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 setContentView(R.layout.activity_main) 9 10 val bmp = BitmapFactory.decodeResource(resources, R.drawable.my_photo) //my_photoはdrawable内に置いた画像ファイル 11 findViewById<Button>(R.id.button).setOnClickListener { 12 if(bmp !=null){ 13 saveBitmap(bmp!!) 14 } 15 } 16 } 17 18 private fun saveBitmap(saveImage: Bitmap) { 19 val SAVE_DIR = "/BitmapTest/" 20 val file = File(Environment.getExternalStorageDirectory().path + SAVE_DIR) 21 try { 22 if (!file.exists()) { 23 file.mkdir() 24 } 25 } catch (e: SecurityException) { 26 e.printStackTrace() 27 throw e 28 } 29 val fileName: String = "MyJpegFile.jpg" 30 val attachName = file.absolutePath + "/" + fileName 31 32 try { 33 val out = FileOutputStream(attachName) 34 saveImage.compress(CompressFormat.JPEG, 100, out) 35 out.flush() 36 out.close() 37 } catch (e: IOException) { 38 e.printStackTrace() 39 throw e 40 } 41 42 val values = ContentValues() 43 val contentResolver: ContentResolver = contentResolver 44 values.put(Images.Media.MIME_TYPE, "image/jpeg") 45 values.put(Images.Media.TITLE, fileName) 46 values.put("_data", attachName) 47 contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values) 48 } 49} 50
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-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 6 android:maxSdkVersion="32" /> 7 8 <application 9 android:allowBackup="true" 10 android:dataExtractionRules="@xml/data_extraction_rules" 11 android:fullBackupContent="@xml/backup_rules" 12 android:icon="@mipmap/ic_launcher" 13 android:label="@string/app_name" 14 android:roundIcon="@mipmap/ic_launcher_round" 15 android:supportsRtl="true" 16 android:theme="@style/Theme.BitmapTest" 17 tools:targetApi="31"> 18 <activity 19 android:name=".MainActivity" 20 android:exported="true"> 21 <intent-filter> 22 <action android:name="android.intent.action.MAIN" /> 23 24 <category android:name="android.intent.category.LAUNCHER" /> 25 </intent-filter> 26 </activity> 27 </application> 28</manifest>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
似た問題について、”file.mkdir()"のあとに”file.createNewFile()"を付け加えると良いとの情報があった(https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10167272950) が、これを試すと別の種類のエラー(Caused by: java.io.IOException: Permission denied)が発生した。
補足
特になし
回答2件
あなたの回答
tips
プレビュー