Android 光标不适用于带有 Android 嵌入 v2 的 Flutter 插件

问题描述

我在Android中使用插件获取文件绝对路径,帮助类为this one.

一个链接Flutter 插件一个分支,它返回照片库中照片的绝对路径,带有 Flutter 嵌入 V1 并且正常工作。 Uri 是 content://media/external/images/media/41

现在我正在尝试将其调整为带有 Flutter Android 嵌入 V2 的插件。叉子是here。如您所见,here 我使用硬编码的 Uri 直接调用助手:

FileDirectory.getAbsolutePath(context,Uri.parse("content://media/external/images/media/41"))

在辅助类中,基本上是其他插件的复制粘贴,程序在 this代码上返回错误

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 上不。经过一些肮脏的调试后,我明白了:

对于带有 Android 嵌入 V1 的 Flutter 插件

context 类型等于 io.Flutter.app.FlutterApplication

cursor!!.movetoFirst() 为真

cursor!!.getCount() 是 1

对于带有 Android 嵌入 V2 的 Flutter 插件

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 给出,如此 answer 所示:

    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

解决方法

在将代码清理到最低限度后,我开始工作了。 Flutter embeddingv2 插件可能有问题,但使用 this 可以。