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-stream 是Bin的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 OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//这里调用下,不然首次启动没有意图
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 = CurrentActivity.ContentResolver.OpenInputStream(intent);
var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
//完整的数据
var bytes=memoryStream.ToArray()
});
总结
起初,我使用视图跳转传递参数的方式传递获取到的Intent,尝试了几次无法传递到MainPage
后加了一个跳转页,拿到消息后传到到中转页,中专页拿到数据后再将数据回穿回来,但是这样传递,无法传递Intent类型和Uri类型,我不得不先将文件写到缓存目录,再传递缓存目录
这样的流程始终无法满意,最终改为使用Messenger 进行数据传递,问题解决
另外,起初首次打开文件唤醒APP,无法获取到Intent,APP后台运行打开文件唤醒正常
后来在stackoverflow找到了答案
MAUI Android 关联文件类型的更多相关文章
- Delphi 7使用自定义图标关联文件类型
Delphi 7使用自定义图标关联文件类型 5.2 Delphi编程(40) 版权声明:本文为博主原创文章,未经博主允许不得转载. 在开发过程中,我们经常需要属于自己的文件类型,自定义的后缀名不仅可 ...
- 实现1.双击自动关联文件类型打开 2.PC所有驱动器 3.小型资源管理器
感谢各位这里实现:双击自动关联文件类型打开 2.PC所有驱动器 3.小型资源管理器!! 首先主页面: 2.运用DriveInfo驱动器的信息:获得整个系统磁盘驱动!!,运用frorach循环遍历到Tr ...
- Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...
- WebStorm文件类型关联设置
无意中创造了一个没有扩展名的文件,我选择了错误的文件类型关联.是js类型的,我却选成了文本,Ws每次编辑类型就成了txt文本,这个问题让我很苦恼,以下是我的解决方案. 错选的弹出框如下: 解决方案如下 ...
- 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
[源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...
- Android 各种MIME类型和文件类型的匹配表
MIME:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后 ...
- 重新想象 Windows 8 Store Apps (33) - 关联启动: 使用外部程序打开一个文件或uri, 关联指定的文件类型或协议
原文:重新想象 Windows 8 Store Apps (33) - 关联启动: 使用外部程序打开一个文件或uri, 关联指定的文件类型或协议 [源码下载] 重新想象 Windows 8 Store ...
- Vim使用技巧:特定文件类型关联缩进
Vim如何打开特定文件类型关联自动缩进呢?答案:将filetype indent on写入你的.vimrc文件中
- 背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议
[源码下载] 背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议 作者:webabcd 介绍背水一战 Windows 10 之 关联启动 关联指定的文件类型 ...
- Windows的文件类型关联
在用脚本语言开发时尤其是在windows环境下发现想自动在命令行环境下运行脚本必须要带着相应的解释器的路径才行,不然就会提示无法找到对应的命令,于是乎在<学习Ruby>这本书中对于文件类型 ...
随机推荐
- 数据库相关知识点整理,助力拿到心仪的offer
1. 数据库的事务 1.1 什么是数据库事务? 事务是指一组逻辑上相关的操作,这些操作要么全部完成,要么全部不完成. 事务是数据库管理系统执行过程中的一个逻辑工作单位,是用户定义的一个操作序列,这些操 ...
- python基础篇:Python基础知识,帮助初学者快速入门
Python是一种高级编程语言,它易于学习和使用,因此成为了许多人的首选编程语言.本文将介绍Python的基础知识,以帮助初学者快速入门. 安装Python 在开始学习Python之前,您需要安装Py ...
- react中自定义函数、生命周期钩子函数、修改状态、组件、组件传值
1.回顾 2.自定义函数 事件的首字母大小 onclick ==> onClick onchange ==> onChange 普通的点击事件 ---- 调用事件不加(),加了立即执行 i ...
- Vue指令:内置指令和自定义指令
Vue指令 Vue指令指的是,以v-开头的一组特殊语法 内置指令 v-text v-text指令的作用是:设置标签的内容 默认写法会替换全部内容,差值表达式{{ }}只会替换指定内容 内部支持写表达式 ...
- kubernetes核心实战(四)--- Deployments
6.Deployments(重点) 一个 Deployment 控制器为 Pods和 ReplicaSets提供描述性的更新方式. 描述 Deployment 中的 desired state,并且 ...
- [arthas] UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields)
问题描述 [arthas@1]$ trace cn.xx.dataservice.biz.dataservice.controller.v1.CommonSearchController datase ...
- Django笔记十九之manager用法介绍
本文首发于微信公众号:Hunter后端 原文链接:Django笔记十九之manager用法介绍 首先介绍一下 manager 的使用场景,比如我们有一些表级别的,需要重复使用的功能,都可以使用 man ...
- 随手记:Redis 部署到linux上面后,本地无法连接
修改redis的配置文件 redis.conf 1. bind 设置为 0.0.0.0 2. protected-mode 设置为no (也就是关闭保护模式) 3. daemonize 设置 ...
- 【Visual Leak Detector】源码文件概览
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇对 VLD 源码包中的各文件用途做个概述.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. 整体概览 2. ...
- 统计计算——Bootstrap总结整理
Bootstrapping Boostrap 有放回的重抽样. 符号定义: 重复抽样的bootstrap \(F^*\) 观测到的样本\(\hat F\),是一个经验分布 真实分布\(F\) Eg. ...