MAUI Android 关联文件类型

这篇具有很好参考价值的文章主要介绍了MAUI Android 关联文件类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果

打开某个文件,后缀是自己想要的类型,在弹出的窗口(用其它应用打开)的列表中显示自己的应用图标

点击后可以获得文件信息以便于后续的操作

MAUI Android 关联文件类型

实现步骤

以注册.bin后缀为例,新建一个MAUI项目

调整启动模式

修改Platforms\Android\MainActivity.cs

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]

调整为

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density, LaunchMode = LaunchMode.SingleTop)]

末尾增加了LaunchMode = LaunchMode.SingleTop

更改启动模式为栈顶模式,解释如下

SingleTop模式又称栈顶模式,每次启动一个Activity的时候,首先会判断当前任务栈的栈顶是否存在该Activity实例,
如果存在则重用该Activity实例,并且回调其onNewIntent()函数,否则就创建一个新实例。

这样,我们就可以在回调函数中获得文件路径

注册关联类型

还是修改Platforms\Android\MainActivity.cs

Activevity注册的下一行添加

[IntentFilter(new[] { Intent.ActionSend, Intent.ActionView }, Categories = new[] { Intent.CategoryDefault }, DataMimeType = @"application/octet-stream")]//.bin文件关联

application/octet-streamBin的Mime类型,根据自己的文件后缀,可以查询所有官方 MIME 类型的列表

监听意图

重写OnNewIntent拿到意图,并从中获取数据,通过 Messenger 进行数据传递

也可以通过试图跳转进行传递,具体参考:MAUI文档-传递数据

新建一个消息模型

引用 CommunityToolkit.Mvvm NuGet 包

创建消息模型

namespace ITLDG.Message
{
    public class NewFileMessage : ValueChangedMessage<Android.Net.Uri>
    {
        public NewFileMessage(Android.Net.Uri uri) : base(uri)
        {
        }
    }
}

发送消息

using Android.Content;//引用这个

...

	public class MainActivity : MauiAppCompatActivity
    {
	
		...
	
        protected override void OnResume()
        {
            base.OnResume();
            //这里调用下,不然首次启动没有意图
            OnNewIntent(Intent);
        }
        protected override void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);
            if (intent.Action == Intent.ActionView)
            {
                WeakReferenceMessenger.Default.Send(new NewFileMessage(intent.Data));
            }
        }
		
		
		...
		
    }
	
	...
	

接收消息

ViewModel中接收消息

WeakReferenceMessenger.Default.Register<NewFileMessage>(this, (r, m) =>
{
    if (m.Value == null) return;
    var intent = m.Value;
    //文件路径
    // var path = intent.Path
    //得到文件流
    var stream = Platform.CurrentActivity.ContentResolver.OpenInputStream(intent);
    var memoryStream = new MemoryStream();
    stream.CopyTo(memoryStream);
    //完整的数据
    var bytes=memoryStream.ToArray()
});

总结

起初,我使用视图跳转传递参数的方式传递获取到的Intent,尝试了几次无法传递到MainPage

后加了一个跳转页,拿到消息后传到到中转页,中专页拿到数据后再将数据回穿回来,但是这样传递,无法传递Intent类型和Uri类型,我不得不先将文件写到缓存目录,再传递缓存目录

这样的流程始终无法满意,最终改为使用Messenger 进行数据传递,问题解决

另外,起初首次打开文件唤醒APP,无法获取到Intent,APP后台运行打开文件唤醒正常

后来在stackoverflow找到了答案文章来源地址https://www.toymoban.com/news/detail-459939.html

到了这里,关于MAUI Android 关联文件类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch按某个字段去重-实现group by效果

    已知es中存储了一张学生课程信息宽表,里边包含有student_name、student_id、teacher_id、课程信息等字段。 现在根据学生姓名或者班级ID,得出学生所在班级的所有授课教师信息。  既然是明细宽表,里边的教师的信息必然是有重复的,因此我们需要查询teacher_id的集合并去重,对

    2024年02月12日
    浏览(43)
  • Android文件关联

    用户需求:Android在系统文件夹找到一个文件想发送自己开发的app进行处理该怎么办? 这时候可以采用两个Activity,一个Activity用作Launcher,一个用于处理发送的文件;具体Activity intent-filter该怎么写了?可以参考下面的代码: 记得将该Activity exporte

    2024年02月09日
    浏览(77)
  • 【打开方式问题解决】该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联。

    最近用了某款编辑右键菜单工具,清理了下冗长的右键内容,但是却出现了另一个奇奇怪怪的问题,就是对某一类型文件,在右键后,点击【打开方式】-【选择其他应用】,会弹出【该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设

    2024年02月05日
    浏览(163)
  • unity实现玩家碰触物体打开提示效果

    玩家进入触碰某个物体,物体便会弹出提示框一个小效果。这个效果是在一个小demo里做的,需要多处使用,于是做成了单例。 两个部分,一个是物体的提示框,一个是玩家。当然玩家是提前做好的。 首先提示框关于脚本的部分。 (1)声明并获取,老样子,初始化时不可见

    2024年02月07日
    浏览(55)
  • 论多窗口相互关联下window.open打开已在的窗口时只激活不刷新的实现方案

    前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞吧,谢谢 近期,我司有个小伙伴遇到这么个场景实现起来感觉有点

    2024年02月04日
    浏览(53)
  • 已有wchar_t *类型的filepath,使用Qt打开该文件

    1.wchar_t *转QString 2.Qt快速转换路径(斜杠与反斜杠转换)_tonativeseparators-CSDN博客 C:\\\\Users\\\\lpl\\\\Desktop\\\\腾讯视频.exe 到 C:/Users/lpl/Desktop/腾讯视频.exe 3.从外部打开 文件 或 文件夹 Qt之QDesktopServices-CSDN博客

    2024年02月08日
    浏览(32)
  • VBA:Application.GetOpenFilename打开指定文件夹里的excel类型文件(xls、xlsx)

    \\\'GetOpenFilename相当于Excel打开窗口,通过该窗口选择要打开的文件,并可以返回选择的文件完整路径和文件名。 \\\'Application.GetOpenFilename(“文件类型筛选规则(就是说明)”,“优先显示第几个类型的文件”,“标题”,“是否允许选择多个文件名”) 打开类型只限excel文件 \\\'“文件类型

    2024年02月11日
    浏览(46)
  • 【eclipse】打开Excel(.xls文件)时 OLE 异常 报错“无法创建内置编辑器 没有为您打开的文件类型注册OLE编辑器”

    错误如下图所示: 1. 导航栏——窗口——首选项 2. 常规——编辑器——文件关联 3. 在文件类型里面找“.xls”格式, 要是没有就新增一个,点击“添加”; 要是有就跳过第4步。 4. 添加上“.xls”类型 4. 选中“.xls”,添加对应的文件编辑器,点击“添加” 5. 选择“外部程序

    2024年02月16日
    浏览(45)
  • android 13.0 SystemUI屏蔽某个app的通知不显示功能实现

    在13.0的产品rom定制化开发中,对于系统的通知部分,要求根据app包名来过滤掉一部分通知,就是在接收到系统通知时,根据包名判断是否需要接收通知的功能, 首选要分析SystemUI的系统通知显示流程,然后实现功能 在SystemUI中会注册这个Service用来接收从Framework中传过来的通

    2024年02月04日
    浏览(64)
  • 用Selenium操作网页,如何在打开网站的过程中,实现刷新,清除缓存的效果

    在使用 Selenium 操作网页时,可以通过控制浏览器选项来实现刷新和清除缓存的效果。下面是使用 Python 和 Selenium 的示例代码: 刷新网页: 清除缓存: 在上述代码中,我们首先创建了一个浏览器对象,并打开了一个网站。然后,通过 refresh() 方法刷新页面,或者通过禁用缓存

    2024年01月24日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包