📁
Androidのファイル関係マジわからんのでのメモ
始めたときからずーーーっと苦手な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