Bootstrap

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");
						// 给系统导入 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);
				});
			},
;