Improved media store insertion

This commit is contained in:
Sylvain Berfini 2021-03-23 17:11:47 +01:00
parent bc511c1bc1
commit c5f40c8eed
2 changed files with 80 additions and 95 deletions

View file

@ -24,6 +24,7 @@ import android.app.Activity
import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothAdapter
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.os.Vibrator import android.os.Vibrator
@ -88,24 +89,14 @@ class Api21Compatibility {
put(MediaStore.Images.Media.MIME_TYPE, mime) put(MediaStore.Images.Media.MIME_TYPE, mime)
} }
val collection = MediaStore.Images.Media.getContentUri("external") val collection = MediaStore.Images.Media.getContentUri("external")
val mediaStoreFilePath = addContentValuesToCollection(context, filePath, collection, values)
val fileUri = context.contentResolver.insert(collection, values) if (mediaStoreFilePath.isNotEmpty()) {
if (fileUri == null) { content.userData = mediaStoreFilePath
Log.e("[Media Store] Failed to get a URI to where store the file, aborting") return true
}
return false return false
} }
var copyOk = false
context.contentResolver.openOutputStream(fileUri).use { out ->
copyOk = FileUtils.copyFileTo(filePath, out)
}
if (copyOk) {
content.userData = fileUri.toString()
}
return copyOk
}
suspend fun addVideoToMediaStore(context: Context, content: Content): Boolean { suspend fun addVideoToMediaStore(context: Context, content: Content): Boolean {
if (!PermissionHelper.get().hasWriteExternalStorage()) { if (!PermissionHelper.get().hasWriteExternalStorage()) {
Log.e("[Media Store] Write external storage permission denied") Log.e("[Media Store] Write external storage permission denied")
@ -130,24 +121,14 @@ class Api21Compatibility {
put(MediaStore.Video.Media.MIME_TYPE, mime) put(MediaStore.Video.Media.MIME_TYPE, mime)
} }
val collection = MediaStore.Video.Media.getContentUri("external") val collection = MediaStore.Video.Media.getContentUri("external")
val mediaStoreFilePath = addContentValuesToCollection(context, filePath, collection, values)
val fileUri = context.contentResolver.insert(collection, values) if (mediaStoreFilePath.isNotEmpty()) {
if (fileUri == null) { content.userData = mediaStoreFilePath
Log.e("[Media Store] Failed to get a URI to where store the file, aborting") return true
}
return false return false
} }
var copyOk = false
context.contentResolver.openOutputStream(fileUri).use { out ->
copyOk = FileUtils.copyFileTo(filePath, out)
}
if (copyOk) {
content.userData = fileUri.toString()
}
return copyOk
}
suspend fun addAudioToMediaStore(context: Context, content: Content): Boolean { suspend fun addAudioToMediaStore(context: Context, content: Content): Boolean {
if (!PermissionHelper.get().hasWriteExternalStorage()) { if (!PermissionHelper.get().hasWriteExternalStorage()) {
Log.e("[Media Store] Write external storage permission denied") Log.e("[Media Store] Write external storage permission denied")
@ -173,21 +154,36 @@ class Api21Compatibility {
} }
val collection = MediaStore.Audio.Media.getContentUri("external") val collection = MediaStore.Audio.Media.getContentUri("external")
val fileUri = context.contentResolver.insert(collection, values) val mediaStoreFilePath = addContentValuesToCollection(context, filePath, collection, values)
if (fileUri == null) { if (mediaStoreFilePath.isNotEmpty()) {
Log.e("[Media Store] Failed to get a URI to where store the file, aborting") content.userData = mediaStoreFilePath
return true
}
return false return false
} }
var copyOk = false private suspend fun addContentValuesToCollection(
context.contentResolver.openOutputStream(fileUri).use { out -> context: Context,
copyOk = FileUtils.copyFileTo(filePath, out) filePath: String,
collection: Uri,
values: ContentValues
): String {
try {
val fileUri = context.contentResolver.insert(collection, values)
if (fileUri == null) {
Log.e("[Media Store] Failed to get a URI to where store the file, aborting")
return ""
} }
if (copyOk) { context.contentResolver.openOutputStream(fileUri).use { out ->
content.userData = fileUri.toString() if (FileUtils.copyFileTo(filePath, out)) {
return fileUri.toString()
} }
return copyOk }
} catch (e: Exception) {
Log.e("[Media Store] Exception: $e")
}
return ""
} }
fun setShowWhenLocked(activity: Activity, enable: Boolean) { fun setShowWhenLocked(activity: Activity, enable: Boolean) {

View file

@ -24,6 +24,7 @@ import android.app.NotificationManager
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.os.Environment import android.os.Environment
import android.provider.MediaStore import android.provider.MediaStore
import android.view.View import android.view.View
@ -82,28 +83,14 @@ class Api29Compatibility {
put(MediaStore.Images.Media.IS_PENDING, 1) put(MediaStore.Images.Media.IS_PENDING, 1)
} }
val collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) val collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
val mediaStoreFilePath = addContentValuesToCollection(context, filePath, collection, values, MediaStore.Images.Media.IS_PENDING)
val fileUri = context.contentResolver.insert(collection, values) if (mediaStoreFilePath.isNotEmpty()) {
if (fileUri == null) { content.userData = mediaStoreFilePath
Log.e("[Media Store] Failed to get a URI to where store the file, aborting") return true
}
return false return false
} }
var copyOk = false
context.contentResolver.openOutputStream(fileUri).use { out ->
copyOk = FileUtils.copyFileTo(filePath, out)
}
values.clear()
values.put(MediaStore.Images.Media.IS_PENDING, 0)
context.contentResolver.update(fileUri, values, null, null)
if (copyOk) {
content.userData = fileUri.toString()
}
return copyOk
}
suspend fun addVideoToMediaStore(context: Context, content: Content): Boolean { suspend fun addVideoToMediaStore(context: Context, content: Content): Boolean {
val filePath = content.filePath val filePath = content.filePath
if (filePath == null) { if (filePath == null) {
@ -125,28 +112,14 @@ class Api29Compatibility {
put(MediaStore.Video.Media.IS_PENDING, 1) put(MediaStore.Video.Media.IS_PENDING, 1)
} }
val collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) val collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
val mediaStoreFilePath = addContentValuesToCollection(context, filePath, collection, values, MediaStore.Video.Media.IS_PENDING)
val fileUri = context.contentResolver.insert(collection, values) if (mediaStoreFilePath.isNotEmpty()) {
if (fileUri == null) { content.userData = mediaStoreFilePath
Log.e("[Media Store] Failed to get a URI to where store the file, aborting") return true
}
return false return false
} }
var copyOk = false
context.contentResolver.openOutputStream(fileUri).use { out ->
copyOk = FileUtils.copyFileTo(filePath, out)
}
values.clear()
values.put(MediaStore.Video.Media.IS_PENDING, 0)
context.contentResolver.update(fileUri, values, null, null)
if (copyOk) {
content.userData = fileUri.toString()
}
return copyOk
}
suspend fun addAudioToMediaStore(context: Context, content: Content): Boolean { suspend fun addAudioToMediaStore(context: Context, content: Content): Boolean {
val filePath = content.filePath val filePath = content.filePath
if (filePath == null) { if (filePath == null) {
@ -169,25 +142,41 @@ class Api29Compatibility {
} }
val collection = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) val collection = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
val fileUri = context.contentResolver.insert(collection, values) val mediaStoreFilePath = addContentValuesToCollection(context, filePath, collection, values, MediaStore.Audio.Media.IS_PENDING)
if (fileUri == null) { if (mediaStoreFilePath.isNotEmpty()) {
Log.e("[Media Store] Failed to get a URI to where store the file, aborting") content.userData = mediaStoreFilePath
return true
}
return false return false
} }
var copyOk = false private suspend fun addContentValuesToCollection(
context.contentResolver.openOutputStream(fileUri).use { out -> context: Context,
copyOk = FileUtils.copyFileTo(filePath, out) filePath: String,
collection: Uri,
values: ContentValues,
pendingKey: String
): String {
try {
val fileUri = context.contentResolver.insert(collection, values)
if (fileUri == null) {
Log.e("[Media Store] Failed to get a URI to where store the file, aborting")
return ""
} }
context.contentResolver.openOutputStream(fileUri).use { out ->
if (FileUtils.copyFileTo(filePath, out)) {
values.clear() values.clear()
values.put(MediaStore.Audio.Media.IS_PENDING, 0) values.put(pendingKey, 0)
context.contentResolver.update(fileUri, values, null, null) context.contentResolver.update(fileUri, values, null, null)
if (copyOk) { return fileUri.toString()
content.userData = fileUri.toString()
} }
return copyOk }
} catch (e: Exception) {
Log.e("[Media Store] Exception: $e")
}
return ""
} }
} }
} }