【发布时间】: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