【问题标题】:Android cursor doesn't work on a Flutter plugin with Android embedding v2Android 光标不适用于带有 Android 嵌入 v2 的 Flutter 插件
【发布时间】:2021-09-18 23:52:01
【问题描述】:

我在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() is0

我认为问题在于插件如何获取应用程序上下文,因为 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

【问题讨论】:

    标签: android flutter android-contentprovider android-context flutter-plugin


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多