kotlinをはじめて数日しかたっていないKotlin初心者です
間違っていたり効率悪かったり、文法がおかしかったりする可能性が大きいのでご注意ください
デバイス内の画像をアプリ内にファイルとして保存
下記URLをコピペして画像をImageViewに表示できるように
https://github.com/orimomo/picture-frame-app/tree/master
以下の部分に少し追記
data?.data?.also { uri ->
Log.d("VIDEOURI", "URI:${uri}")
val inputStream = contentResolver?.openInputStream(uri)
val image = BitmapFactory.decodeStream(inputStream)
val imageView = findViewById<ImageView>(R.id.imageView)
imageView.setImageBitmap(image)
//追記部分
//アプリ内にファイル書き込み
val path = applicationContext.filesDir
val context = this.applicationContext
val fileName = uriToFileName(context, uri)
val filePath = path.toString() + "/" + fileName
inputStream?.toFile(filePath)
//追記終了
}
以下の関数を追加
fun InputStream.toFile(path: String) {
File(path).outputStream().use {
this.copyTo(it)
}
}
fun uriToFileName(context: Context, uri: Uri): String? {
return when (uri.scheme) {
ContentResolver.SCHEME_FILE -> {
File(uri.path).name
}
ContentResolver.SCHEME_CONTENT -> {
val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME)
val cursor = context.contentResolver.query(uri, projection, null, null, null)
cursor?.use {
if (it.moveToFirst()) { it.getString(0) } else null
}
}
else -> null
}
}
以上でアプリ内に選択した画像が保存される
シミュレーターの場合は「/data/data/パッケージ名/files」以下に保存される
ファイル名の重複等はチェックしていない
参考URL
https://qiita.com/orimomo/items/4b741dc252bc261a8469
https://github.com/orimomo/picture-frame-app/tree/master
https://teratail.com/questions/117206
https://stackoverflow.com/questions/35528409/write-a-large-inputstream-to-file-in-kotlin/35529070