UNPKG

mtl-js-sdk

Version:

ynf-fw-mtl-api

878 lines (833 loc) 28.4 kB
import { invokeSuccess, invokeFail } from '../callback' import { uploadFile } from '../util' import { requestPermission } from '../permission'; import { localizedString } from '../localization' import { execUpesnBridgeify, canExecUpesnBridge, execUpesnBridge } from '../bridge/index' import { saveExclusiveYhtInfoKey } from '../keys' function _chooseImage(param = {}) { let list = param.sourceType[0] == 'album' ? ['photos'] : ['camera', 'storage']; requestPermission({ list: list, success: function () { let obj = api.require('mtlPhotoPicker'); obj.chooseImage(param, function (ret, err) { if (ret && ret.localIds) { let pictures = ret.localIds; let localIds = []; pictures.forEach(function (item) { localIds.push(item.filePath); }); invokeSuccess(param, { localIds, pictures }); } else { invokeFail(param, err); } }); }, fail: function (err) { invokeFail(param, { code: '-10007', message: "permission denied" }); } }); } export function chooseImage(param = {}) { let obj = api.require('mtlPhotoPicker'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridge({ method: 'chooseImages', ...param, success: function (res) { let localIds = []; let pictures = res.pictures; pictures.forEach(item => { localIds.push(item.filePath); }); let trans = api.require('trans'); if (trans && trans.batchTransPath) { trans.batchTransPath({ paths: localIds }, function (ret, err) { if (ret && ret.status) { let transPaths = ret.paths; for (let i = 0; i < pictures.length; i++) { let item = pictures[i]; item.filePath = transPaths[i]; // 文件名 let array = item.filePath.split('/'); item.fileName = array[array.length - 1]; // 缩略图路径处理 if (item.thumbPath && api.systemType == 'ios') { let boxDir = api.boxDir; item.thumbPath = boxDir.substring(0, boxDir.indexOf('Documents')) + 'Documents' + item.thumbPath; } } invokeSuccess(param, { localIds: transPaths, pictures }); } else { invokeSuccess(param, { localIds, pictures }); } }); } else { invokeSuccess(param, { localIds, pictures }); } } }); return; } invokeFail(param, { msg: 'module mtlPhotoPicker not added' }); return; } let sourceType = param.sourceType || ['album', 'camera']; if (sourceType.length == 1 && (sourceType[0] == 'album' || sourceType[0] == 'camera')) { _chooseImage(param); } else { api.actionSheet({ cancelTitle: localizedString('cancel'), buttons: [localizedString('album'), localizedString('camera')] }, function (ret, err) { if (ret) { if (ret.buttonIndex == 3) { // invokeFail(param, {message:'canceled'}); } else { param.sourceType = ret.buttonIndex == 1 ? ['album'] : ['camera']; _chooseImage(param); } } else { invokeFail(param, err); } }); } } export function chooseImageToServer(param = {}) { if (canExecUpesnBridge()) { execUpesnBridgeify('chooseImageToServer', param); return; } let { success, fail } = param; param.success = function (res) { uploadFile({ type: 'image', files: res.localIds, success: function (data) { invokeSuccess({ success: success }, { pictures: data.files }); }, fail: function (err) { invokeFail({ fail: fail }, err); } }); }; param.fail = function (err) { invokeFail({ fail: fail }, err); } chooseImage(param); } /** * 调用系统相机或相册, 6.2.14版本增加. * @param {array} sourceType 采集源(可选项). camera 相机, album 相册, ['album', 'camera'](默认) * @param {int} shootMode 拍摄模式(可选项). 0:拍照片+拍视频(默认); - 1:拍照片; - 2:拍视频 * @param {boolean} mirror 是否关闭自拍镜像,前置摄像头拍照时生效(可选项). (默认 false) * @param {int} count 最多可以选择的图片张数,仅从相册选择时有效,相机拍照只会返回一张(可选项). (默认 9) * @param {int} recordSecond 拍摄视频时的视频时长(可选项). (默认15s) * @param {boolean} isEditImage 拍照完成后是否显示画笔按钮,仅拍照模式下支持(可选项). (默认 true) * @param {boolean} isSaveToAlbum 拍照完成后是否保存到本地相册,仅拍照模式下支持(可选项). (默认 false) * @param {boolean} isSaveOriginal 拍照完成后保存相册照片是否带水印,仅拍照模式下支持(可选项). (默认 false) * @param {boolean} returnThumbnail 是否需要返回缩略图,watermark生效时,此参数无效,只返回带水印的路径(可选项). (默认 false) * @param {object} watermark 图片水印字符串,不传则不显示水印,仅图片支持水印设置 */ export function chooseImages(params) { let sourceType = params?.sourceType let list = sourceType[0] == 'album' ? ['photos', 'storage'] : ['camera', 'storage']; // 申请权限 requestPermission({ list: list, success: function () { let obj = api.require('mediaCollector'); if (!obj) { invokeFail(params, { msg: 'module mediaCollector not added' }); return } if (!obj.chooseImage) { invokeFail(params, { msg: "Please update the 'mediaCollector' plugin!" }); return } let p = { ...params } delete p.success; delete p.fail; delete p.complete; obj.chooseImage({ sourceType: sourceType, ...p }, function (ret, err) { if (ret) { invokeSuccess(params, ret); } else { invokeFail(params, err); } }); }, fail: function (err) { invokeFail(params, { code: '-10007', message: "permission denied" }); } }); } export function previewImage(param = {}) { let yht_access_token; let yhtInfoStr = api.getPrefs({ sync: true, key: saveExclusiveYhtInfoKey }); if (yhtInfoStr) { let yhtInfo = JSON.parse(yhtInfoStr); if (yhtInfo) { yht_access_token = yhtInfo.yht_access_token; } } if (!param.yht_access_token) { param.yht_access_token = yht_access_token } let obj = api.require('mtlPhotoPicker'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridgeify('previewImage', param); return; } invokeFail(param, { msg: 'module mtlPhotoPicker not added' }); return; } obj.previewImage(param, function (ret, err) { if (ret && ret.status) { invokeSuccess(param, ret); } else { invokeFail(param, err || ret); } }); } export function saveImageToPhotoAlbum(param = {}) { requestPermission({ list: ['photos-w'], success: function () { let base64Str = param.base64Str; if (base64Str) { var trans = api.require('trans'); if (!trans) { invokeFail(param, { msg: "module trans not added" }); return; } base64Str = base64Str.replace(/data:image\/\S+;base64,/g, ''); trans.saveImage({ base64Str, album: true, imgName: param.imgName }, function (ret, err) { if (ret && ret.status) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); return; } api.saveMediaToAlbum({ path: param.url }, function (ret, err) { if (ret && ret.status) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); }, fail: param.fail }); } export function getLocalImgData(param = {}) { let path = param.localId; if (path) { if (canExecUpesnBridge()) { const { localId = '', type = 1, level = 2 } = param execUpesnBridgeify('compressLocalImage', { ...param, imgData: localId, type, level, success: function (res) { let base64str = res.base64str; if (!base64str.startsWith("data:image/")) { let imgType = '' if (localId.lastIndexOf(".") == -1) { imgType = 'jpeg' } else { imgType = localId.substring(localId.lastIndexOf(".") + 1, localId.length); } base64str = "data:image/" + imgType + ";base64," + base64str; } invokeSuccess(param, { localData: base64str }); } }); return; } let obj = api.require('trans') if (obj) { obj.decodeImgToBase64({ imgPath: path }, function (ret, err) { if (ret && ret.status) { invokeSuccess(param, { localData: 'data:image/png;base64,' + ret.base64Str }); } else { invokeFail(param, err); } }); } else { invokeFail(param, { msg: 'module trans not added' }); } } else { invokeFail(param, { message: 'file does not exist' }); } } export function saveImageToLocal(param = {}) { requestPermission({ list: ['storage'], success: function () { api.download({ url: param.url, allowResume: true }, function (ret, err) { if (ret) { if (ret.state == 1) { mtl.setStorage({ key: param.url, data: ret.savePath }); invokeSuccess(param, {}); } else if (ret.state == 2) { invokeFail(param, err); } } else { invokeFail(param, err); } }); }, fail: param.fail }); } export function loadImageFromLocal(param = {}) { requestPermission({ list: ['storage'], success: function () { let path = mtl.getStorageSync({ key: param.url }); if (path) { api.require('trans').decodeImgToBase64({ imgPath: path }, function (ret, err) { if (ret && ret.status) { invokeSuccess(param, { imageData: 'data:image/png;base64,' + ret.base64Str }); } else { invokeFail(param, err); } }); } else { invokeFail(param, { message: 'file does not exist' }); } }, fail: param.fail }); } export function saveBase64Image(param = {}) { let { name, base64str } = param; if (name && base64str) { var trans = api.require('trans'); if (!trans) { if (canExecUpesnBridge()) { execUpesnBridgeify('saveBase64Image', param); return; } invokeFail(param, { msg: "module trans not added" }); return; } trans.saveBase64Image({ name, base64str }, function (ret, err) { if (ret.status) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); } else { invokeFail(param, { message: 'param error' }); } } export function getBase64Image(param = {}) { let { name } = param; if (name) { var trans = api.require('trans'); if (!trans) { if (canExecUpesnBridge()) { execUpesnBridgeify('getBase64Image', param); return; } invokeFail(param, { msg: "module trans not added" }); return; } trans.getBase64Image({ name }, function (ret, err) { if (ret.status) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); } else { invokeFail(param, { message: 'param error' }); } } export function deleteBase64Image(param = {}) { if (canExecUpesnBridge()) { execUpesnBridgeify('deleteBase64Image', param); return; } let { name } = param; if (name) { var trans = api.require('trans'); if (!trans) { if (canExecUpesnBridge()) { execUpesnBridgeify('deleteBase64Image', param); return; } invokeFail(param, { msg: "module trans not added" }); return; } trans.deleteBase64Image({ name }, function (ret, err) { if (ret.status) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); } else { invokeFail(param, { message: 'param error' }); } } export function compressLocalImage(param = {}) { var imageTools = api.require('imageTools'); if (!imageTools) { if (canExecUpesnBridge()) { execUpesnBridgeify('compressLocalImage', param); return; } invokeFail(param, { msg: 'module imageTools not added' }); return; } let { imgData } = param; if (!imgData) { invokeFail(param, { message: 'imgData error' }); return } imageTools.compressLocalImage(param, function (ret, err) { if (ret) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); } export function addImageWaterMark(param = {}) { var imageHandle = api.require('imageHandle'); if (!imageHandle) { if (canExecUpesnBridge()) { execUpesnBridgeify('addImageWaterMark', param); return; } invokeFail(param, { msg: 'module imageHandle not added' }); return; } let { image, watermark = {} } = param; if (image && watermark) { imageHandle.addImageWaterMark({ image, watermark }, function (ret, err) { if (ret) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); } else { invokeFail(param, { message: 'param error' }); } } export function continuousShootingLocal(param = {}) { var seriesCamera = api.require('seriesCamera'); if (!seriesCamera) { if (canExecUpesnBridge()) { execUpesnBridgeify('continuousShootingLocal', { ...param, success: (res) => { let pictures = res.pictures; pictures.forEach(item => { if (item.fileFullPath) { item.filePath = item.fileFullPath; } }); invokeSuccess(param, { ...res, pictures }); } }); return; } invokeFail(param, { msg: 'module seriesCamera not added' }); return; } const { quality, count = 9 } = param requestPermission({ list: ['camera', 'photos', 'storage'], success: function () { seriesCamera.open({ max: count, quality }, function (ret, err) { console.log('continuousShootingLocal--', ret) if (ret) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); }, fail: param.fail }); } function _chooseVideo(param = {}) { let list = param.sourceType[0] == 'album' ? ['photos'] : ['camera', 'microphone', 'storage']; requestPermission({ list: list, success: function () { let obj = api.require('mtlPhotoPicker'); obj.chooseVideo(param, function (ret, err) { if (ret) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); }, fail: param.fail }); } export function getVideoThumbnail(param = {}) { var videoScreenshots = api.require('videoScreenshots'); if (!videoScreenshots) { if (canExecUpesnBridge()) { execUpesnBridgeify('getVideoThumbnail', param); return; } invokeFail(param, { msg: 'module videoScreenshots not added' }); return; } let { videoPath, thumbnailQuality } = param; videoScreenshots.screenshots({ videoUrl: videoPath, thumbnailQuality, }, function (ret, err) { if (ret) { invokeSuccess(param, ret); } else { invokeFail(param, err); } }); } export function chooseVideo(param = {}) { let obj = api.require('mtlPhotoPicker'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridgeify('chooseVideo', { ...param, success: function (res) { invokeSuccess(param, { ...res, filePath: res.tempFilePath }); } }); return; } invokeFail(param, { msg: 'module mtlPhotoPicker not added' }); return; } let sourceType = param.sourceType || ['album', 'camera']; if (sourceType.length == 1 && (sourceType[0] == 'album' || sourceType[0] == 'camera')) { _chooseVideo(param); } else { api.actionSheet({ cancelTitle: localizedString('cancel'), buttons: [localizedString('album'), localizedString('camera')] }, function (ret, err) { if (ret) { if (ret.buttonIndex == 3) { // invokeFail(param, {message:'canceled'}); } else { param.sourceType = ret.buttonIndex == 1 ? ['album'] : ['camera']; _chooseVideo(param); } } else { invokeFail(param, err); } }); } } export function chooseVideoToServer(param = {}) { let obj = api.require('mtlPhotoPicker'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridgeify('chooseVideoToServer', param); return; } invokeFail(param, { msg: 'module mtlPhotoPicker not added' }); return; } let { success, fail } = param; param.success = function (res) { uploadFile({ type: 'video', files: [res.filePath], success: function (data) { invokeSuccess({ success: success }, data.files[0]); }, fail: function (err) { invokeFail({ fail: fail }, err); } }); }; param.fail = function (err) { invokeFail({ fail: fail }, err); } chooseVideo(param); } let recordTimer = null; let onVoiceRecordEndCallback = null; export function startRecord(param = {}) { let obj = api.require('FNRecordMp3'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridgeify('startRecordMp3', { ...param, callback: onVoiceRecordEndCallback && onVoiceRecordEndCallback.success }); return; } invokeFail(param, { msg: 'module FNRecordMp3 not added' }); return; } requestPermission({ list: ['microphone', 'storage'], success: function () { if (recordTimer != null) { clearTimeout(recordTimer); recordTimer = null; } recordTimer = setTimeout(() => { recordTimer = null; if (onVoiceRecordEndCallback) { mtl.stopRecord(onVoiceRecordEndCallback); } }, 60000); obj.open({ path: 'cache://record', fileDir: 'cache://record/' }, function (ret, err) { if (ret && ret.status) { obj.start(function (ret1, err1) { if (ret1 && ret1.status) { invokeSuccess(param, ret); } else { if (recordTimer != null) { clearTimeout(recordTimer); recordTimer = null; } invokeFail(param, err1); } }); } else { if (recordTimer != null) { clearTimeout(recordTimer); recordTimer = null; } invokeFail(param, err); } }); }, fail: param.fail }); } export function stopRecord(param = {}) { let obj = api.require('FNRecordMp3'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridgeify('stopRecordMp3', { ...param, success: function (res) { invokeSuccess(param, { localId: res.bytes }); } }); return; } invokeFail(param, { msg: 'module FNRecordMp3 not added' }); return; } if (recordTimer != null) { clearTimeout(recordTimer); recordTimer = null; } obj.stop(function (ret, err) { if (ret && ret.status) { obj.getMp3Path({ channel: 2 }, function (ret1, err1) { if (ret1 && ret1.status) { api.require('trans').decodeFileToBase64({ filePath: ret1.path }, function (ret2, err2) { if (ret2 && ret2.status) { invokeSuccess(param, { localId: ret2.base64Str }); } else { invokeFail(param, err2); } }); } else { invokeFail(param, err1); } }); } else { invokeFail(param, err); } }); } export function onVoiceRecordEnd(param = {}) { onVoiceRecordEndCallback = param; } export function recordAudio(param = {}) { let obj = api.require('UIActionRecord'); if (!obj) { if (canExecUpesnBridge()) { execUpesnBridgeify('recordAudio', param); return; } invokeFail(param, { msg: 'module UIActionRecord not added' }); return; } requestPermission({ list: ['microphone', 'storage'], success: function () { obj.recordAudio(param, function (ret, err) { if (ret) { api.require('trans').decodeFileToBase64({ filePath: ret.bytes }, function (ret2, err2) { if (ret2 && ret2.status) { invokeSuccess(param, { bytes: ret2.base64Str }); } else { invokeFail(param, err2); } }); } else { invokeFail(param, err); } }); }, fail: param.fail }); } let onVoicePlayEndCallback = null; export function playVoice(param = {}) { const { url } = param if (url) { api.startPlay({ path: url }, function (ret1, err1) { if (ret1) { if (onVoicePlayEndCallback) { invokeSuccess(onVoicePlayEndCallback, { url }); } else { invokeSuccess(param, { url }); } } else { invokeFail(param, err1); } }); return } requestPermission({ list: ['storage'], success: function () { let localId = param.localId; api.require('trans').saveFile({ base64Str: localId, filePath: 'cache://', fileName: 'tmp.mp3' }, function (ret, err) { if (ret && ret.status) { let filePath = 'cache://tmp.mp3'; api.startPlay({ path: filePath }, function (ret1, err1) { if (ret1) { if (onVoicePlayEndCallback) { invokeSuccess(onVoicePlayEndCallback, { localId }); } else { invokeSuccess(param, { localId }); } let fs = api.require('fs'); fs && fs.removeSync({ path: filePath }); } else { invokeFail(param, err1); } }); } else { invokeFail(param, err); } }); }, fail: param.fail }); } export function pauseVoice(param = {}) { api.pausePlay(); invokeSuccess(param, {}); } export function stopVoice(param = {}) { api.stopPlay(); invokeSuccess(param, {}); } export function onVoicePlayEnd(param = {}) { onVoicePlayEndCallback = param; } /** * 结束人脸验证 * @param {Object} params 参数集合 * @returns 无 */ export function endLoginFaceFactorVerify(params = {}) { if (window.mtl.platform === 'upesn' && canExecUpesnBridge()) { execUpesnBridge('endLoginFaceFactorVerify', { ...params, success: function (res) { invokeSuccess(params); } }) return } // 私有版中, 只发送事件并关闭窗口, 由私有版接收事件. window.api?.sendEvent({ name: "endLoginFaceFactorVerify", extra: { ...params } }) window.mtl?.closeCurrentWebview() }