diff --git a/manifest.json b/manifest.json index 2df3ba6..de62555 100644 --- a/manifest.json +++ b/manifest.json @@ -53,7 +53,8 @@ "", "", "", - "" + "", + "" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ], "autoSdkPermissions" : false, @@ -67,7 +68,8 @@ "NSLocationWhenInUseUsageDescription" : "我们的应用需要在您进行考勤打卡时获取位置信息,以确保打卡记录的准确性和验证打卡地点。", "NSPhotoLibraryUsageDescription" : "我们需要获取访问您设备相册的权限,以便您能够选择并上传图片或视频到我们的应用中。", "NSPhotoLibraryAddUsageDescription" : "我们需要获取写入权限,以便我们能够将您通过应用程序拍摄的照片或视频保存到您的设备相册中。", - "NSCameraUsageDescription" : "我们的应用使用摄像头来拍照,以便在进行外勤打卡时确认您的身份和打卡环境,确保打卡数据的真实性和准确性。" + "NSCameraUsageDescription" : "我们的应用使用摄像头来拍照,以便在进行外勤打卡时确认您的身份和打卡环境,确保打卡数据的真实性和准确性。", + "NSMicrophoneUsageDescription" : "我们需要获取您的麦克风权限,以便您能够使用语音方便快捷地输入或发送语音消息。" } }, /* SDK配置 */ diff --git a/pages/index/index.vue b/pages/index/index.vue index b3eda7a..d980c76 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -6,6 +6,7 @@ import { ref, onMounted } from 'vue' import { onExit, onShow } from "@dcloudio/uni-app"; import config from "../../config" import { operateSQLite } from '../../utils/sqlite.js' +import permission from '../../utils/permission.js' onShow(() => { // const { statusBarHeight } = uni.getSystemInfoSync() // const wv1 = plus.webview.getWebviewById("custom-webview"); @@ -55,7 +56,8 @@ const PermissionTips = { "android.permission.CAMERA": "

正在访问相机权限

需要扫描二维码或拍照,是否允许打开相机?", "android.permission.WRITE_EXTERNAL_STORAGE": "

正在读取相册权限

我们需要获取访问您设备相册的权限,以便您能够选择并上传图片或视频到我们的应用中。", "android.permission.ACCESS_FINE_LOCATION": "

正在访问位置权限

需要获取您的位置信息,以便您能够进行考勤打卡。", - "android.permission.ACCESS_COARSE_LOCATION": "

正在访问位置权限

需要获取您的位置信息,以便您能够进行考勤打卡。" + "android.permission.ACCESS_COARSE_LOCATION": "

正在访问位置权限

需要获取您的位置信息,以便您能够进行考勤打卡。", + "android.permission.RECORD_AUDIO": "

正在访问麦克风权限

需要获取您的麦克风权限,以便您能够使用语音方便快捷地输入或发送语音消息。" } onExit(() => { unregisterRequestPermissionTipsListener() @@ -137,6 +139,29 @@ commun.registerHandler('operateSQLite', async (data) => { operateSQLite(data) }) +const handleRequestPerAppMicro = async () => { + const recordStatus = permission.isIOS + ? await permission.requestIOS('record') + : await permission.requestAndroid('android.permission.RECORD_AUDIO') + let allWebview = plus.webview.all() + allWebview.forEach((webview) => { + if (webview.id === 'chat') { + //找到聊天的webview + webview.evalJS( + `handleAppMicro('${recordStatus}')`, + ) + } + }) +} + +commun.registerHandler('handleRequestAndroidPermission', async (data) => { + if (data.type === 'micro') { + handleRequestPerAppMicro() + } else if (data.type === 'settings') { + permission.gotoAppSetting() + } +}) + commun.registerHandler('VideoPicker', async () => { console.error('=======BASE==VideoPicker') console.error(uni.getSystemInfoSync().osName) diff --git a/utils/permission.js b/utils/permission.js new file mode 100644 index 0000000..efc5aae --- /dev/null +++ b/utils/permission.js @@ -0,0 +1,263 @@ +/// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启 + +var isIOS + +function album() { + var result = 0; + var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary"); + var authStatus = PHPhotoLibrary.authorizationStatus(); + if (authStatus === 0) { + result = null; + } else if (authStatus == 3) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(PHPhotoLibrary); + return result; +} + +function camera() { + var result = 0; + var AVCaptureDevice = plus.ios.import("AVCaptureDevice"); + var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); + if (authStatus === 0) { + // uni.chooseImage({ + // count: 1, + // sourceType: ['camera'], + // success: () => {}, + // fail: (err) => { + // if (err.errMsg.includes('authorize:fail')) { + // console.log('用户未授权访问相机'); + // } + // } + // }); + result = null; + } else if (authStatus == 3) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(AVCaptureDevice); + return result; +} + +function location() { + var result = 0; + var cllocationManger = plus.ios.import("CLLocationManager"); + var enable = cllocationManger.locationServicesEnabled(); + var status = cllocationManger.authorizationStatus(); + if (!enable) { + result = 2; + } else if (status === 0) { + result = null; + } else if (status === 3 || status === 4) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(cllocationManger); + return result; +} + +function push() { + var result = 0; + var UIApplication = plus.ios.import("UIApplication"); + var app = UIApplication.sharedApplication(); + var enabledTypes = 0; + if (app.currentUserNotificationSettings) { + var settings = app.currentUserNotificationSettings(); + enabledTypes = settings.plusGetAttribute("types"); + if (enabledTypes == 0) { + result = 0; + console.log("推送权限没有开启"); + } else { + result = 1; + console.log("已经开启推送功能!") + } + plus.ios.deleteObject(settings); + } else { + enabledTypes = app.enabledRemoteNotificationTypes(); + if (enabledTypes == 0) { + result = 3; + console.log("推送权限没有开启!"); + } else { + result = 4; + console.log("已经开启推送功能!") + } + } + plus.ios.deleteObject(app); + plus.ios.deleteObject(UIApplication); + return result; +} + +function contact() { + var result = 0; + var CNContactStore = plus.ios.import("CNContactStore"); + var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0); + if (cnAuthStatus === 0) { + result = null; + } else if (cnAuthStatus == 3) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(CNContactStore); + return result; +} + +function record() { + return new Promise((resolve) => { + // var result = null; + var avaudiosession = plus.ios.import("AVAudioSession"); + var avaudio = avaudiosession.sharedInstance(); + var status = avaudio.recordPermission(); + console.log("permissionStatus:" + status); + if (status === 1970168948) { + avaudio.requestRecordPermission(function(granted) { + plus.ios.deleteObject(avaudiosession); + resolve(record()); + }); + } else { + if (status === 1735552628) { + resolve(1); + } else { + resolve(0); + } + plus.ios.deleteObject(avaudiosession); + // return result; + } + }) +} + +function calendar() { + var result = null; + var EKEventStore = plus.ios.import("EKEventStore"); + var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0); + if (ekAuthStatus == 3) { + result = 1; + console.log("日历权限已经开启"); + } else { + console.log("日历权限没有开启"); + } + plus.ios.deleteObject(EKEventStore); + return result; +} + +function memo() { + var result = null; + var EKEventStore = plus.ios.import("EKEventStore"); + var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1); + if (ekAuthStatus == 3) { + result = 1; + console.log("备忘录权限已经开启"); + } else { + console.log("备忘录权限没有开启"); + } + plus.ios.deleteObject(EKEventStore); + return result; +} + + +function requestIOS(permissionID) { + return new Promise((resolve, reject) => { + switch (permissionID) { + case "push": + resolve(push()); + break; + case "location": + resolve(location()); + break; + case "record": + resolve(record()); + break; + case "camera": + resolve(camera()); + break; + case "album": + resolve(album()); + break; + case "contact": + resolve(contact()); + break; + case "calendar": + resolve(calendar()); + break; + case "memo": + resolve(memo()); + break; + default: + resolve(0); + break; + } + }); +} + +function requestAndroid(permissionID) { + return new Promise((resolve, reject) => { + // console.log(permissionID) + plus.android.requestPermissions( + [permissionID], + function(resultObj) { + var result = 0; + for (var i = 0; i < resultObj.granted.length; i++) { + var grantedPermission = resultObj.granted[i]; + // console.log('已获取的权限:' + grantedPermission); + result = 1 + } + for (var i = 0; i < resultObj.deniedPresent.length; i++) { + var deniedPresentPermission = resultObj.deniedPresent[i]; + console.log('拒绝本次申请的权限:' + deniedPresentPermission); + result = 0 + } + for (var i = 0; i < resultObj.deniedAlways.length; i++) { + var deniedAlwaysPermission = resultObj.deniedAlways[i]; + console.log('永久拒绝申请的权限:' + deniedAlwaysPermission); + result = -1 + } + resolve(result); + }, + function(error) { + console.log('result error: ' + error.message) + resolve({ + code: error.code, + message: error.message + }); + } + ); + }); +} + +function gotoAppPermissionSetting() { + if (permission.isIOS) { + var UIApplication = plus.ios.import("UIApplication"); + var application2 = UIApplication.sharedApplication(); + var NSURL2 = plus.ios.import("NSURL"); + var setting2 = NSURL2.URLWithString("app-settings:"); + application2.openURL(setting2); + plus.ios.deleteObject(setting2); + plus.ios.deleteObject(NSURL2); + plus.ios.deleteObject(application2); + } else { + var Intent = plus.android.importClass("android.content.Intent"); + var Settings = plus.android.importClass("android.provider.Settings"); + var Uri = plus.android.importClass("android.net.Uri"); + var mainActivity = plus.android.runtimeMainActivity(); + var intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + var uri = Uri.fromParts("package", mainActivity.getPackageName(), null); + intent.setData(uri); + mainActivity.startActivity(intent); + } +} + +const permission = { + get isIOS() { + return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios') + }, + requestIOS: requestIOS, + requestAndroid: requestAndroid, + gotoAppSetting: gotoAppPermissionSetting +} + +export default permission \ No newline at end of file