前文:
uniapp提供的uni.chooseFile()提供了选择非媒体文件的功能,但是它不支持App,因此本文章通过使用原生操作来实现选择文件功能。
正文:
1、定义一个按钮:
<button @click="myChooseFile">选择文件</button>
2、需要用到一个权限插件permission.js,用于权限判断和提示
3、编写选择文件的核心代码choose.js:
import permission from "permission.js的文件路径"
let chooseFile = function(callback, acceptType) {
let permissionID = 'android.permission.READ_EXTERNAL_STORAGE';
permission.requestAndroidPermission(permissionID).then(res => {
if (res === 1) {
androidFilePicker(callback, acceptType)
} else {
uni.showModal({
title: '无法访问存储',
content: '您已经关闭存储权限,请前往权限管理中允许当前应用访问存储',
success: (res) => {
if (res.confirm) {
// 跳转到手机的权限管理
permission.gotoAppPermissionSetting()
}
}
})
}
})
}
let androidFilePicker = function (callback, acceptType) {
let CODE_REQUEST = 1000;
let main = plus.android.runtimeMainActivity();
if(plus.os.name === 'Android') {
let Intent = plus.android.importClass('android.content.Intent');
let intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
if(acceptType) {
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
} else {
intent.setType("*/*");
}
main.onActivityResult = (requestCode, resultCode, data)=>{
if(requestCode === CODE_REQUEST) {
const uri = data.getData();
plus.android.importClass(uri);
const Build = plus.android.importClass('android.os.Build');
const isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
const DocumentsContract = plus.android.importClass('android.provider.DocumentsContract');
if(isKitKat && DocumentsContract.isDocumentUri(main, uri)) {
console.log(uri.getAuthority())
if("com.android.externalstorage.documents" === uri.getAuthority()) {
let docId = DocumentsContract.getDocumentId(uri);
let split = docId.split(":");
let type = split[0];
if("primary" === type) {
let Environment = plus.android.importClass('android.os.Environment');
callback(Environment.getExternalStorageDirectory() + "/" + split[1]);
} else {
let System = plus.android.importClass('java.lang.System');
let sdPath = System.getenv("SECONDARY_STORAGE");
if(sdPath) {
callback(sdPath + "/" + split[1]);
}
}
}
else if("com.android.providers.downloads.documents" === uri.getAuthority()) {
let id = DocumentsContract.getDocumentId(uri);
let ContentUris = plus.android.importClass('android.content.ContentUris');
let contentUri = ContentUris.withAppendedId(
// Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
Uri.parse("content://downloads/public_downloads"), id);
callback(getDataColumn(main, contentUri, null, null));
}
else if("com.android.providers.media.documents" === uri.getAuthority()) {
let docId = DocumentsContract.getDocumentId(uri);
let split = docId.split(":");
let type = split[0];
let MediaStore = plus.android.importClass('android.provider.MediaStore');
let contentUri = ''
if("image" === type) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if("video" === type) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if("audio" === type) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}else{
contentUri = MediaStore.Files.getContentUri("external");
}
let selection = "_id=?";
let selectionArgs = new Array();
selectionArgs[0] = split[1];
callback(getDataColumn(main, contentUri, selection, selectionArgs));
}
}
else if("content" === uri.getScheme()) {
callback(getDataColumn(main, uri, null, null));
}
else if("file" === uri.getScheme()) {
callback(uri.getPath());
}
}
}
main.startActivityForResult(intent, CODE_REQUEST);
}
}
function getDataColumn(main, uri, selection, selectionArgs) {
plus.android.importClass(main.getContentResolver());
let cursor = main.getContentResolver().query(uri, ['_data'], selection, selectionArgs,
null);
plus.android.importClass(cursor);
if(cursor != null && cursor.moveToFirst()) {
let column_index = cursor.getColumnIndexOrThrow('_data');
let result = cursor.getString(column_index)
cursor.close();
return result;
}
return null;
}
export default chooseFile
5、调用:
先在vue文件中引入:
import chooseFile from "@/js/choose.js";
在methods中写function:
methods: {
myChooseFile() {
chooseFile(url => {
let path = url.trim()
let fileName = path.split("/")[path.split("/").length - 1]
// 拿着路径和文件名就可以上传啦
})
}
}