问题描述
我在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!!.getCount()
是 1
对于带有 Android 嵌入 V2 的 Flutter 插件:
context
类型等于 android.app.Application
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 可以。