@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 или ниже?
Я пишу фрагмент кода Android, который сохраняет файл в папке загрузок пользователя. [code]@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)!!
call.resolve() } } [/code] Написанный мной код корректно работает на Android 10 (уровень API 29) или выше. На уровне API 28 или ниже код не работает. При вызове метода загрузки регистрируется следующая ошибка: [code]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) [/code] Как исправить эту ошибку, чтобы код работал на уровне API 28 или ниже?