Android 如何使用我的Flatter应用程序从另一个应用程序打开具有自定义文件扩展名的文件?

Android 如何使用我的Flatter应用程序从另一个应用程序打开具有自定义文件扩展名的文件?,android,flutter,kotlin,android-intent,Android,Flutter,Kotlin,Android Intent,我需要我的颤振应用程序与文件类型.foo关联。因此,如果用户打开他们的本地文件管理器,然后单击文件bar.fooandroid会提示他们使用我的flatter应用程序打开文件 到目前为止,我了解到,这基本上是一个传入的Android意图,必须使用所谓的意图过滤器注册,如下所述:。 但更进一步,我不明白如何在科特林处理它 因此,下一个合乎逻辑的事情是找出答案。但是,文档对我没有帮助,因为它仅在中进行了解释。我根本没有Java方面的经验,无论如何我都想坚持使用Kotlin,因为我还有其他特定于平台的

我需要我的颤振应用程序与文件类型
.foo
关联。因此,如果用户打开他们的本地文件管理器,然后单击文件
bar.foo
android会提示他们使用我的flatter应用程序打开文件

到目前为止,我了解到,这基本上是一个传入的Android意图,必须使用所谓的
意图过滤器注册,如下所述:。
但更进一步,我不明白如何在科特林处理它

因此,下一个合乎逻辑的事情是找出答案。但是,文档对我没有帮助,因为它仅在中进行了解释。我根本没有Java方面的经验,无论如何我都想坚持使用Kotlin,因为我还有其他特定于平台的代码是用Kotlin编写的

在这篇博文中,Deep Shah似乎也有同样的问题,但没有分享解决方案:

香克斯的这篇文章悄然销声匿迹

我希望找到相关资源的答案或指针。

I适用于android。这篇文章应该把所有重要的步骤合并成一个步骤。从
开始的事情取决于您。相应地更改它们

首先,您必须在
AndroidManifest.xml
中注册
intent过滤器。这将告诉android将你的应用程序列为一个可能的选项


接下来,设置Android方法频道。为此,Kotlin的做法如下:

import io.flatter.embedded.android.flatterActivity
导入android.content.Intent
导入android.os.Bundle
导入androidx.annotation.NonNull
导入io.flatter.embedding.engine.flatterengine
导入io.flatter.plugin.common.MethodChannel
导入io.flatter.plugins.GeneratedPluginRegistrant
类MainActivity:activity(){
//TODO:更改方法通道名称
private val CHANNEL=“您的频道名称”
var openPath:String?=null
覆盖fun配置颤振引擎(@NonNull颤振引擎:颤振引擎){
已生成的插件注册表注册表,带有(引擎)
val通道=方法通道(flatterEngine.dartExecutor.binaryMessenger,通道)
channel.setMethodCallHandler{调用,结果->
when(call.method){
“getOpenFileUrl”->{
结果:成功(openPath)
}
else->result.notImplemented()
}
}
}
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
handleOpenFileUrl(意图)
}
覆盖Wintent(意图:意图){
super.onNewIntent(意图)
handleOpenFileUrl(意图)
}
private fun handleOpenFileUrl(意图:意图?){
val路径=意图?数据?路径
if(路径!=null){
openPath=path
}
}
}
最后,在飞镖方面设置一个处理程序。以下代码必须在绘制的小部件中。我把它放在我的
MainView
小部件中,因为它总是在应用程序启动时绘制,并且在小部件树中相对较高。(对我来说,这是
MaterialApp
小部件之外的第一个小部件)

class MainView扩展StatefulWidget{
const MainView({Key}):super(Key:Key);
@凌驾
_MainViewState createState()=>\u MainViewState();
}
类_MainViewState使用WidgetsBindingObserver扩展状态{
//TODO:更改频道名称
static const platform=const MethodChannel(“您的频道名称”);
@凌驾
void initState(){
super.initState();
getOpenFileUrl();
WidgetsBinding.instance.addObserver(这个);
}
@凌驾
无效处置(){
super.dispose();
WidgetsBinding.instance.removeObserver(此);
}
@凌驾
void didchangeAppifecyclestate(AppLifecycleState状态){
if(state==AppLifecycleState.resume){
getOpenFileUrl();
}
}
@凌驾
小部件构建(构建上下文){
//TODO:实现构建方法
}
void getOpenFileUrl()异步{
动态url=await platform.invokeMethod(“getOpenFileUrl”);
如果(url!=null){
设置状态(){
//TODO:对文件URL执行一些操作
});
}
}
}
在完全关闭并重新启动我的应用程序和外部应用程序(在我的例子中是文件管理器)后,它工作了