uniapp安卓端文件上传(离线打包不行,云打包没问题)
1、踩坑之路一 uniapp本身的坑
uniapp文件上传只能上传图片pdf这些基础的文件类型,多了比如excel或者word、doc就没法上传。
2、踩坑之路二 input上传的坑(其实是WPS)
经过第一个坑之后,我选择了使用本地搭建一个html,通过webview的方式,使用input的原生方法选取文件上传。
到这里其实所有功能都已经打通了,通过uni官方的webview交互来监听上传。
但是!!!!! input在选取文件的时候会读取所有存储,所以WPS也赫然在列。老版本的WPS的被读取权限是打开的,而新版本的WPS通道关闭。这就导致我在选取文件的时候,我的APP会直接闪退。但是唯一好一点的是IOS端没有这个问题。
3、踩坑之路三 离线打包的坑
由于IOS端权限这一块把握得死死的,所以input选取方法在IOS端可以使用且没有WPS文件选取。那么就只有把IOS端和Android端分开处理,这里使用的代码是网上抄的,本人并不懂Android开发。
// chooseFile.js文件内容
export function chooseFile123(callback, mimeTypes) {
//acceptType为你要查的文件类型"image/*","audio/*","video/*;image/*" // intent.setType("image/*");//intent.setType("audio/*"); //选择音频//intent.setType("video/*;image/*"); //选择视频 (mp4 3gp 是android支持的视频格式)
var CODE_REQUEST = 1000;
var main = plus.android.runtimeMainActivity();
if (plus.os.name == "Android") {
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
if (mimeTypes) {
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
} else {
intent.setType("*/*");
}
main.onActivityResult = function (requestCode, resultCode, data) {
if (requestCode == CODE_REQUEST) {
var uri = data.getData();
plus.android.importClass(uri);
var Build = plus.android.importClass("android.os.Build");
var isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
var DocumentsContract = plus.android.importClass(
"android.provider.DocumentsContract"
);
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(main, uri)) {
console.log("版本大于 4.4 ");
// ExternalStorageProvider
if ("com.android.externalstorage.documents" == uri.getAuthority()) {
var docId = DocumentsContract.getDocumentId(uri);
var split = docId.split(":");
var type = split[0];
if ("primary" == type) {
var Environment = plus.android.importClass(
"android.os.Environment"
);
callback(
Environment.getExternalStorageDirectory() + "/" + split[1]
);
} else {
var System = plus.android.importClass("java.lang.System");
var sdPath = System.getenv("SECONDARY_STORAGE");
if (sdPath) {
callback(sdPath + "/" + split[1]);
}
}
}
// DownloadsProvider
else if (
"com.android.providers.downloads.documents" == uri.getAuthority()
) {
var id = DocumentsContract.getDocumentId(uri);
var ContentUris = plus.android.importClass(
"android.content.ContentUris"
);
var 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));
}
// MediaProvider
else if (
"com.android.providers.media.documents" == uri.getAuthority()
) {
var docId = DocumentsContract.getDocumentId(uri);
var split = docId.split(":");
var type = split[0];
var MediaStore = plus.android.importClass(
"android.provider.MediaStore"
);
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 if ("document" == type.toLowerCase()) {
contentUri = MediaStore.Files.getContentUri("external");
} else {
contentUri = MediaStore.Files.getContentUri("external");
}
console.log("版本大于 4.4 ", type);
var selection = "_id=?";
var selectionArgs = new Array();
selectionArgs[0] = split[1];
callback(
getDataColumn(main, contentUri, selection, selectionArgs)
);
}
}
// MediaStore (and general)
else if ("content" == uri.getScheme()) {
console.log(uri.getPath(), "日你仙人板板");
callback(getDataColumn(main, uri, null, null));
}
// File
else if ("file" == uri.getScheme()) {
console.log(uri.getPath(), "日你仙人");
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()) {
var column_index = cursor.getColumnIndexOrThrow("_data");
var result = cursor.getString(column_index);
cursor.close();
return result;
}
return null;
}
集成完成后在页面引入调用这个方法。然后判断机型来对应调用方法。
在本地测试啥问题也没有,离线打包的时候问题就来了!!!离线打包完成后,没办法拿到上面方法的返回值。搞了半天也没搞明白。最后使用了uniapp的云打包才搞定,这里应该是权限的问题,安卓开发这一块我不明白。以上就解决了本地文件选取的问题。(离线打包搞不定)