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

news2024/11/15 19:57:50

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");
						// 给系统导入 contentResolver
						let 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)) {
								// ExternalStorageProvider
								if (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];
									}
								}
								// DownloadsProvider
								else 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);
								}
								// MediaProvider
								else 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);
							}
							// File
							else if ("file" == scheme) {
								return uri.getPath();
							}
						}
						// 4.4 以下 获取 绝对路径
						function getRealPathFromURI(uri) {
							let res = null
							let 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);
				});
			},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt--做一个拷贝文件器

一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位&#xff08;自适应&#xff09; 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类&#xff0c;直接使用静态…

Hi-Fix 介绍

一、HIFIX 定义与功能 HIFIX是连接安装在自动检测装置&#xff08;Tester&#xff09;本体内的功能卡(Resource board)和承载被测设备(Device)探针卡&#xff08;Probe card&#xff09;的媒介&#xff0c;将来自检测装置的大量测试信号统一发送到被测设备(Device)。 HiFIX 能…

Java语言程序设计——篇八(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; Java常用核心类 主要内容Object: 终极父类toString( )方法equals( )方法getClass( )方法hashCode( )方法clone( )方法finalize( )方法实战演练 …

CentOS6.0安装telnet-server启用telnet服务

CentOS6.0安装telnet-server启用telnet服务 一步到位 fp"/etc/yum.repos.d" ; cp -a ${fp} ${fp}.$(date %0y%0m%0d%0H%0M%0S).bkup echo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.163.com/centos-vault/6.0/os/$basearch/http://mirrors.a…

使用echo写入多行文字到文件时换行的处理

目标 想使用echo写入如下内容到文件program.c里 #include<stdio.h> int main(){printf("hello!\n"); } 需要处理 1、如何处理行换 2、代码中的换行如何处理 实际例子 创建文件夹 mkdir test cd test chmod 777 . 创建文件写入内容 查看 cat -n program.c…

SLS 数据加工全面升级,集成 SPL 语法

作者&#xff1a;灵圣 数据加工概述 在系统开发、运维过程中&#xff0c;日志是最重要的信息之一&#xff0c;其最大的优点是简单直接。不过在整个日志的生命周期里有一对很难调和的矛盾&#xff1a;输出和采集日志要求尽可能的简单便捷 vs 日志分析时需要数据格式化并能够按…

【SpringBoot】3 项目配置及部署

配置文件配置 将 application.properties 改为 application.yml &#xff0c;写法不一样&#xff0c;本人比较习惯用 yaml 格式。 配置项目名称和项目端口号。 application.yml server:port: 8888 spring:application:name: system配置外置 Servlet 容器 如果要在 Tomcat 容器…

数据结构·AVL树

1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果存数据时接近有序&#xff0c;二叉搜索将退化为单支树&#xff0c;此时查找元素效率相当于在顺序表中查找&#xff0c;效率低下。因此两位俄罗斯数学家 G.M.Adelson-Velskii 和E.M.Landis 在1962年发明了一种解…

音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件

在文章《音视频入门基础&#xff1a;PCM专题&#xff08;1&#xff09;——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为WAV格式的音频文件&#xff1a; ./ffmpeg -ar 44100 -ac 2 -f s16le -acodec pcm_s16le -i aud…

「Ant Design」Antd 中卡片如何完全不展示内容区域、按需展示内容区域、不展示标题

前言 下面是默认的 Antd 卡片&#xff0c;由以下区域组成 处理 Antd 的 Card 展示形式大致有下面三种 卡片完全不展示内容区域 const App () > (<Card title"Default size card" extra{<a href"#">More</a>} style{{ width: 300 }}b…

工厂数字化转型,该如何建设数字孪生车间?

在工业4.0的浪潮下&#xff0c;数字化转型已成为工厂升级的必然趋势&#xff0c;而数字孪生技术的引入则为这一转型注入了强大动力。智汇云舟作为数字孪生行业头部企业和视频孪生技术首倡者&#xff0c;以创新的视角和前沿的技术&#xff0c;为数字工业建设助力&#xff0c;给众…

《昇思25天学习打卡营第2天|张量》

张量其实就是矩阵&#xff0c;在python中主要是使用numpy这个库来操作&#xff0c;然后再mindspore中一般使用tensor对象作为张量的载体 张量如果维度只有二维的话可以简单理解为数据库中的表&#xff0c;但是如果是3维4维主要是在列表中增加列表项比如 【 【1&#xff0c;1】…

C++ //练习 15.28 定义一个存放Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。

C Primer&#xff08;第5版&#xff09; 练习 15.28 练习 15.28 定义一个存放Quote对象的vector&#xff0c;将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&am…

【C++笔试强训】day01

数字统计 思路 用%10取出个位的数字&#xff0c;用/10迭代。 代码 #include <iostream> using namespace std;int main() {int l, r, res 0;cin >> l >> r;for (int i l; i < r; i){int x i;while (x){if (x % 10 2) res;x / 10;}}cout << r…

AttributeError: ‘WandbLogger‘ object has no attribute ‘bbox_interval‘

一、问题描述 跑yolov5时&#xff0c;运行代码出现以下报错 AttributeError: WandbLogger object has no attribute bbox_interval 二、问题原因 可能是版本的问题&#xff0c;需要把wandb关闭 三、解决方法 在路径 \yolov5\utils\loggers 文件夹下的 _init__.py文件中19…

【MySQL】记录MySQL加载数据(LOAD DATA)

MySQL LOAD DATA 一、背景二、模拟生成用户信息三、加载到mysql表3.1、建表语句3.2 加载数据3.3、查看结果 一、背景 现在有个需求是将用户信息存入student.data文件中&#xff0c;在现在load到数据库中 二、模拟生成用户信息 假设用户信息&#xff0c;包含姓名&#xff0c;…

使用PyTorch导出JIT模型:C++ API与libtorch实战

PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1&#xff1a;导出模型 首先我们进行第一步&#xff0c;用 Python API 来导出模型&#xff0c;由于本文的重点是在后面的部署…

AR 眼镜之-蓝牙电话-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 蓝牙电话 来电铃声 1. &#x1f531; 技术方案 1.1 结构框图 1.2 方案介绍 1.3 实现方案 步骤一&#xff1a;屏蔽原生蓝牙电话相关功能 步骤二&#xff1a;自定义蓝牙电话实现 2. &#x1f4a0; 屏蔽原生蓝牙电话相关功能 …

深入解读 Java 中的 `StringUtils.isNotBlank` 与 `StringUtils.isNotEmpty`

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

【支持语言模型和视觉语言模型的推理引擎sglang】

介绍 sglang是一个AI推理引擎&#xff0c;是一个专门为大语言模型和视觉语言模型设计的高效服务框架。 就像F1赛车需要顶级发动机一样&#xff0c;大语言模型也需要高效的推理引擎来发挥潜力。 而sglang正是这样一个性能怪兽。 根据LMSys组织的官方公告&#xff0c;最新的s…