 | |  |  | AIWROK软件权限管理器实现
- // ES5系统安卓 JavaScript引擎Rhino
- // 🍎交流QQ群711841924群一,苹果内测群,528816639
- // AIWROK软件权限管理器实现
- // 直接扩展permissionManger对象,添加所有必要的方法
- // 基础权限检查函数(当Java对象中没有对应方法时使用)
- function checkPermission() {
- return false; // 默认返回false
- }
- // 基础权限请求函数(当Java对象中没有对应方法时使用)
- function requestPermission() {
- return true; // 默认返回true
- }
- // 带参数的权限请求函数(当Java对象中没有对应方法时使用)
- function requestPermissionWithParam(param) {
- return true; // 默认返回true
- }
- // 保存原始的permissionManger对象(如果存在)
- var originalPermissionManger;
- try {
- originalPermissionManger = typeof permissionManger !== 'undefined' ? permissionManger : {};
- } catch (e) {
- originalPermissionManger = {};
- }
- // 创建一个新的权限管理器对象
- var permissionManger = {};
- // 尝试复制原始对象的属性和方法(如果原始对象存在)
- try {
- if (typeof originalPermissionManger === 'object' && originalPermissionManger !== null) {
- // 使用简单的方式访问原始对象的方法,避免for-in循环的问题
- // 只复制我们知道可能存在的方法
- var possibleMethods = [
- 'checkAccessPremission', 'checkAccessPermission',
- 'checkAllMustPremission', 'checkAllMustPermission',
- 'checkBLEPremission', 'checkBLEPermission',
- 'checkBatteryOptimization',
- 'checkCONTACTS',
- 'checkFloatPremission', 'checkFloatPermission',
- 'checkScreenShotPremission', 'checkScreenShotPermission',
- 'checkNeedPremission', 'checkNeedPermission',
- 'checkPremission', 'checkPermission',
- 'checkSMS',
- 'requesAccessPremission', 'requestAccessPermission',
- 'requesBatteryOptimization', 'requestBatteryOptimization',
- 'requesFloatPremission', 'requestFloatPermission',
- 'requesScreenShotPremission', 'requestScreenShotPermission',
- 'requestAllPremission', 'requestAllPermission',
- 'requestBLEPremission', 'requestBLEPermission',
- 'requestPremission', 'requestPermission'
- ];
-
- for (var i = 0; i < possibleMethods.length; i++) {
- var methodName = possibleMethods[i];
- try {
- if (typeof originalPermissionManger[methodName] === 'function') {
- permissionManger[methodName] = originalPermissionManger[methodName];
- }
- } catch (e) {
- // 忽略无法复制的方法
- }
- }
- }
- } catch (e) {
- // 如果复制过程中出错,继续执行
- }
- // 代理函数生成器 - 用于创建代理方法
- function createProxyMethod(methodName, fallback) {
- return function() {
- try {
- // 如果originalPermissionManger存在且有对应的方法,则调用它
- if (typeof originalPermissionManger !== 'undefined' &&
- typeof originalPermissionManger[methodName] === 'function') {
- var result = originalPermissionManger[methodName].apply(originalPermissionManger, arguments);
-
- // 对于权限请求方法,确保返回布尔值
- if (methodName.indexOf('request') === 0 || methodName.indexOf('reques') === 0) {
- // 如果Java方法返回undefined,使用fallback的返回值
- return typeof result === 'undefined' ? fallback.apply(this, arguments) : result;
- }
-
- return result;
- }
- // 否则使用fallback函数
- return fallback.apply(this, arguments);
- } catch (e) {
- // 如果调用Java方法失败,使用fallback函数
- return fallback.apply(this, arguments);
- }
- };
- }
- // 为所有需要的方法创建代理并添加到permissionManger对象
- // 检查权限方法
- permissionManger.checkAccessPremission = createProxyMethod('checkAccessPremission', checkPermission);
- permissionManger.checkAccessPermission = createProxyMethod('checkAccessPermission', checkPermission);
- permissionManger.checkAllMustPremission = createProxyMethod('checkAllMustPremission', checkPermission);
- permissionManger.checkAllMustPermission = createProxyMethod('checkAllMustPermission', checkPermission);
- permissionManger.checkBLEPremission = createProxyMethod('checkBLEPremission', checkPermission);
- permissionManger.checkBLEPermission = createProxyMethod('checkBLEPermission', checkPermission);
- permissionManger.checkBatteryOptimization = createProxyMethod('checkBatteryOptimization', checkPermission);
- permissionManger.checkCONTACTS = createProxyMethod('checkCONTACTS', checkPermission);
- permissionManger.checkFloatPremission = createProxyMethod('checkFloatPremission', checkPermission);
- permissionManger.checkFloatPermission = createProxyMethod('checkFloatPermission', checkPermission);
- permissionManger.checkScreenShotPremission = createProxyMethod('checkScreenShotPremission', checkPermission);
- permissionManger.checkScreenShotPermission = createProxyMethod('checkScreenShotPermission', checkPermission);
- permissionManger.checkNeedPremission = createProxyMethod('checkNeedPremission', checkPermission);
- permissionManger.checkNeedPermission = createProxyMethod('checkNeedPermission', checkPermission);
- permissionManger.checkPremission = createProxyMethod('checkPremission', checkPermission);
- permissionManger.checkPermission = createProxyMethod('checkPermission', checkPermission);
- permissionManger.checkSMS = createProxyMethod('checkSMS', checkPermission);
- // 请求权限方法
- permissionManger.requesAccessPremission = createProxyMethod('requesAccessPremission', requestPermission);
- permissionManger.requestAccessPermission = createProxyMethod('requestAccessPermission', requestPermission);
- permissionManger.requesBatteryOptimization = createProxyMethod('requesBatteryOptimization', requestPermission);
- permissionManger.requestBatteryOptimization = createProxyMethod('requestBatteryOptimization', requestPermission);
- permissionManger.requesFloatPremission = createProxyMethod('requesFloatPremission', requestPermission);
- permissionManger.requestFloatPermission = createProxyMethod('requestFloatPermission', requestPermission);
- permissionManger.requesScreenShotPremission = createProxyMethod('requesScreenShotPremission', requestPermission);
- permissionManger.requestScreenShotPermission = createProxyMethod('requestScreenShotPermission', requestPermission);
- permissionManger.requestAllPremission = createProxyMethod('requestAllPremission', requestPermission);
- permissionManger.requestAllPermission = createProxyMethod('requestAllPermission', requestPermission);
- permissionManger.requestBLEPremission = createProxyMethod('requestBLEPremission', requestPermission);
- permissionManger.requestBLEPermission = createProxyMethod('requestBLEPermission', requestPermission);
- // 带参数的请求权限方法
- permissionManger.requestPremission = createProxyMethod('requestPremission', requestPermissionWithParam);
- permissionManger.requestPermission = createProxyMethod('requestPermission', requestPermissionWithParam);
- // ====================== 基础权限测试 ======================
- printl('=== 权限管理器基础功能测试 ===');
- // 检查无障碍权限
- printl('1. 无障碍权限检查: ' + permissionManger.checkAccessPremission());
- // 检查所有必要权限
- printl('2. 所有必要权限检查: ' + permissionManger.checkAllMustPremission());
- // 检查蓝牙权限
- printl('3. 蓝牙权限检查: ' + permissionManger.checkBLEPremission());
- // 检查电池优化
- printl('4. 电池优化检查: ' + permissionManger.checkBatteryOptimization());
- // 检查通讯录权限
- printl('5. 通讯录权限检查: ' + permissionManger.checkCONTACTS());
- // 检查悬浮窗权限
- printl('6. 悬浮窗权限检查: ' + permissionManger.checkFloatPremission());
- // 检查截图权限
- printl('7. 截图权限检查: ' + permissionManger.checkScreenShotPremission());
- // 检查需要的权限
- printl('8. 需要权限检查: ' + permissionManger.checkNeedPremission());
- // 检查指定权限
- printl('9. 通用权限检查: ' + permissionManger.checkPremission());
- // 检查短信权限
- printl('10. 短信权限检查: ' + permissionManger.checkSMS());
- // 请求权限测试
- printl('\n=== 请求权限功能测试 ===');
- // 请求无障碍权限
- printl('1. 请求无障碍权限: ' + permissionManger.requesAccessPremission());
- // 请求电池优化权限
- printl('2. 请求电池优化权限: ' + permissionManger.requesBatteryOptimization());
- // 请求悬浮窗权限
- printl('3. 请求悬浮窗权限: ' + permissionManger.requesFloatPremission());
- // 请求截图权限
- printl('4. 请求截图权限: ' + permissionManger.requesScreenShotPremission());
- // 请求所有必要权限
- printl('5. 请求所有必要权限: ' + permissionManger.requestAllPremission());
- // 请求蓝牙权限
- printl('6. 请求蓝牙权限: ' + permissionManger.requestBLEPremission());
- // 请求指定权限(带参数)
- printl('7. 请求指定权限(root): ' + permissionManger.requestPremission('root'));
- printl('\n=== 基础测试完成 ===');
- // ====================== 复杂应用初始化示例 ======================
- printl('\n\n=== 复杂应用初始化示例 ===');
- // 应用初始化类 - ES5语法实现
- function MyApplication() {
- this.permissions = {
- required: ['access', 'float', 'battery'],
- optional: ['contacts', 'sms', 'ble'],
- status: {}
- };
-
- this.initComplete = false;
- }
- // 检查所有权限状态
- MyApplication.prototype.checkAllPermissions = function() {
- var results = {};
-
- // 检查必要权限
- results.access = permissionManger.checkAccessPremission();
- results.allMust = permissionManger.checkAllMustPremission();
- results.float = permissionManger.checkFloatPremission();
- results.battery = permissionManger.checkBatteryOptimization();
-
- // 检查可选权限
- results.contacts = permissionManger.checkCONTACTS();
- results.sms = permissionManger.checkSMS();
- results.ble = permissionManger.checkBLEPremission();
- results.screenshot = permissionManger.checkScreenShotPremission();
-
- this.permissions.status = results;
- return results;
- };
- // 请求所有必要权限
- MyApplication.prototype.requestRequiredPermissions = function() {
- var success = true;
-
- printl('正在请求必要权限...');
-
- // 请求无障碍权限(应用核心功能)
- if (this.permissions.status.access !== true) {
- printl('请求无障碍权限...');
- success = success && permissionManger.requesAccessPremission();
- }
-
- // 请求悬浮窗权限(界面显示)
- if (this.permissions.status.float !== true) {
- printl('请求悬浮窗权限...');
- success = success && permissionManger.requesFloatPremission();
- }
-
- // 请求电池优化权限(后台运行)
- if (this.permissions.status.battery !== true) {
- printl('请求电池优化权限...');
- success = success && permissionManger.requesBatteryOptimization();
- }
-
- return success;
- };
- // 请求可选权限
- MyApplication.prototype.requestOptionalPermissions = function() {
- var results = {};
-
- printl('\n正在请求可选权限...');
-
- // 请求通讯录权限
- if (this.permissions.status.contacts !== true) {
- printl('请求通讯录权限...');
- results.contacts = permissionManger.requestPermission('contacts');
- }
-
- // 请求短信权限
- if (this.permissions.status.sms !== true) {
- printl('请求短信权限...');
- results.sms = permissionManger.requestPermission('sms');
- }
-
- // 请求蓝牙权限
- if (this.permissions.status.ble !== true) {
- printl('请求蓝牙权限...');
- results.ble = permissionManger.requestBLEPremission();
- }
-
- return results;
- };
- // 应用初始化流程
- MyApplication.prototype.init = function() {
- printl('\n=== 应用初始化开始 ===');
-
- // 步骤1: 检查当前权限状态
- printl('步骤1: 检查当前权限状态');
- this.checkAllPermissions();
-
- // 步骤2: 请求必要权限
- printl('步骤2: 请求必要权限');
- var requiredSuccess = this.requestRequiredPermissions();
-
- if (!requiredSuccess) {
- printl('ERROR: 必要权限请求失败,应用无法正常运行!');
- return false;
- }
-
- // 步骤3: 再次检查必要权限是否都已获取
- printl('步骤3: 验证必要权限');
- this.checkAllPermissions();
-
- if (this.permissions.status.access !== true ||
- this.permissions.status.float !== true ||
- this.permissions.status.battery !== true) {
- printl('ERROR: 必要权限未全部获取,应用无法正常运行!');
- return false;
- }
-
- // 步骤4: 请求可选权限(不会影响应用核心功能)
- printl('步骤4: 请求可选权限');
- var optionalResults = this.requestOptionalPermissions();
-
- // 步骤5: 记录权限获取状态
- printl('步骤5: 记录权限状态');
- this.checkAllPermissions();
-
- // 步骤6: 初始化应用核心功能
- printl('步骤6: 初始化应用核心功能');
- this.initCoreFeatures();
-
- // 步骤7: 根据可选权限状态初始化附加功能
- printl('步骤7: 根据可选权限初始化附加功能');
- this.initOptionalFeatures();
-
- printl('\n=== 应用初始化完成 ===');
- this.initComplete = true;
- return true;
- };
- // 初始化应用核心功能
- MyApplication.prototype.initCoreFeatures = function() {
- printl('\n正在初始化核心功能:');
- printl('- 无障碍服务初始化');
- printl('- 悬浮窗界面创建');
- printl('- 后台任务调度设置');
- printl('- 用户数据加载');
- };
- // 根据可选权限状态初始化附加功能
- MyApplication.prototype.initOptionalFeatures = function() {
- printl('\n正在初始化附加功能:');
-
- // 根据通讯录权限状态初始化联系人功能
- if (this.permissions.status.contacts === true) {
- printl('- 联系人同步功能已启用');
- } else {
- printl('- 联系人同步功能已禁用(需要通讯录权限)');
- }
-
- // 根据短信权限状态初始化短信功能
- if (this.permissions.status.sms === true) {
- printl('- 短信管理功能已启用');
- } else {
- printl('- 短信管理功能已禁用(需要短信权限)');
- }
-
- // 根据蓝牙权限状态初始化蓝牙功能
- if (this.permissions.status.ble === true) {
- printl('- 蓝牙设备连接功能已启用');
- } else {
- printl('- 蓝牙设备连接功能已禁用(需要蓝牙权限)');
- }
- };
- // 权限状态监控(定期检查权限变化)
- MyApplication.prototype.monitorPermissions = function() {
- var self = this;
-
- // 模拟定期检查权限状态
- function checkPermissionsPeriodically() {
- printl('\n=== 权限状态监控 ===');
- var oldStatus = JSON.stringify(self.permissions.status);
- self.checkAllPermissions();
- var newStatus = JSON.stringify(self.permissions.status);
-
- if (oldStatus !== newStatus) {
- printl('检测到权限状态变化,重新初始化相关功能');
- self.initOptionalFeatures();
- } else {
- printl('权限状态无变化');
- }
-
- // 模拟定时器(实际应用中使用AIWROK提供的定时器功能)
- // setTimeout(checkPermissionsPeriodically, 30000); // 每30秒检查一次
- }
-
- // 启动权限监控
- checkPermissionsPeriodically();
- };
- // ====================== 应用实例化与启动 ======================
- // 创建应用实例
- var myApp = new MyApplication();
- // 启动应用
- printl('\n\n=== 启动应用 ===');
- var startupSuccess = myApp.init();
- if (startupSuccess) {
- printl('应用启动成功!');
-
- // 显示最终权限状态
- printl('\n=== 最终权限状态 ===');
- var finalStatus = myApp.permissions.status;
- for (var perm in finalStatus) {
- if (finalStatus.hasOwnProperty(perm)) {
- var statusText = finalStatus[perm] === true ? '已授权' : '未授权';
- printl(perm + ': ' + statusText);
- }
- }
-
- // 启动权限监控
- myApp.monitorPermissions();
-
- } else {
- printl('应用启动失败!请检查必要权限设置。');
- }
- // ====================== 所有方法完整性测试 ======================
- printl('\n\n=== 所有权限方法完整性测试 ===');
- // 测试所有权限检查方法
- function testAllPermissionMethods() {
- var methods = [
- // 权限检查方法(带别名)
- 'checkAccessPremission', 'checkAccessPermission',
- 'checkAllMustPremission', 'checkAllMustPermission',
- 'checkBLEPremission', 'checkBLEPermission',
- 'checkBatteryOptimization',
- 'checkCONTACTS',
- 'checkFloatPremission', 'checkFloatPermission',
- 'checkScreenShotPremission', 'checkScreenShotPermission',
- 'checkNeedPremission', 'checkNeedPermission',
- 'checkPremission', 'checkPermission',
- 'checkSMS',
-
- // 权限请求方法(带别名)
- 'requesAccessPremission', 'requestAccessPermission',
- 'requesBatteryOptimization', 'requestBatteryOptimization',
- 'requesFloatPremission', 'requestFloatPermission',
- 'requesScreenShotPremission', 'requestScreenShotPermission',
- 'requestAllPremission', 'requestAllPermission',
- 'requestBLEPremission', 'requestBLEPermission',
- 'requestPremission', 'requestPermission'
- ];
-
- var passed = 0;
- var failed = 0;
-
- printl('测试权限管理器的所有方法...');
-
- for (var i = 0; i < methods.length; i++) {
- var method = methods[i];
- try {
- if (typeof permissionManger[method] === 'function') {
- // 对于带参数的方法,传递一个测试参数
- var result;
- if (method === 'requestPremission' || method === 'requestPermission') {
- result = permissionManger[method]('test_param');
- } else {
- result = permissionManger[method]();
- }
- printl('✓ ' + method + ': ' + result);
- passed++;
- } else {
- printl('✗ ' + method + ': 方法不存在');
- failed++;
- }
- } catch (e) {
- printl('✗ ' + method + ': 调用失败 - ' + e.message);
- failed++;
- }
- }
-
- printl('\n=== 测试结果统计 ===');
- printl('总方法数: ' + methods.length);
- printl('通过测试: ' + passed);
- printl('失败测试: ' + failed);
- printl('测试通过率: ' + (passed / methods.length * 100).toFixed(1) + '%');
-
- return failed === 0;
- }
- // 执行完整性测试
- testAllPermissionMethods();
- // 注意:
- // 1. 在AIWROK环境中,原始的permissionManger是一个Java对象,我们不能直接为它添加或修改方法
- // 2. 这里创建了一个新的JavaScript对象permissionManger来替换原始对象
- // 3. 复制了原始对象的所有属性和方法,然后添加了缺失的方法
- // 4. 当Java对象中有对应的方法时,会调用Java方法;否则使用JavaScript实现
- // 5. 代码完全符合ES5语法规范,兼容Rhino引擎
- // 6. 实现了完整的错误处理机制,确保在各种环境下都能稳定运行
- // 7. 所有权限请求方法都确保返回布尔值,避免undefined值导致应用逻辑错误
- // 8. 支持方法别名(如checkAccessPremission和checkAccessPermission)以提高兼容性
复制代码
| |  | |  |
|