Android ローカルストレージにファイルを保存する方法


MediaStoreに保存

Androidでローカルにファイルを保存する際、MediaStoreを使用した場合のやり方をメモがわりに記載しました。

下記'Video'の部分を'Images','Audio'などにかえると他のファイル形式でも対応可能です。
拡張子の部分はmimeTypeを指定してください。

https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
     /**
      * 動画保存 ローカル
      */
     fun saveVideoToLocal(storedFile: File, contentResolver: ContentResolver) {
         try {
             val storedValue = ContentValues().apply {
                 // ファイル名
                 put( MediaStore.MediaColumns.DISPLAY_NAME, "file_name")
                 // 拡張子
                 put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
                 // 保存先path指定 下記指定しない場合はDownloadsフォルダに保存される
		 put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS.toString() + "/フォルダ名/")
             }
             val uri = contentResolver.insert(MediaStore.Files.getContentUri("external"), storedValue)
             val outputStream = contentResolver.openOutputStream(uri!!)
             // 保存
             outputStream?.write(storedFile.toByteArray())
             outputStream?.close()
             // ↓保存成功イベントなどご自由に
         } catch (e: IOException) {
            // ↓保存失敗イベント
         }
     }

ちなみにContentResolberはこんな感じで取得できます。

// Actyvityから取得
val contentResolver = this.contentResolver
// Fragmentから取得
val contentResolver = requireContext().contentResolver

File -> ByteArray

保存するファイルは取得する際に大抵URIかFILEだと思うので、保存形式のByteArrayのに変換する方法も載せておきます。下記記事にまとまっているのでurlだけ笑

https://qiita.com/riekure/items/babc7432a80ea90420a8

参考記事

https://stackoverflow.com/questions/59511147/create-copy-file-in-android-q-using-mediastore
https://codechacha.com/ja/android-mediastore-insert-media-files/