Android — загрузка MediaStore не работает на уровне API 28 или нижеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android — загрузка MediaStore не работает на уровне API 28 или ниже

Сообщение Anonymous »

Я пишу фрагмент кода Android, который сохраняет файл в папке загрузок пользователя.

Код: Выделить всё

@CapacitorPlugin(name = "Downloads")
class DownloadsPlugin : Plugin() {
@PluginMethod(returnType = PluginMethod.RETURN_NONE)
fun download(call: PluginCall) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val filename = call.getString("fileName")!!
val data = call.getString("data")!!

val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}

val contentResolver = context.contentResolver
val uri =
contentResolver.insert(MediaStore.Files.getContentUri("external"), contentValues)!!
val outputStream = contentResolver.openOutputStream(uri)!!

outputStream.write(data.toByteArray(StandardCharsets.UTF_8))
}

call.resolve()
}
}
Написанный мной код корректно работает на Android 10 (уровень API 29) или выше. На уровне API 28 или ниже код не работает. При вызове метода загрузки регистрируется следующая ошибка:

Код: Выделить всё

2022-10-08 16:10:59.064 23121-23184/com.example.example E/Capacitor: Serious error executing plugin
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.getcapacitor.PluginHandle.invoke(PluginHandle.java:125)
at com.getcapacitor.Bridge.lambda$callPluginMethod$0$com-getcapacitor-Bridge(Bridge.java:706)
at com.getcapacitor.Bridge$$ExternalSyntheticLambda5.run(Unknown Source:8)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: java.lang.IllegalArgumentException: no path was provided when inserting new file
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1587)
at com.example.example.DownloadsPlugin.download(DownloadsPlugin.kt:36)
at java.lang.reflect.Method.invoke(Native Method) 
at com.getcapacitor.PluginHandle.invoke(PluginHandle.java:125) 
at com.getcapacitor.Bridge.lambda$callPluginMethod$0$com-getcapacitor-Bridge(Bridge.java:706) 
at com.getcapacitor.Bridge$$ExternalSyntheticLambda5.run(Unknown Source:8) 
at android.os.Handler.handleCallback(Handler.java:873) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:193) 
at android.os.HandlerThread.run(HandlerThread.java:65) 
Как исправить эту ошибку, чтобы код работал на уровне API 28 или ниже?

Подробнее здесь: https://stackoverflow.com/questions/740 ... 8-or-lower
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»