首页 > 其他分享 >MAUI Android 关联文件类型

MAUI Android 关联文件类型

时间:2023-05-26 16:11:17浏览次数:44  
标签:文件 传递 ConfigChanges MAUI 文件类型 Android intent Intent

实现效果

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

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

用其它应用打开

实现步骤

以注册.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 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找到了答案

标签:文件,传递,ConfigChanges,MAUI,文件类型,Android,intent,Intent
From: https://www.cnblogs.com/jianzhan/p/17431732.html

相关文章

  • linux的文件类型
    在介绍属性时,提到了最前面的标志(d或-)可以表示目录或文件,那就是不同的文件种类。Linux的文件种类主要有下面这几种:•普通文件(regularfile):就是一般我们存取的文件,由ls-al显示出来的属性中,第一个属性为[-],例如[-rwxrwxrwx]。另外,依照文件的内容,又大致可以分为:• 纯文本文件(A......
  • Android使用本地gradle
    收 根目录下build.gradle配置   dependencies{       classpath"com.android.tools.build:gradle:4.1.1"       //NOTE:Donotplaceyourapplicationdependencieshere;theybelong       //intheindividualmodulebuild.gradlefiles......
  • Android常用命令-pm
    基于Android-12S一、查看帮助信息1.pmhelper#pmhelp包管理器(package)命令:help打印此帮助文本。path[--userUSER_ID]PACKAGE打印给定包的.apk的路径。dumpPACKAGE打印与给定PACKAGE关联的各种系统状态。listfeatures打印系统的所......
  • QT编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)
    由于工作需要,需要利用QT平台完成手机与ble蓝牙的通讯,所以就找了各种资料,算是初步的能够连接完成demo代码,但是依旧有些代码没有理解,比如特性那一片的代码,稍后还得研究啊(对了,这是低功耗蓝牙,不是经典蓝牙,看清楚了,当初不清楚经典蓝牙和低功耗蓝牙,浪费我一个星期,说多了都是泪,下面是代码......
  • [技术分享]Android平台音视频推送选RTMP还是GB28181?
    技术背景早在2015年,我们发布了RTMP直播推送模块,那时候音视频直播这块场景需求,还不像现在这么普遍,我们做这块的初衷,主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑,走RTMP怎么可能低延迟?网上看到的RTMP推拉流延迟,总归要2-3秒起,如果是自己实现框架,R......
  • Android 修改 android/hardware/interfaces 下HIDL接口编译报异常问题解决
    最近要增加hostapd的一个HIDL接口,修改android/hardware/interfaces/wifi/hostapd/1.2/IHostapd.hal文件后编译报错如下:ERROR:[email protected]::IHostapdhashashacaed0a159a521bd4964e0fb8117320849109d3eeaff6a08b4d2506156ce6987whichdoesnotmatch......
  • Android开发之定时任务(AlarmManager、WorkManager)
    Android程序的定时任务主要有AlarmManager、WorkManager两种。一、AlarmManagerAlarmManager,又称闹钟,可以设置一次性任务,周期重复任务,定时重复任务。AlarmManager通过PendingIntent传递要执行的任务程序,可以是广播、跳转页面、后台服务、前台服务等。1、PendingIntent介绍......
  • Python基础之字符编码和文件类型
    字符编码什么事字符编码?什么是字符编码?人类在与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、日文字符等,而计算机只能识别二进制。所以就产生了字符编码'''字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。字符编......
  • 什么是相芯科技滤镜sdk?如何集成相芯滤镜SDK(Android)
    相芯科技sdk是一种基于深度学习技术开发的图像处理工具,能够让开发者轻松实现各种美颜、滤镜、瘦脸、大眼等常见图像增强效果,并且可以高度定制化,满足各种不同用户需求。采用的主要技术包括图像处理、计算机视觉、机器学习和人工智能等。通过这些技术,相芯sdk可以实现丰富的滤镜效果,并......
  • Android tcp、okhttp请求&&python tcp&&a bytes-like object is required, not ‘str
    更多内容欢迎来到我的新博客blog.devilwst.top更多内容欢迎来到我的新博客blog.devilwst.top首先声明一下,本文部分代码来自于博客AndroidpublicstaticvoidGetByHttpURL(finalStringurl){newThread(newRunnable(){@Overridepublicvo......