import Base64 from "android.util.Base64"; import MimeTypeMap from "android.webkit.MimeTypeMap"; import ByteArrayOutputStream from 'java.io.ByteArrayOutputStream'; import File from "java.io.File"; import FileInputStream from "java.io.FileInputStream"; import FileOutputStream from "java.io.FileOutputStream"; import InputStream from 'java.io.InputStream'; // import IOException from "java.io.IOException"; import { ProcessFileOptions, NullableString } from '../interface' type NullByteArray = ByteArray | null function inputStreamToArray(inputStream : InputStream) : NullByteArray { try { let bos : ByteArrayOutputStream = new ByteArrayOutputStream() let bytes : ByteArray = new ByteArray(1024) do { let length = inputStream.read(bytes) if (length != -1) { bos.write(bytes, 0, length) } else { break } } while (true) bos.close() return bos.toByteArray() } catch (e : Throwable) { return null; } } function getMimeType(filePath : string) : NullableString { const extension = MimeTypeMap.getFileExtensionFromUrl(filePath); if (extension == null) return null return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } export function getResourcePath(path : string) : string | null { let uri = path if (uri.startsWith("http") || uri.startsWith(" */ export function checkExistence(filePath : string):boolean[] { const path = getResourcePath(filePath) const file = new File(path) const exists = file.exists() if(exists) { return [true, file.isDirectory] } else { return [false, false] } } /** * 检查路径是否存在 * @param path 要检查的完整路径 */ export function isExists(filePath : string):boolean { const result = checkExistence(filePath); return result[0] } /** * 检查路径是否是存在的目录 * @param path 要检查的完整路径 */ export function isDirectory(filePath : string):boolean { const result = checkExistence(filePath); return result[0] && result[1] } /** * 检查指定路径是否为存在的文件 * @param path 要检查的完整路径 * @return 当且仅当路径存在且是普通文件时返回 true */ export function isFile(filePath : string):boolean { const result = checkExistence(filePath); return result[0] && !result[1] } export function fileToBase64(filePath : string) : NullableString { try { const context = UTSAndroid.getUniActivity()!; let path = filePath; let imageBytes : NullByteArray = null if (path.startsWith("file://")) { path = path.replace("file://", "") } else { // if(!path.startsWith("/storage") && !path.startsWith("/android_asset/")) // path = UTSAndroid.getResourcePath(path) path = UTSAndroid.convert2AbsFullPath(path) } if (path.startsWith("/android_asset/")) { imageBytes = inputStreamToArray(context.getResources()!.getAssets().open(path.replace('/android_asset/', ''))) } else { const file = new File(path) if (file.exists()) { let fis : FileInputStream = new FileInputStream(file); imageBytes = inputStreamToArray(fis); fis.close(); } } if (imageBytes == null) return null return Base64.encodeToString(imageBytes, Base64.DEFAULT) } catch (e) { return null } } export function fileToDataURL(filePath : string) : NullableString { const base64 = fileToBase64(filePath) const mimeType = getMimeType(filePath); if (base64 == null || mimeType == null) return null; return "data:" + mimeType + ";base64," + base64; } function getFileExtensionFromDataURL(dataURL : string) : string { const commaIndex = dataURL.indexOf(","); const mimeType = dataURL.substring(0, commaIndex).replace("data:", "").replace(";base64", ""); const mimeTypeParts = mimeType.split("/"); return mimeTypeParts[1]; } function dataURLToBytes(dataURL : string) : ByteArray { const commaIndex = dataURL.indexOf(","); const base64 = dataURL.substring(commaIndex + 1); return Base64.decode(base64, Base64.DEFAULT); } export function dataURLToFile(dataURL : string, filename : NullableString = null) : NullableString { try { const bytes = dataURLToBytes(dataURL); const name = filename ?? `${Date.now()}.${getFileExtensionFromDataURL(dataURL)}`; const cacheDir = UTSAndroid.getAppCachePath()!; const destFile = new File(cacheDir, name); const path = new File(cacheDir); if(!path.exists()){ path.mkdir(); } const fos = new FileOutputStream(destFile) fos.write(bytes); fos.close(); return `${cacheDir}${name}` } catch (e) { console.error('dataURLToFile::', e) return null } } // function requestSystemPermission(fun:()=> void) { // let permissionNeed = ["android.permission.WRITE_EXTERNAL_STORAGE"] // UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissionNeed, function (allRight : boolean, _ : string[]) { // if (allRight) { // // 权限请求成功 // console.log(`allRight`, allRight) // fun() // } else { // //用户拒绝了部分权限 // } // }, function (_ : boolean, _ : string[]) { // //用户拒绝了部分权限 // }) // } export function processFile(options : ProcessFileOptions) { if (options.type == 'toBase64') { const res = fileToBase64(options.path) const err = 'fileToBase64: 解析失败' if (res != null) { options.success?.(res) options.complete?.(res) } else { options.complete?.(err) options.fail?.(err) } } else if (options.type == 'toDataURL') { const res = fileToDataURL(options.path) const err = 'fileToDataURL: 解析失败' if (res != null) { options.success?.(res) options.complete?.(res) } else { options.complete?.(err) options.fail?.(err) } } else if (options.type == 'toFile') { const res = dataURLToFile(options.path, options.filename) const err = 'dataURLToFile: 解析失败' if (res != null) { options.success?.(res) options.complete?.(res) } else { options.complete?.(err) options.fail?.(err) } } }