YYPOST群发软件 发表于 3 天前

AIWROK软件权限管理器实现

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;
            try {
                if (typeof originalPermissionManger === 'function') {
                  permissionManger = originalPermissionManger;
                }
            } catch (e) {
                // 忽略无法复制的方法
            }
      }
    }
} catch (e) {
    // 如果复制过程中出错,继续执行
}

// 代理函数生成器 - 用于创建代理方法
function createProxyMethod(methodName, fallback) {
    return function() {
      try {
            // 如果originalPermissionManger存在且有对应的方法,则调用它
            if (typeof originalPermissionManger !== 'undefined' &&
                typeof originalPermissionManger === 'function') {
                var result = originalPermissionManger.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 === 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;
      try {
            if (typeof permissionManger === 'function') {
                // 对于带参数的方法,传递一个测试参数
                var result;
                if (method === 'requestPremission' || method === 'requestPermission') {
                  result = permissionManger('test_param');
                } else {
                  result = permissionManger();
                }
                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)以提高兼容性


页: [1]
查看完整版本: AIWROK软件权限管理器实现