📁

Androidのファイル関係マジわからんのでのメモ

2021/12/14に公開

始めたときからずーーーっと苦手なAndroidのファイルの扱うやつのメモです。
これが最善かはわからないですし、APIレベルの問題とか、バグとかあるかもなので、一つの情報としておなしゃす。
ちなにみこれはminが28です。

ファイル選択と読み込み

val launcher =
    rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) { uri: Uri? ->
        if (uri != null) {
            filename = getFilenameFromUri(context, uri)
            val parcelFileDescriptor = context.contentResolver.openFileDescriptor(uri, "r")
            val inputStream = FileInputStream(parcelFileDescriptor?.fileDescriptor)
            data = inputStream.readBytes()
        }
    }
launcher.launch(arrayOf("*/*"))
@SuppressLint("Recycle")
fun getFilenameFromUri(context: Context, uri: Uri): String? {
    val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME)
    val cursor = context.contentResolver.query(uri, projection, null, null, null)
    var filename: String? = null
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            filename = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME))
        }
        cursor.close()
    }
    return filename
}

保存

@SuppressLint("InlinedApi")
private fun saveToDownloadFolder(filename: String, data: ByteArray) {
    val epUri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
    val values = ContentValues().apply {
        put(MediaStore.Downloads.DISPLAY_NAME, filename)
    }
    val contentUri = context.contentResolver.insert(epUri, values)

    context.contentResolver.openFileDescriptor(contentUri!!, "w", null).use {
        FileOutputStream(it!!.fileDescriptor).use { output ->
            output.write(data)
        }
    }
    values.clear()
    values.put(MediaStore.Downloads.IS_PENDING, 0)
    context.contentResolver.update(contentUri, values, null, null)
}

こんなかんじでした。

検索用一覧

  • rememberLauncherForActivityResult
  • ActivityResultContracts
  • contentResolver
  • openFileDescriptor
  • MediaStore
  • FileOutputStream

Discussion