uniapp安卓plus原生选择系统文件
uniapp安卓plus原生选择系统文件
效果:


组件代码:
<template xlang="wxml" minapp="mpvue"><view></view>
</template>
<script>export default {name: 'file-manager',props: {},data() {return {isAppPlus: process.env.UNI_PLATFORM === 'app-plus',}},methods: {_openFile(count, callback) {if (this.isAppPlus) {if (plus.os.name.toLowerCase() != 'android') {uni.showModal({title: '提示',content: '仅支持Android平台',success: function(res) {}});return false}let that = this// java 代码来自 let main = plus.android.runtimeMainActivity()let Intent = plus.android.importClass('android.content.Intent')// let fileIntent = new Intent(Intent.ACTION_GET_CONTENT)//fileIntent.setType(“image/*”);//选择图片//fileIntent.setType(“audio/*”); //选择音频//fileIntent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)//fileIntent.setType(“video/*;image/*”);//同时选择视频和图片fileIntent.setType('*/*'); //无类型限制fileIntent.addCategory(Intent.CATEGORY_OPENABLE);fileIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);main.startActivityForResult(fileIntent, count || 1);// 获取回调main.onActivityResult = function(requestCode, resultCode, data) {let Activity = plus.android.importClass("android.app.Activity");let ContentUris = plus.android.importClass("android.content.ContentUris");let Cursor = plus.android.importClass("android.database.Cursor");let Uri = plus.android.importClass("android.net.Uri");let Build = plus.android.importClass("android.os.Build");let ClipData = plus.android.importClass("android.content.ClipData");let Environment = plus.android.importClass("android.os.Environment");let DocumentsContract = plus.android.importClass("android.provider.DocumentsContract");let MediaStore = plus.android.importClass("android.provider.MediaStore");// 给系统导入 contentResolverlet contentResolver = main.getContentResolver()plus.android.importClass(contentResolver);// 返回路径let path = '';if (resultCode == Activity.RESULT_OK) {if (data.getData() != null) {let uri = data.getData()if ("file" == uri.getScheme().toLowerCase()) { //使用第三方应用打开path = uri.getPath();// return;}if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { //4.4以后path = getPath(this, uri);} else { //4.4以下下系统调用方法path = getRealPathFromURI(uri)}// 回调callback && callback([path])} else {let clipData = data.getClipData();if (clipData != null) {let paths = []for (let i = 0; i < clipData.getItemCount(); i++) {let item = clipData.getItemAt(i);let uri = item.getUri();if ("file" == uri.getScheme().toLowerCase()) { //使用第三方应用打开paths.push(uri.getPath())return;}if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { //4.4以后paths.push(getPath(this, uri))} else { //4.4以下下系统调用方法paths.push(getRealPathFromURI(uri))}}callback && callback(paths)}}that.$emit('result', path)}// 4.4 以上 从Uri 获取文件绝对路径function getPath(context, uri) {let isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;let scheme = uri.getScheme().toLowerCase()if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (isExternalStorageDocument(uri)) {let docId = DocumentsContract.getDocumentId(uri);let split = docId.split(":");let type = split[0];// 如果是手机内部存储if ("primary" == type.toLowerCase()) {return Environment.getExternalStorageDirectory() + "/" + split[1];} else {return '/storage/' + type + "/" + split[1];}}// DownloadsProviderelse if (isDownloadsDocument(uri)) {let id = DocumentsContract.getDocumentId(uri);let split = id.split(":");return split[1]// console.log(id)// let contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), id);// return getDataColumn(context, contentUri, null, null);}// MediaProviderelse if (isMediaDocument(uri)) {let docId = DocumentsContract.getDocumentId(uri);let split = docId.split(":");let type = split[0];let contentUri = null;if ("image" == type.toLowerCase()) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video" == type.toLowerCase()) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio" == type.toLowerCase()) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}let selection = "_id=?";let selectionArgs = [split[1]];return getDataColumn(context, contentUri, selection, selectionArgs);}}// MediaStore (and general)else if ("content" == scheme) {return getDataColumn(context, uri, null, null);}// Fileelse if ("file" == scheme) {return uri.getPath();}}// 4.4 以下 获取 绝对路径function getRealPathFromURI(uri) {let res = nulllet proj = [MediaStore.Images.Media.DATA]let cursor = contentResolver.query(uri, proj, null, null, null);if (null != cursor && cursor.moveToFirst()) {;let column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);res = cursor.getString(column_index);cursor.close();}return res;}// 通过uri 查找出绝对路径function getDataColumn(context, uri, selection, selectionArgs) {let cursor = null;let column = "_data";let projection = [column];// let contentResolver = context.getContentResolver()// plus.android.importClass(contentResolver);cursor = contentResolver.query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {let column_index = cursor.getColumnIndexOrThrow(column);return cursor.getString(column_index);}}function isExternalStorageDocument(uri) {return "com.android.externalstorage.documents" == uri.getAuthority() ? true : false}function isDownloadsDocument(uri) {return "com.android.providers.downloads.documents" == uri.getAuthority() ? true : false}function isMediaDocument(uri) {return "com.android.providers.media.documents" == uri.getAuthority() ? true : false}}} else {uni.showModal({title: '提示',content: '仅支持Android平台',success: function(res) {}})}}}}
</script>
使用:
// 使用示例这里只放了部分关键代码<fileManager ref="fileManagerRef" @result="fileResult" />import fileManager from '@/components/fileManager.vue';components: {nkSelectFile,fileManager,},// 导入importFileChooseFile() {this.$refs.fileManagerRef._openFile(1, (path) => {console.log('文件选择path:', path);});},
相关文章:
uniapp安卓plus原生选择系统文件
uniapp安卓plus原生选择系统文件 效果: 组件代码: <template xlang"wxml" minapp"mpvue"><view></view> </template> <script>export default {name: file-manager,props: {},data() {return {is…...
Go语言 Import导入
本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示,首先创建test文件夹。 加法 在test文件夹中创建add文件夹ÿ…...
一款异次元小清新风格的响应式wordpress个人博客主题
一款异次元小清新风格的响应式个人博客主题。这是一款专注于用户阅读体验的响应式 WordPress 主题,整体布局简洁大方,针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净,简单且响应迅速的博客主题&#x…...
【cocos creator】ts中export的模块管理
在 TypeScript(TS)中,export 和 import 的概念与 Java 中的 public 类、接口以及 import 语句有一些相似之处。可以用以下方式来类比理解: Export 在 TypeScript 中,export 用于将模块中的变量、函数、类等暴露给外部…...
QT JSON使用实例
下面是一个使用Qt框架的示例代码,展示如何获取仪器的状态,将其打包成JSON格式,保存到当前目录下的JSON文件中,然后通过FTP发送该文件。 1. 准备工作 确保你已经安装了Qt,并创建一个新的Qt Console项目或Qt Widgets项目…...
浅聊 Three.js 屏幕空间反射SSR-SSRShader
浅聊 Three.js 屏幕空间反射SSR(2)-SSRShader 前置基础 渲染管线中的相机和屏幕示意图 -Z (相机朝向的方向)||| -------------- <- 屏幕/投影平面| | || | || | (f) | <- 焦距| | ||…...
Windows图形界面(GUI)-DLG-C/C++ - 月历控件(MonthCalendar)
公开视频 -> 链接点击跳转公开课程博客首页 -> e链接点击跳转博客主页 目录 月历控件(MonthCalendar) 使用场景 控件操作 月历控件(MonthCalendar) 使用场景 日程安排:用户可以通过月历控件选择特定的日期来安排会议或活动。事件管理&#x…...
【Langchain大语言模型开发教程】基于文档问答
🔗 LangChain for LLM Application Development - DeepLearning.AI Embedding: https://huggingface.co/BAAI/bge-large-en-v1.5/tree/main 学习目标 1、Embedding and Vector Store 2、RetrievalQA 引包、加载环境变量 import osfrom dotenv import…...
大厂面试-基本功
大厂面试第4季 服务可用性多少个9是什么意思遍历集合add或remove操作bughashcode冲突案例BigdecimalList去重复IDEA Debugger测试框架ThreaLocal父子线程数据同步 InheritableThreadLocal完美解决线程数据同步方案 TransmittableThreadLocal 服务可用性多少个9是什么意思 遍历集…...
RV1103使用rtsp和opencv推流视频到网页端
参考: Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-pinout/CSI-Camera Luckfox-Pico/RKMPI-example Luckfox-Pico/RKMPI-example 下载源码 其中源码位置:https://github.com/luckfox-eng29/luckfox_pico_rtsp_opencv 使用git clone由于项目比较大&am…...
与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙
在软件工程师的世界里,与 Java 小程序中的 Bug 作战是一场永不停歇的战役。每一个隐藏在代码深处的 Bug 都像是一个狡猾的敌人,时刻准备着给我们的项目带来麻烦。 最近,我就陷入了这样一场与 Java 小程序 Bug 的激烈较量中。这个小程序原本应…...
Git --- Branch Diverged
Git --- Branch Diverged Branch Diverged是如何形成的如何解决RebaseMerge Branch Diverged是如何形成的 尝试提交并将更改推送到 master 分支时,是否看到这条烦人的消息 原因是: 直到更改 B 之前,我的分支和“origin/master”完全相同。从…...
go标准库---net/http服务端
1、http简单使用 go的http标准库非常强大,调用了两个函数就能够实现一个简单的http服务: func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) func ListenAndServe(addr string, handler Handler) error handleFunc注册一个路…...
Linux文件和目录常用命令
1.操作命令 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 > 和 >> 管道 | 1.1 终端实用技巧 1>自动补全 在敲出 文件/目录/命令 的前几个字母之后,按下…...
【C++刷题】优选算法——链表
链表常用技巧和操作总结 常用技巧 画图 引入虚拟头节点 不要吝啬空间,大胆定义变量 快慢双指针常用操作 创建一个新节点 尾插 头插 两数相加 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {int carry 0;ListNode* newHead new ListNode, *cur newHea…...
Flex和Bison
Flex和Bison是Linux和Unix环境下两个非常强大的工具,分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。下面我将详细介绍Flex和Bison的基本概念、功能、用法以及它们之间的关系。 一、Flex 1. 基本概念 Flex(其…...
Matlab-FPGA 小数转换为定点二进制小数脚本和转coe文件格式脚本
Matlab-FPGA 小数转换为定点二进制小数脚本: % 更新于2023年6月17日,修改旋转因子文件,不修改fpga %首先明确我们的二维FFT的数组维数,此为1024*8的二维矩阵,1024行,8列 column 1024; row 8; nk[]; Ncolumn*row; fo…...
逆向案例二十三——请求头参数加密,某区块链交易逆向
网址:aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1oYW5zL2J0Yy90eC1saXN0L3BhZ2UvNAo 抓包分析,发现请求头有X-Apikey参数加密,其他表单和返回内容没有加密。 直接搜索关键字,X-Apikey,找到疑似加密位置,注意这里…...
CSS 导航栏:设计、定制与优化
CSS 导航栏:设计、定制与优化 CSS(层叠样式表)是网页设计中不可或缺的一部分,它允许开发者通过定义样式来控制网页的布局和外观。在网页设计中,导航栏是一个关键元素,它帮助用户浏览网站并找到他们感兴趣的…...
JS 如何处理链接被用户点击中键的操作
今天在开发中遇到一个问题,在使用类似Bootstrap中的Tabs组件时,当在tab导航链接点击中键时会打开一个新的窗口访问链接,于是我尝试在别的普通链接上点击中键时也会如此,我猜测这是浏览器的默认行为。 由于我开发的是一个浏览器在…...
3大实战场景:PX4无人机视觉定位从零部署到工业级应用
3大实战场景:PX4无人机视觉定位从零部署到工业级应用 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot PX4-Autopilot作为开源无人机飞控的标杆,其视觉定位能力正在重塑自主飞…...
【claude code agent 实践7】后台任务机制深度解析: 从S02到S08的演进
后台任务机制深度解析 文章目录后台任务机制深度解析🔄 s02 vs s08 核心变化对比🔍 新增核心逻辑详解1. BackgroundManager类(后台任务管理器)2. agent_loop关键变化 - 每次LLM调用前排空队列📊 后台任务完整工作流程图…...
ZYNQ实战:从零构建uCOSIII最小系统与BSP配置详解
1. 环境准备与硬件设计 第一次在ZYNQ上跑uCOSIII时,我踩了不少坑。记得当时为了找个靠谱的参考文档,翻遍了国内外论坛。现在回头看,其实只要硬件配置对了,软件移植就是水到渠成的事。咱们先从最基础的Vivado工程搭建说起。 我用的…...
AI Agent变现难题与破局之道:小白程序员必备收藏,2026年蓝海掘金指南!
文章深入分析了当前AI Agent行业的冰火两重天现象,揭示了技术不成熟、伪需求泛滥、基础设施不完善等六大核心底层逻辑导致变现困难。同时,文章指出了电商全链路、企业办公自动化、本地生活商家、开发者垂直、垂类定制化等五大变现蓝海赛道,并…...
基于MCP协议的学术成果商业化AI管道:从论文到商业机会的自动化桥梁
1. 项目概述:从象牙塔到市场的自动化桥梁看到apifyforge/academic-commercialization-pipeline-mcp这个项目标题,我的第一反应是:终于有人把学术界和产业界之间那道无形的墙,用代码给砌出了一条自动化通道。这个项目本质上是一个“…...
Cursor Pro破解终极指南:开源工具cursor-free-vip实现AI编程助手永久免费使用
Cursor Pro破解终极指南:开源工具cursor-free-vip实现AI编程助手永久免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: …...
跨平台的Web应用快速开发框架
跨平台的Web应用快速开发框架。该框架提供了一套标准化的项目结构规范、统一的API接口命名规则、规范化的前后端代码,支持基于同一套设计规范Python(Flask/Django)、PHP、Java(SpringBoot/SSM)等多种后端语言代码 &…...
蓝桥杯嵌入式备赛:手把手教你用STM32G4的ADC读取光敏电阻(国信长天扩展板)
蓝桥杯嵌入式竞赛实战:STM32G4光敏电阻精准采集与优化策略 在蓝桥杯嵌入式竞赛中,环境光检测是高频考点之一。国信长天扩展板上的光敏电阻模块看似简单,但要在竞赛中稳定发挥,需要深入理解硬件电路设计原理、掌握ADC采集的优化技巧…...
WPF老鸟的Avalonia初体验:用VS2022+Ubuntu虚拟机,从零到发布Linux安装包
WPF开发者实战Avalonia跨平台:VS2022Ubuntu全流程指南 当微软宣布.NET跨平台战略时,许多WPF开发者都看到了将桌面应用扩展到Linux和macOS的可能性。作为一个长期依赖WPF构建企业级应用的开发者,我第一次接触Avalonia时,最惊讶的是…...
STM32F103C6/RC + HC-SR04超声波测距:Proteus 8.9仿真避坑与LCD1602显示实战
STM32F103C6/RC HC-SR04超声波测距:Proteus 8.9仿真避坑与LCD1602显示实战 在嵌入式开发的学习过程中,仿真工具为我们提供了极大的便利,尤其是对于资源有限或硬件条件不足的开发者来说,Proteus仿真软件无疑是一把利器。然而&…...
