AIWROK设备信息与权限检测

455

主题

212

回帖

2759

积分

管理员

积分
2759
AIWROK设备信息与权限检测

QQ截图20260917105854.png


QQ截图20260917105843.png


QQ截图20260917105834.png


QQ截图20260915144052.png


  1.   /**
  2.    * AIWROK 设备信息与权限检测
  3.    * 功能:获取设备基本信息、检测权限、列出已安装应用
  4.    */
  5.   
  6.   // ======================== 设备信息 ========================
  7.   
  8.   function getDeviceInfo() {
  9.       printl("================ 设备信息 ================");
  10.   
  11.       // 屏幕信息
  12.       var width = screen.getScreenWidth();
  13.       var height = screen.getScreenHeight();
  14.       printl("屏幕分辨率: " + width + " x " + height);
  15.   
  16.       // DPI
  17.       var dpi = context.getResources().getDisplayMetrics().densityDpi;
  18.       printl("屏幕DPI: " + dpi);
  19.       printl("屏幕密度: " + (dpi / 160).toFixed(2));
  20.   
  21.       // 系统信息
  22.       importClass(android.os.Build);
  23.       printl("设备品牌: " + Build.BRAND);
  24.       printl("设备型号: " + Build.MODEL);
  25.       printl("产品名称: " + Build.PRODUCT);
  26.       printl("Android版本: " + Build.VERSION.RELEASE);
  27.       printl("SDK版本: " + Build.VERSION.SDK_INT);
  28.       // SUPPORTED_ABIS 返回数组对象,手动拼接
  29.       var abis = Build.SUPPORTED_ABIS;
  30.       var abiStr = "";
  31.       for (var i = 0; i < abis.length; i++) {
  32.           if (i > 0) abiStr += ", ";
  33.           abiStr += abis[i];
  34.       }
  35.       printl("CPU架构: " + abiStr);
  36.   
  37.       // 内存信息
  38.       try {
  39.           importClass(android.app.ActivityManager);
  40.           var am = context.getSystemService(context.ACTIVITY_SERVICE);
  41.           var memInfo = new ActivityManager.MemoryInfo();
  42.           am.getMemoryInfo(memInfo);
  43.           var totalMemGB = memInfo.totalMem / (1024 * 1024 * 1024);
  44.           var availMemGB = memInfo.availMem / (1024 * 1024 * 1024);
  45.           printl("总内存: " + totalMemGB.toFixed(2) + " GB");
  46.           printl("可用内存: " + availMemGB.toFixed(2) + " GB");
  47.       } catch (e) {
  48.           printl("内存信息获取失败: " + e.message);
  49.       }
  50.   
  51.       // 存储信息(StatFs 在 Android 10+ 上可能有权限问题,加 try-catch)
  52.       try {
  53.           importClass(android.os.Environment);
  54.           var sdPath = Environment.getExternalStorageDirectory().getPath();
  55.           var statFs = new android.os.StatFs(sdPath);
  56.           var totalSdGB = statFs.getTotalBytes() / (1024 * 1024 * 1024);
  57.           var availSdGB = statFs.getAvailableBytes() / (1024 * 1024 * 1024);
  58.           printl("SD卡总量: " + totalSdGB.toFixed(2) + " GB");
  59.           printl("SD卡可用: " + availSdGB.toFixed(2) + " GB");
  60.       } catch (e) {
  61.           printl("SD卡信息获取失败(Android 10+ 分区存储限制)");
  62.       }
  63.   
  64.       // 网络类型
  65.       try {
  66.           importClass(android.net.ConnectivityManager);
  67.           var cm = context.getSystemService(context.CONNECTIVITY_SERVICE);
  68.           var networkInfo = cm.getActiveNetworkInfo();
  69.           if (networkInfo) {
  70.               var typeName = networkInfo.getTypeName();
  71.               var subtypeName = networkInfo.getSubtypeName();
  72.               printl("网络类型: " + typeName + " " + (subtypeName || ""));
  73.               printl("网络是否可用: " + networkInfo.isAvailable());
  74.           } else {
  75.               printl("网络类型: 无网络");
  76.           }
  77.       } catch (e) {
  78.           printl("网络信息获取失败: " + e.message);
  79.       }
  80.   
  81.       // WiFi状态
  82.       try {
  83.           importClass(android.net.wifi.WifiManager);
  84.           var wm = context.getSystemService(context.WIFI_SERVICE);
  85.           printl("WiFi是否开启: " + wm.isWifiEnabled());
  86.       } catch (e) {}
  87.   
  88.       // 电量信息
  89.       try {
  90.           importClass(android.content.IntentFilter);
  91.           var ifilter = new IntentFilter();
  92.           ifilter.addAction(Intent.ACTION_BATTERY_CHANGED);
  93.           var batteryInfo = context.registerReceiver(null, ifilter);
  94.           if (batteryInfo) {
  95.               var level = batteryInfo.getIntExtra("level", 0);
  96.               var scale = batteryInfo.getIntExtra("scale", 100);
  97.               var percent = Math.round(level * 100 / scale);
  98.               var plugged = batteryInfo.getIntExtra("plugged", 0);
  99.               var pluggedStr = plugged == 0 ? "未充电" : (plugged == 1 ? "USB充电" : (plugged == 2 ? "交流充电" : "其他"));
  100.               printl("电量: " + percent + "%");
  101.               printl("充电状态: " + pluggedStr);
  102.           }
  103.       } catch (e) {}
  104.   }
  105.   
  106.   // ======================== 权限检测 ========================
  107.   
  108.   function checkPermissions() {
  109.       printl("\n================ 权限检测 ================");
  110.   
  111.       var permissions = [
  112.           { name: "读取存储", permission: "android.permission.READ_EXTERNAL_STORAGE" },
  113.           { name: "写入存储", permission: "android.permission.WRITE_EXTERNAL_STORAGE" },
  114.           { name: "悬浮窗", permission: "android.permission.SYSTEM_ALERT_WINDOW" },
  115.           { name: "无障碍", permission: "android.permission.BIND_ACCESSIBILITY_SERVICE" },
  116.           { name: "相机", permission: "android.permission.CAMERA" },
  117.           { name: "录音", permission: "android.permission.RECORD_AUDIO" },
  118.           { name: "网络访问", permission: "android.permission.INTERNET" },
  119.           { name: "震动", permission: "android.permission.VIBRATE" },
  120.           { name: "开机自启", permission: "android.permission.RECEIVE_BOOT_COMPLETED" },
  121.           { name: "前台服务", permission: "android.permission.FOREGROUND_SERVICE" }
  122.       ];
  123.   
  124.       importClass(android.content.pm.PackageManager);
  125.       var pm = context.getPackageManager();
  126.       var grantedCount = 0;
  127.   
  128.       for (var i = 0; i < permissions.length; i++) {
  129.           var p = permissions[i];
  130.           var granted = pm.checkPermission(p.permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED;
  131.           var status = granted ? "✓ 已授权" : "✗ 未授权";
  132.           printl("  " + status + "  " + p.name);
  133.           if (granted) grantedCount++;
  134.       }
  135.   
  136.       printl("\n已授权: " + grantedCount + "/" + permissions.length);
  137.   }
  138.   
  139.   // ======================== 应用列表 ========================
  140.   
  141.   function listInstalledApps() {
  142.       printl("\n================ 已安装应用 ================");
  143.   
  144.       importClass(android.content.Intent);
  145.   
  146.       var mainIntent = new Intent(Intent.ACTION_MAIN, null);
  147.       mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  148.       var pm = context.getPackageManager();
  149.       var resolveList = pm.queryIntentActivities(mainIntent, 0);
  150.   
  151.       printl("共 " + resolveList.size() + " 个应用\n");
  152.   
  153.       // 只显示前 20 个
  154.       var count = Math.min(resolveList.size(), 20);
  155.       for (var i = 0; i < count; i++) {
  156.           var info = resolveList.get(i);
  157.           var name = info.loadLabel(pm).toString();
  158.           var pkg = info.activityInfo.packageName;
  159.           printl("  " + (i + 1) + ". " + name + " (" + pkg + ")");
  160.       }
  161.   
  162.       if (resolveList.size() > 20) {
  163.           printl("  ... 还有 " + (resolveList.size() - 20) + " 个应用");
  164.       }
  165.   }
  166.   
  167.   // ======================== IP地址 ========================
  168.   
  169.   function getLocalIP() {
  170.       printl("\n================ IP地址 ================");
  171.   
  172.       try {
  173.           importClass(java.net.NetworkInterface);
  174.           importClass(java.util.Collections);
  175.   
  176.           // 把 Enumeration 转成 List 再遍历(Rhino 兼容)
  177.           var nisList = Collections.list(NetworkInterface.getNetworkInterfaces());
  178.           for (var i = 0; i < nisList.size(); i++) {
  179.               var ni = nisList.get(i);
  180.               var addrsList = Collections.list(ni.getInetAddresses());
  181.               for (var j = 0; j < addrsList.size(); j++) {
  182.                   var addr = addrsList.get(j);
  183.                   var addrStr = addr.getHostAddress();
  184.                   if (!addr.isLoopbackAddress() && addrStr.indexOf(":") < 0) {
  185.                       printl("接口: " + ni.getName() + " | IP: " + addrStr);
  186.                   }
  187.               }
  188.           }
  189.       } catch (e) {
  190.           printl("IP获取失败: " + e.message);
  191.       }
  192.   }
  193.   
  194.   // ======================== 主程序 ========================
  195.   
  196.   function main() {
  197.       printl("╔══════════════════════════════════════════════╗");
  198.       printl("║       AIWROK 设备信息与权限检测               ║");
  199.       printl("╚══════════════════════════════════════════════╝");
  200.       sleep.millisecond(600);
  201.   
  202.       printl("\n⏳ 正在采集设备硬件信息...");
  203.       sleep.millisecond(500);
  204.       getDeviceInfo();
  205.       sleep.millisecond(1200);
  206.   
  207.       printl("\n⏳ 正在检测应用权限状态...");
  208.       sleep.millisecond(500);
  209.       checkPermissions();
  210.       sleep.millisecond(1200);
  211.   
  212.       printl("\n⏳ 正在扫描已安装应用...");
  213.       sleep.millisecond(500);
  214.       listInstalledApps();
  215.       sleep.millisecond(1200);
  216.   
  217.       printl("\n⏳ 正在获取网络接口信息...");
  218.       sleep.millisecond(500);
  219.       getLocalIP();
  220.       sleep.millisecond(600);
  221.   
  222.       printl("\n╔══════════════════════════════════════════════╗");
  223.       printl("║              检测完成!                       ║");
  224.       printl("╚══════════════════════════════════════════════╝");
  225.   }
  226.   
  227.   main();
复制代码


举报 回复