Я использую плагин для получения абсолютного пути к файлу в Android, вспомогательный класс - этот..
Предыдущая ссылка является ответвлением плагина Flutter, который возвращает абсолютный путь к фотографии в фотогалерее с встраиванием Flutter V1 и работает правильно. Ури content://media/external/images/media/41
.
И теперь я пытаюсь адаптировать это к плагину со встраиванием Flutter Android V2. Форк здесь. Как видите, здесь я вызываю непосредственно помощника с жестко запрограммированным Uri:
FileDirectory.getAbsolutePath(context, Uri.parse("content://media/external/images/media/41"))
А во вспомогательном классе, который в основном является копией другого плагина, программа возвращает ошибку этот фрагмент кода:
private fun getDataColumn(context: Context, uri: Uri, selection: String?,
selectionArgs: Array<String>?): String? {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor != null && cursor.moveToFirst()) {
val column_index = cursor.getColumnIndexOrThrow(column)
return cursor.getString(column_index)
}
} finally {
cursor?.close()
}
return null
}
Приведенный выше код работает правильно во Flutter, встраивающем V1, но не в V2. После некоторой грязной отладки я получаю следующее:
Для плагина Flutter со встраиванием Android V1:
context
тип равен io.flutter.app.FlutterApplication
cursor!!.moveToFirst()
ИСТИНА
cursor!!.getCount()
is 1
Для плагина Flutter со встраиванием Android V2:
context
тип равен android.app.Application
cursor!!.moveToFirst()
ЛОЖНО
cursor!!.getCount() is
0
Я предполагаю, что проблема в том, как плагин получает контекст приложения, поскольку V1 задается Registrar
:
companion object {
@JvmStatic
fun registerWith(registrar: Registrar) {
val channel = MethodChannel(registrar.messenger(), "flutter_absolute_path")
channel.setMethodCallHandler(FlutterAbsolutePathPlugin(registrar.context()))
}
}
Вместо этого для V2 задается ActivityAware
, как показано в этом ответе:
private fun doOnAttachedToEngine(messenger: BinaryMessenger) {
methodChannel = MethodChannel(messenger, "flutter_file_dialog")
methodChannel?.setMethodCallHandler(this)
context = pluginBinding!!.applicationContext
}
Другое дело, что если я попытаюсь использовать плагин с embeddingV1 в своем приложении, я получаю следующую ошибку, поэтому я не могу его использовать.
java.lang.RuntimeException: Unable to start activity ComponentInfo{net.altermundi.elrepoio/net.altermundi.elrepoio.MainActivity}: java.lang.IllegalStateException: registrar.context() must not be null