Files
akbleserver/unpackage/dist/dev/.uvue/app-android/ak/PermissionManager.uts.map
2026-03-16 10:37:46 +08:00

1 line
18 KiB
Plaintext

{"version":3,"file":"PermissionManager.uts","sourceRoot":"","sources":["ak/PermissionManager.uts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * PermissionManager.uts\r\n * \r\n * Utility class for managing Android permissions throughout the app\r\n * Handles requesting permissions, checking status, and directing users to settings\r\n */\r\n\r\n/**\r\n * Common permission types that can be requested\r\n */\r\nexport enum PermissionType {\r\n BLUETOOTH = 'bluetooth',\r\n LOCATION = 'location',\r\n STORAGE = 'storage',\r\n CAMERA = 'camera',\r\n MICROPHONE = 'microphone',\r\n NOTIFICATIONS = 'notifications',\r\n CALENDAR = 'calendar',\r\n CONTACTS = 'contacts',\r\n SENSORS = 'sensors'\r\n}\r\n\r\n/**\r\n * Result of a permission request\r\n */\r\ntype PermissionResult = {\r\n granted: boolean;\r\n grantedPermissions: string[];\r\n deniedPermissions: string[];\r\n}\r\n\r\n/**\r\n * Manages permission requests and checks throughout the app\r\n */\r\nexport class PermissionManager {\r\n /**\r\n * Maps permission types to the actual Android permission strings\r\n */\r\n private static getPermissionsForType(type: PermissionType): string[] {\r\n switch (type) {\r\n case PermissionType.BLUETOOTH:\r\n return [\r\n 'android.permission.BLUETOOTH_SCAN',\r\n 'android.permission.BLUETOOTH_CONNECT',\r\n 'android.permission.BLUETOOTH_ADVERTISE'\r\n ];\r\n case PermissionType.LOCATION:\r\n return [\r\n 'android.permission.ACCESS_FINE_LOCATION',\r\n 'android.permission.ACCESS_COARSE_LOCATION'\r\n ];\r\n case PermissionType.STORAGE:\r\n return [\r\n 'android.permission.READ_EXTERNAL_STORAGE',\r\n 'android.permission.WRITE_EXTERNAL_STORAGE'\r\n ];\r\n case PermissionType.CAMERA:\r\n return ['android.permission.CAMERA'];\r\n case PermissionType.MICROPHONE:\r\n return ['android.permission.RECORD_AUDIO'];\r\n case PermissionType.NOTIFICATIONS:\r\n return ['android.permission.POST_NOTIFICATIONS'];\r\n case PermissionType.CALENDAR:\r\n return [\r\n 'android.permission.READ_CALENDAR',\r\n 'android.permission.WRITE_CALENDAR'\r\n ];\r\n case PermissionType.CONTACTS:\r\n return [\r\n 'android.permission.READ_CONTACTS',\r\n 'android.permission.WRITE_CONTACTS'\r\n ];\r\n case PermissionType.SENSORS:\r\n return ['android.permission.BODY_SENSORS'];\r\n default:\r\n return [];\r\n }\r\n }\r\n \r\n /**\r\n * Get appropriate display name for a permission type\r\n */\r\n private static getPermissionDisplayName(type: PermissionType): string {\r\n switch (type) {\r\n case PermissionType.BLUETOOTH:\r\n return '蓝牙';\r\n case PermissionType.LOCATION:\r\n return '位置';\r\n case PermissionType.STORAGE:\r\n return '存储';\r\n case PermissionType.CAMERA:\r\n return '相机';\r\n case PermissionType.MICROPHONE:\r\n return '麦克风';\r\n case PermissionType.NOTIFICATIONS:\r\n return '通知';\r\n case PermissionType.CALENDAR:\r\n return '日历';\r\n case PermissionType.CONTACTS:\r\n return '联系人';\r\n case PermissionType.SENSORS:\r\n return '身体传感器';\r\n default:\r\n return '未知权限';\r\n }\r\n }\r\n \r\n /**\r\n * Check if a permission is granted\r\n * @param type The permission type to check\r\n * @returns True if the permission is granted, false otherwise\r\n */\r\n static isPermissionGranted(type: PermissionType): boolean {\r\n\r\n try {\r\n const permissions = this.getPermissionsForType(type);\r\n const activity = UTSAndroid.getUniActivity();\r\n \r\n if (activity == null || permissions.length === 0) {\r\n return false;\r\n }\r\n \r\n // Check each permission in the group\r\n for (const permission of permissions) {\r\n if (!UTSAndroid.checkSystemPermissionGranted(activity, [permission])) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n } catch (e) {\r\n __f__('error','at ak/PermissionManager.uts:132',`Error checking ${type} permission:`, e);\r\n return false;\r\n }\r\n\r\n \r\n\r\n\r\n\r\n }\r\n \r\n /**\r\n * Request a permission from the user\r\n * @param type The permission type to request\r\n * @param callback Function to call with the result of the permission request\r\n * @param showRationale Whether to show a rationale dialog if permission was previously denied\r\n */\r\n static requestPermission(\r\n type: PermissionType,\r\n callback: (result: PermissionResult) => void,\r\n showRationale: boolean = true\r\n ): void {\r\n\r\n try {\r\n const permissions = this.getPermissionsForType(type);\r\n const activity = UTSAndroid.getUniActivity();\r\n \r\n if (activity == null || permissions.length === 0) {\r\n callback({\r\n granted: false,\r\n grantedPermissions: [],\r\n deniedPermissions: permissions\r\n });\r\n return;\r\n }\r\n \r\n // Check if already granted\r\n let allGranted = true;\r\n for (const permission of permissions) {\r\n if (!UTSAndroid.checkSystemPermissionGranted(activity, [permission])) {\r\n allGranted = false;\r\n break;\r\n }\r\n }\r\n \r\n if (allGranted) {\r\n callback({\r\n granted: true,\r\n grantedPermissions: permissions,\r\n deniedPermissions: []\r\n });\r\n return;\r\n }\r\n \r\n // Request the permissions\r\n UTSAndroid.requestSystemPermission(\r\n activity,\r\n permissions,\r\n (granted: boolean, grantedPermissions: string[]) => {\r\n if (granted) {\r\n callback({\r\n granted: true,\r\n grantedPermissions: grantedPermissions,\r\n deniedPermissions: []\r\n });\r\n } else if (showRationale) {\r\n // Show rationale dialog\r\n this.showPermissionRationale(type, callback);\r\n } else {\r\n // Just report the denial\r\n callback({\r\n granted: false,\r\n grantedPermissions: grantedPermissions,\r\n deniedPermissions: this.getDeniedPermissions(permissions, grantedPermissions)\r\n });\r\n }\r\n },\r\n (denied: boolean, deniedPermissions: string[]) => {\r\n callback({\r\n granted: false,\r\n grantedPermissions: this.getGrantedPermissions(permissions, deniedPermissions),\r\n deniedPermissions: deniedPermissions\r\n });\r\n }\r\n );\r\n } catch (e) {\r\n __f__('error','at ak/PermissionManager.uts:217',`Error requesting ${type} permission:`, e);\r\n callback({\r\n granted: false,\r\n grantedPermissions: [],\r\n deniedPermissions: this.getPermissionsForType(type)\r\n });\r\n }\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n }\r\n \r\n /**\r\n * Show a rationale dialog explaining why the permission is needed\r\n */\r\n private static showPermissionRationale(\r\n type: PermissionType,\r\n callback: (result: PermissionResult) => void\r\n ): void {\r\n const permissionName = this.getPermissionDisplayName(type);\r\n \r\n uni.showModal({\r\n title: '权限申请',\r\n content: `需要${permissionName}权限才能使用相关功能`,\r\n confirmText: '去设置',\r\n cancelText: '取消',\r\n success: (result) => {\r\n if (result.confirm) {\r\n this.openAppSettings();\r\n callback({\r\n granted: false,\r\n grantedPermissions: [],\r\n deniedPermissions: this.getPermissionsForType(type)\r\n });\r\n } else {\r\n callback({\r\n granted: false,\r\n grantedPermissions: [],\r\n deniedPermissions: this.getPermissionsForType(type)\r\n });\r\n }\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * Open the app settings page\r\n */\r\n static openAppSettings(): void {\r\n\r\n try {\r\n const context = UTSAndroid.getAppContext();\r\n if (context != null) {\r\n const intent = new android.content.Intent();\r\n intent.setAction(\"android.settings.APPLICATION_DETAILS_SETTINGS\");\r\n const uri = android.net.Uri.fromParts(\"package\", context.getPackageName(), null);\r\n intent.setData(uri);\r\n intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);\r\n context.startActivity(intent);\r\n }\r\n } catch (e) {\r\n __f__('error','at ak/PermissionManager.uts:285','Failed to open app settings', e);\r\n uni.showToast({\r\n title: '请手动前往系统设置修改应用权限',\r\n icon: 'none',\r\n duration: 3000\r\n });\r\n }\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n }\r\n \r\n /**\r\n * Helper to get the list of granted permissions\r\n */\r\n private static getGrantedPermissions(allPermissions: string[], deniedPermissions: string[]): string[] {\r\n return allPermissions.filter(p => !deniedPermissions.includes(p));\r\n }\r\n \r\n /**\r\n * Helper to get the list of denied permissions\r\n */\r\n private static getDeniedPermissions(allPermissions: string[], grantedPermissions: string[]): string[] {\r\n return allPermissions.filter(p => !grantedPermissions.includes(p));\r\n }\r\n \r\n /**\r\n * Request multiple permission types at once\r\n * @param types Array of permission types to request\r\n * @param callback Function to call when all permissions have been processed\r\n */\r\n static requestMultiplePermissions(\r\n types: PermissionType[],\r\n callback: (results: Map<PermissionType, PermissionResult>) => void\r\n ): void {\r\n if (types.length === 0) {\r\n callback(new Map());\r\n return;\r\n }\r\n \r\n const results = new Map<PermissionType, PermissionResult>();\r\n let remaining = types.length;\r\n \r\n for (const type of types) {\r\n this.requestPermission(\r\n type,\r\n (result) => {\r\n results.set(type, result);\r\n remaining--;\r\n \r\n if (remaining === 0) {\r\n callback(results);\r\n }\r\n },\r\n true\r\n );\r\n }\r\n }\r\n \r\n /**\r\n * Convenience method to request Bluetooth permissions\r\n * @param callback Function to call after the permission request\r\n */\r\n static requestBluetoothPermissions(callback: (granted: boolean) => void): void {\r\n this.requestPermission(PermissionType.BLUETOOTH, (result) => {\r\n // For Bluetooth, we also need location permissions on Android\r\n if (result.granted) {\r\n this.requestPermission(PermissionType.LOCATION, (locationResult) => {\r\n callback(locationResult.granted);\r\n });\r\n } else {\r\n callback(false);\r\n }\r\n });\r\n }\r\n}"]}