Курсор Android не работает с плагином Flutter со встраиванием Android v2

Я использую плагин для получения абсолютного пути к файлу в 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

person selan    schedule 08.07.2021    source источник


Ответы (1)


После очистки кода до минимума я заработал. Возможно, что-то не так в плагине Flutter embeddingv2, но используется

person selan    schedule 13.07.2021