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);});},