电量伪装

android.os.ServiceManager.getService("batterystats").setBatteryLevel(250, true); 
// 伪装指定电量,强制更新

充电伪装

android.os.ServiceManager.getService("batterystats").unplugBattery(true);
//伪装成未充电

恢复伪装

android.os.ServiceManager.getService("batterystats").resetBattery(true);
// 一键恢复伪装

充电判断

android.os.ServiceManager.getService("batterystats").isCharging();
// 判断是否充电

通知清除

android.os.ServiceManager.getService("statusbar").onClearAllNotifications(0);
// 清除指定用户的所有通知

定位判断

android.os.ServiceManager.getService("location").isLocationEnabledForUser(0);
// 判断指定用户定位是否开启

蓝牙判断

android.os.ServiceManager.getService("bluetooth_manager").getState() == 12;
// 判断蓝牙是否开启

禁用屏幕截图

android.os.ServiceManager.getService("device_policy").setScreenCaptureDisabled(null, "android", true, false);
// 禁用屏幕截图

启用屏幕截图

android.os.ServiceManager.getService("device_policy").setScreenCaptureDisabled(null, "android", false, false);
// 启用屏幕截图

屏幕截图状态

android.os.ServiceManager.getService("device_policy").getScreenCaptureDisabled(null, 0, false);
// 判断屏幕截图是否禁用

密码错误次数

Service = android.os.ServiceManager.getService("device_policy");

if (android.os.Build.VERSION.SDK_INT > 33) {
    Service.getCurrentFailedPasswordAttempts("android", 0, true);
} else {
    Service.getCurrentFailedPasswordAttempts(0, true);
}
// 获取锁屏密码错误次数

获取最近按键码

android.os.ServiceManager.getService("statusbar").getLastSystemKey();
// 获取最近按键事件的按键码

阻止应用卸载

android.os.ServiceManager.getService("package").setBlockUninstallForUser("tornaco.apps.shortx", true, 0)
// 阻止指定用户指定包名的卸载

清除应用缓存数据

android.os.ServiceManager.getService("package").deleteApplicationCacheFilesAsUser("包名", 0, null)
// 清除指定用户的指定包名的缓存数据

清除应用全部数据

android.os.ServiceManager.getService("package").clearApplicationUserData("包名", null, 0)
// 清除指定用户的指定包名的全部数据

无锁屏状态

android.os.ServiceManager.getService("lock_settings").getBoolean("lockscreen.disabled", true, 0)
// 获取指定用户是否为无锁屏

设置无锁屏

android.os.ServiceManager.getService("lock_settings").setBoolean("lockscreen.disabled", true, 0)
// 设置指定用户为无锁屏
// 无锁屏!=滑动

热点判断

android.os.ServiceManager.getService("wifi").getWifiApEnabledState() == 13;
// 获取热点是否开启

关机

android.os.ServiceManager.getService("power").shutdown(false, null, true);
// 关机

获取导航栏模式

m=android.os.ServiceManager.getService("statusbar").getNavBarMode();
m==0?"手势导航":m==1?"三段式导航":"未知:"+m;
// 获取导航栏模式

设置导航栏模式

android.os.ServiceManager.getService("statusbar").setNavBarMode(1);
// 1代表三段式导航栏
// 0代表手势导航

弹出输入法选择器

android.os.ServiceManager.getService("input_method").showInputMethodPickerFromSystem(0 ,0);
// 调用输入法选择器

隐藏应用

android.os.ServiceManager.getService("package").setApplicationHiddenSettingAsUser("包名", true, 0);
// (伪装卸载,尽量让别的软件扫不到,额外会冻结应用)!
// 设置隐藏指定用户的指定包名应用 
// 这个隐藏应用还挺神奇的,隐藏后真的在各大软件应用列表搜不到这个应用了,感觉好像真的被卸载了一样。🫡

取消隐藏应用

android.os.ServiceManager.getService("package").setApplicationHiddenSettingAsUser("包名", false, 0);
// 设置取消隐藏指定用户的指定包名应用

获取应用隐藏状态

android.os.ServiceManager.getService("package").getApplicationHiddenSettingAsUser("包名", 0);
// 获取隐藏指定用户的指定包名应用状态

获取应用防卸载状态

android.os.ServiceManager.getService("package").getBlockUninstallForUser("包名", true, 0)
// 获取阻止指定用户指定包名的卸载状态

获取应用冻结状态

android.os.ServiceManager.getService("package").isPackageAvailable("包名", 0)
// 获取指定用户指定包名的冻结状态

获取剪贴板访问通知的状态

android.os.ServiceManager.getService("clipboard").areClipboardAccessNotificationsEnabledForUser(0);
// 获取指定用户剪贴板访问通知是否启用
// 例如已将剪贴板中内容粘贴到**的吐司通知

关闭剪贴板访问通知

android.os.ServiceManager.getService("clipboard").setClipboardAccessNotificationsEnabledForUser(false, 0);
// 设置指定用户剪贴板访问通知关闭
// 例如已将剪贴板中内容粘贴到**的吐司通知

开启剪贴板访问通知

android.os.ServiceManager.getService("clipboard").setClipboardAccessNotificationsEnabledForUser(true, 0);
// 设置指定用户剪贴板访问通知开启
// 例如已将剪贴板中内容粘贴到**的吐司通知

获取USB功能启用状态

android.os.ServiceManager.getService("usb").isFunctionEnabled("adb");
 /*
rndis → USB共享网络
none → 仅充电
mtp → 文件传输
ptp → 图片传输
adb → 设备调试
*/
// 检查USB功能是否启用(如adb、mtp)

清除ADB调试密钥

android.os.ServiceManager.getService("adb").clearDebuggingKeys();
// 清除ADB调试密钥

获取ADB无线端口

android.os.ServiceManager.getService("adb").getAdbWirelessPort();
// 获取ADB无线端口

无线ADB调试授权

android.os.ServiceManager.getService("adb").allowWirelessDebugging(true, "**:**:**:**:**:**")
// 无线调试授权指定公钥
/*
写入非当前wifi的BSSID前,需关闭无线调试开关。
如果写入的是当前WiFi的BSSID会自动打开无线ADB调试
具体观察/data/misc/adb/adb_temp_keys.xml
**:**这个参数是指wifi的BSSID,一般都是授权当前WiFi
*/

无线ADB调试授权

bssid = android.os.ServiceManager.getService("wifi").getConnectionInfo("android", null).getBSSID();
android.os.ServiceManager.getService("adb").allowWirelessDebugging(true, bssid)
// 无线ADB授权当前WiFi并启动无线ADB调试

获取当前WiFi的BSSID

android.os.ServiceManager.getService("wifi").getConnectionInfo("android", null).getBSSID();
// 获取当前WiFi的BSSID

获取当前WiFi的名称

android.os.ServiceManager.getService("wifi").getConnectionInfo("android", null).getSSID();
// 获取当前WiFi的名称

获取WiFi MAC地址

android.os.ServiceManager.getService("wifi").getConnectionInfo("android", null).getMacAddress();
// 获取当前WiFi的MAC地址

获取WiFi IP

ip = android.os.ServiceManager.getService("wifi").getConnectionInfo("android", null).getIpAddress();
(ip & 0xff) + "." + ((ip >> 8) & 0xff) + "." +
            ((ip >> 16) & 0xff) + "." + ((ip >> 24) & 0xff);
// 获取当前WiFi IP

获取WiFi全部信息

android.os.ServiceManager.getService("wifi").getConnectionInfo("android", null);
// 获取当前WiFi 全部信息
// 我就不一个一个弄了,有些我自己也不需要

隐藏状态栏内容显示

statusbar = context.getSystemService("statusbar");
// 设置禁用标志(禁用通知图标、系统信息、时钟)
statusbar.disable(statusbar.DISABLE_NOTIFICATION_ICONS | statusbar.DISABLE_SYSTEM_INFO | statusbar.DISABLE_CLOCK);
// 设置隐藏状态栏基本内容显示
/*
禁用后台多任务界面
DISABLE_RECENT
禁用导航栏
DISABLE_NAVIGATION
全家桶(禁用所有能禁用的组件)(慎用)
DISABLE_MASK
禁用下拉状态栏(个别系统恢复下拉状态栏,执行恢复命令后需锁屏一次)
DISABLE_EXPAND

详情查看https://blog.csdn.net/qq_45146250/article/details/131088228
*/

恢复状态栏内容显示

context.getSystemService("statusbar").disable(0);
//设置显示状态栏所有内容

息屏运行(屏幕电源)

Build = android.os.Build;
IBinder = android.os.IBinder;
Parcel = android.os.Parcel;
ServiceManager = android.os.ServiceManager;
SurfaceControl = android.view.SurfaceControl;

displayMode = 0; // 直接设置电源模式  2: 开启, 0: 关闭

if (Build.VERSION.SDK_INT < 34) { // Android 14 之前的版本
    // 获取 SurfaceControl 类(旧版本需要实例化)
    surfaceControl = new SurfaceControl();

    // 根据 Android 版本获取显示器 Token 方法
    displayToken = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
        surfaceControl.getBuiltInDisplay(0) : SurfaceControl.getInternalDisplayToken();

    // 直接调用 SurfaceControl 的方法,设置电源模式
    SurfaceControl.setDisplayPowerMode(displayToken, displayMode);

} else { // Android 14 及以上版本
    // 获取 SurfaceFlinger 服务(AIDL 方式)
    surfaceFlingerService = ServiceManager.getService("SurfaceFlingerAIDL");

    // 获取显示器 ID 列表
    parcelData = Parcel.obtain();
    parcelReply = Parcel.obtain();
    parcelData.writeInterfaceToken("android.gui.ISurfaceComposer");
    surfaceFlingerService.transact(IBinder.FIRST_CALL_TRANSACTION + 5, parcelData, parcelReply, 0);
    parcelReply.readException();
    displayCount = parcelReply.readInt();

    // 创建 long[] 数组存储显示器 ID
    displayIds = java.lang.reflect.Array.newInstance(java.lang.Long.TYPE, displayCount);

    // 读取显示器 ID
    for (var i = 0; i < displayCount; i++) {
        displayIds[i] = parcelReply.readLong();
    }
    parcelData.recycle();
    parcelReply.recycle();

    // 遍历每个显示器,设置电源模式
    for (var i = 0; i < displayIds.length; i++) {
        displayId = displayIds[i];

        // 获取单个显示器的 Token
        parcelData = Parcel.obtain();
        parcelReply = Parcel.obtain();
        parcelData.writeInterfaceToken("android.gui.ISurfaceComposer");
        parcelData.writeLong(displayId);
        surfaceFlingerService.transact(IBinder.FIRST_CALL_TRANSACTION + 6, parcelData, parcelReply, 0);
        parcelReply.readException();
        displayToken = parcelReply.readStrongBinder();
        parcelData.recycle();
        parcelReply.recycle();

        // 直接调用 SurfaceControl 的方法,设置电源模式(0=强制息屏,2=开启电源模式)
        SurfaceControl.setDisplayPowerMode(displayToken, displayMode);
    }
}
// Extinguish 息屏挂机 息屏运行 听剧模式 仅关屏 息屏不锁屏 息屏不锁屏 游戏挂机 开屏伪装FakeSceen

息屏运行(屏幕电源)

// 只对与手机分辨率相同的显示设备生效,可避免导致全部显示设备同时关闭屏幕电源
Build = android.os.Build;
IBinder = android.os.IBinder;
Parcel = android.os.Parcel;
ServiceManager = android.os.ServiceManager;
SurfaceControl = android.view.SurfaceControl;
Context = android.content.Context;
DisplayMetrics = android.util.DisplayMetrics;

// 设置电源模式,0: 关闭,2: 开启
displayMode = 0;

// 获取 DisplayManager 服务
displayManager = context.getSystemService("display");
// 获取手机的分辨率
metrics = new DisplayMetrics();
context.getSystemService(Context.WINDOW_SERVICE).getDefaultDisplay().getMetrics(metrics);
phoneWidth = metrics.widthPixels;
phoneHeight = metrics.heightPixels;

if (Build.VERSION.SDK_INT < 34) { // Android 14 之前的版本
    // 获取 SurfaceControl 类(旧版本需要实例化)
    surfaceControl = new SurfaceControl();

    // 根据 Android 版本获取显示器 Token 方法
    displayToken = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
        surfaceControl.getBuiltInDisplay(0) : SurfaceControl.getInternalDisplayToken();

    // 直接调用 SurfaceControl 的方法,设置电源模式
    SurfaceControl.setDisplayPowerMode(displayToken, displayMode);

} else { // Android 14 及以上版本
    // 获取 SurfaceFlinger 服务(AIDL 方式)
    surfaceFlingerService = ServiceManager.getService("SurfaceFlingerAIDL");

    // 获取显示器 ID 列表
    parcelData = Parcel.obtain();
    parcelReply = Parcel.obtain();
    parcelData.writeInterfaceToken("android.gui.ISurfaceComposer");
    surfaceFlingerService.transact(IBinder.FIRST_CALL_TRANSACTION + 5, parcelData, parcelReply, 0);
    parcelReply.readException();
    displayCount = parcelReply.readInt();

    // 创建 long[] 数组存储显示器 ID
    displayIds = java.lang.reflect.Array.newInstance(java.lang.Long.TYPE, displayCount);

    // 读取显示器 ID 并获取每个显示器分辨率
    for (var i = 0; i < displayCount; i++) {
        displayIds[i] = parcelReply.readLong();
        parcelData.recycle();
        parcelReply.recycle();

        // 获取每个显示器的分辨率
        display = displayManager.getDisplay(i);
        display.getMetrics(metrics);
        displayWidth = metrics.widthPixels;
        displayHeight = metrics.heightPixels;

        // 只有当显示器分辨率与手机屏幕相同,才设置电源模式
        if (displayWidth == phoneWidth && displayHeight == phoneHeight) {
            // 获取显示器的 Token
            parcelData = Parcel.obtain();
            parcelReply = Parcel.obtain();
            parcelData.writeInterfaceToken("android.gui.ISurfaceComposer");
            parcelData.writeLong(displayIds[i]);
            surfaceFlingerService.transact(IBinder.FIRST_CALL_TRANSACTION + 6, parcelData, parcelReply, 0);
            parcelReply.readException();
            displayToken = parcelReply.readStrongBinder();
            parcelData.recycle();
            parcelReply.recycle();

            // 设置电源模式(0=强制息屏,2=开启电源模式)
            SurfaceControl.setDisplayPowerMode(displayToken, displayMode);
        } else {
            // 如果分辨率不匹配,跳过该显示器,继续遍历下一个显示器
            continue;
        }
    }
}
// 只对与手机分辨率相同的显示设备生效,可避免导致全部显示设备同时关闭屏幕电源

NFC判断

android.nfc.INfcAdapter.Stub.asInterface(android.os.ServiceManager.getService("nfc")).getState() == 3;
// 判断NFC是否开启

禁用屏幕触摸

InputDevice = android.view.InputDevice;

inputManager = android.os.ServiceManager.getService("input");

deviceIds = inputManager.getInputDeviceIds();

touchDeviceId = -1;

for (i = 0; i < deviceIds.length; i++) {
    id = deviceIds[i];
    sources = inputManager.getInputDevice(id).getSources();
    if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
        touchDeviceId = id;
    }
}

inputManager.disableInputDevice(touchDeviceId);
// 禁用触摸设备

恢复屏幕触摸

InputDevice = android.view.InputDevice;

inputManager = android.os.ServiceManager.getService("input");

deviceIds = inputManager.getInputDeviceIds();

touchDeviceId = -1;

for (i = 0; i < deviceIds.length; i++) {
    id = deviceIds[i];
    sources = inputManager.getInputDevice(id).getSources();
    if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
        touchDeviceId = id;
    }
}

inputManager.enableInputDevice(touchDeviceId);
// 设置启用屏幕触摸

获取当前SIM卡的网络类型

com.android.internal.telephony.ITelephony.Stub.asInterface(android.os.ServiceManager.getService("phone")).getDataNetworkType("android", "");
// 获取当前SIM卡的网络类型

获取指定SIM卡的网络类型

// 获取活动订阅信息
subscriptionManager = android.telephony.SubscriptionManager.from(context);
subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();

// 检查订阅信息是否为空
if (subscriptionInfoList == "[]") {
    false;
} else {
    // 获取卡一 的订阅ID
    subId = subscriptionInfoList.get(0).getSubscriptionId();

    // 获取网络类型
    telephonyManager = com.android.internal.telephony.ITelephony.Stub.asInterface(android.os.ServiceManager.getService("phone"));
    telephonyManager.getNetworkTypeForSubscriber(subId, "android", "");
}
 //获取卡一的网络类型

网络类型对照表

/*
0 - 没插卡
1 - GPRS (2G)
2 - EDGE (2G)
3 - UMTS (3G)
4 - CDMA (3G)
5 - EVDO_0 (3G)
6 - EVDO_A (3G)
7 - EVDO_B (3G)
8 - HSDPA (3G)
9 - HSUPA (3G)
10 - HSPA (3G)
11 - IDEN (2G)
12 - LTE (4G)
13 - LTE_CA (4G+)
14 - HSPAP (3G)
15 - GSM (2G)
16 - TD_SCDMA (3G)
17 - IWLAN (Wi-Fi)
20 - NR (5G)
*/

5G 判断

com.android.internal.telephony.ITelephony.Stub.asInterface(android.os.ServiceManager.getService("phone")).getDataNetworkType("android", "") == 20;
// 判断当前SIM卡网络类型是否为5G

判断设备是否支持某个传感器的硬件开关

android.os.ServiceManager.getService("sensor_privacy").supportsSensorToggle(1, 2);     
// 设备是否支持摄像头硬件开关
/*
   (1, 传感器类型1/2)
 1 - 麦克风使用权限
 2 - 摄像头使用权限
*/

获取指定传感器状态

android.os.ServiceManager.getService("sensor_privacy").isToggleSensorPrivacyEnabled(1, 2);
// 获取摄像头传感器是否禁用
/*
   (1, 传感器类型1/2)
 1 - 麦克风使用权限
 2 - 摄像头使用权限
 */

调用解锁传感器对话框

android.os.ServiceManager.getService("sensor_privacy").showSensorUseDialog(2);
/*
在关闭对应传感器的前提,手动弹一次“解锁传感器开关”的确认对话框
 1 - 麦克风使用权限
 2 - 摄像头使用权限
*/

判断全局传感器状态

android.os.ServiceManager.getService("sensor_privacy").isSensorPrivacyEnabled();       
// 全局传感器隐私是否开启,ShortX 已存在该条件

设置全局传感器

android.os.ServiceManager.getService("sensor_privacy").setSensorPrivacy(true);
// 设置禁用全局传感器 true=关闭传感器,false=开启所有
// ShortX已存在该动作 

设置指定传感器开关

android.os.ServiceManager.getService("sensor_privacy").setToggleSensorPrivacy(0, 0, 1, true);
// 设置指定用户麦克风传感器使用权限
/*
(userId, source, sensor, true);
 *   userId:一般为 0
 *   source:来源,填0即可
 *   sensor:1=麦克风、2=摄像头
 *   enable:true=启用隐私保护,关闭传感器
 *    false = 开启传感器
 */

设置隐私状态提示禁用弹窗

context.getSystemService("sensor_privacy").suppressSensorPrivacyReminders(1, true, 0)
// 设置指定用户麦克风隐私状态提示禁用弹窗
/*
(int sensor, boolean suppress, int userId)
sensor:1=麦克风、2=摄像头
suppress:true=屏蔽弹窗
*/

获取指定传感器状态

android.os.ServiceManager.getService("sensor_privacy").isCombinedToggleSensorPrivacyEnabled(2);
/*
第二种方法
获取摄像头权限开关是否关闭
 1 - 麦克风使用权限
 2 - 摄像头使用权限
 */

单个应用传感器管理

/*
指定用户指定应用传感器管理
支持禁用、解除、查看,重置
*/
ServiceManager = android.os.ServiceManager;
ParcelFileDescriptor = android.os.ParcelFileDescriptor;

function runSensorCmd(args, userId) {

    svc = ServiceManager.getService("sensorservice");

    pin  = ParcelFileDescriptor.createPipe();
    pout = ParcelFileDescriptor.createPipe();
    perr = ParcelFileDescriptor.createPipe();

    pin[1].close();

    // 如果有指定用户,添加 --user 参数
    if (userId != undefined && userId != null) {
        args.push("--user");
        args.push(String(userId));
    }

    svc.shellCommand(
        pin[0].getFileDescriptor(),
        pout[1].getFileDescriptor(),
        perr[1].getFileDescriptor(),
        args,
        null,
        new android.os.ResultReceiver(null)
    );

    pout[1].close();
    perr[1].close();

    function read(p){
        s = new android.os.ParcelFileDescriptor.AutoCloseInputStream(p[0]);
        r = "";
        b = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
        n ="";
        while((n = s.read(b)) > 0){
            r += new java.lang.String(b, 0, n, "UTF-8");
        }
        return r;
    }

    result = read(pout) + read(perr);
    result = result.trim();

    if (args[0] == "get-uid-state") {
        if (result.includes("idle")) return true;
        if (result.includes("active")) return false;
        return false;

    }

    return result;
}

// 1) 禁用(设置为 idle,相当于限制传感器)
// runSensorCmd(["set-uid-state", "包名", "idle"], 0);

// 2) 恢复 active(取消限制)
// runSensorCmd(["set-uid-state", "com.liuzh.deviceinfo", "active"], 0);

// 3) 查看状态
// true 已禁用 false 未禁用
runSensorCmd(["get-uid-state", "com.liuzh.deviceinfo"], 0);

// 4) 恢复默认(清除 override)
// runSensorCmd(["reset-uid-state", "包名"], 0);

// 该接口不会禁用摄像头和麦克风,下载类似设备信息APP测试效果
// Android 11-16已测试成功,其他版本未知

获取Color系统的锁屏密码

android.os.ServiceManager.getService("lock_settings").getPassword();
// 获取 Color 系统的锁屏密码,
/* 
设置新密码后,需锁屏输入一次密码
Color16 不可用
*/

Color系统听剧模式(后台模式)

Intent = android.content.Intent;
ComponentName = android.content.ComponentName;

bgStreamIntent = new Intent();
bgStreamIntent.setComponent(new ComponentName("com.oplus.exsystemservice", "com.oplus.backgroundstream.RouteForegroundService"));
bgStreamIntent.setAction("oplus.intent.action.BACKGROUND_STREAM_SERVICE");

context.startService(bgStreamIntent);
// Color系统的听剧模式 | 后台挂机
// Color16 不可用

高德地图步行导航

Intent = android.content.Intent;
UserHandle = android.os.UserHandle;

lat = 39.909187;
// lat - 纬度
lon = 116.397463;
// lon - 经度

myIntent = Intent.parseUri('amapuri://openFeature?featureName=OnFootNavi&sourceApplication=null&lat=' + lat +'&lon=' + lon, 0);

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 指定用户启动
userHandle = UserHandle.of(0);

context.startActivityAsUser(myIntent, userHandle);

// 坐标拾取器 https://lbs.amap.com/tools/picker
// 指定用户高德地图 步行导航

高德地图骑行导航

Intent = android.content.Intent;
UserHandle = android.os.UserHandle;
// ShortX自带高德地图骑行导航无法细分自行车或电动车,该接口可以
lat = 39.909187;
// lat - 纬度
lon = 116.397463;
// lon - 经度
rideType = "bike";
// 骑行类型,elebike 为电动车,bike 或留空为自行车。

myIntent = Intent.parseUri('amapuri://openFeature?featureName=OnRideNavi&rideType=' + rideType + '&sourceApplication=null&lat=' + lat +'&lon=' + lon, 0);

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 指定用户启动
userHandle = UserHandle.of(0);

context.startActivityAsUser(myIntent, userHandle);
// 坐标拾取器 https://lbs.amap.com/tools/picker
// 指定用户高德地图 自行车导航

百度地图步行导航

Intent = android.content.Intent;
UserHandle = android.os.UserHandle;

lat = 39.915119;
// lat - 纬度
lon = 116.403963;
// lon - 经度
coord_type = "bd09ll";
/*
坐标类型
bd09ll(百度经纬度坐标) //用百度坐标拾取器,可避免误差
bd09mc(百度墨卡托坐标)
gcj02(经国测局加密的坐标)
wgs84(gps获取的原始坐标)
*/
// 步行导航
myIntent = Intent.parseUri('baidumap://map/walknavi?destination=' + lat + ',' + lon + '&coord_type=' + coord_type + '&src=andr.baidu.openAPIdemo', 0);

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 指定用户启动
userHandle = UserHandle.of(0);

context.startActivityAsUser(myIntent, userHandle);
// 坐标拾取器 https://lbs.baidu.com/maptool/getpoint
// 指定用户百度地图 步行导航

百度地图骑行导航

Intent = android.content.Intent;
UserHandle = android.os.UserHandle;
// ShortX自带的百度地图骑行导航无法正常使用,该接口可以
lat = 39.915119;
// lat - 纬度
lon = 116.403963;
// lon - 经度
coord_type = "bd09ll";
/*
坐标类型
bd09ll(百度经纬度坐标) //用百度坐标拾取器,可避免误差
bd09mc(百度墨卡托坐标)
gcj02(经国测局加密的坐标)
wgs84(gps获取的原始坐标)
*/
// 电动车导航
myIntent = Intent.parseUri('baidumap://map/bikenavi?destination=' + lat + ',' + lon + '&coord_type=' + coord_type + '&src=andr.baidu.openAPIdemo', 0);

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 指定用户启动
userHandle = UserHandle.of(0);

context.startActivityAsUser(myIntent, userHandle);
// 坐标拾取器 https://lbs.baidu.com/maptool/getpoint
// 指定用户百度地图 电动车导航

设置系统时间

function createTimestamp(year, month, day, hour, minute, second) {
    Calendar = java.util.Calendar;
    cal = Calendar.getInstance();
    cal.set(year, month - 1, day, hour, minute, second);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTimeInMillis();
}

// 示例为2023年12月25日 14点30分30秒
timestamp = createTimestamp(2023, 12, 25, 14, 30, 30);

android.os.ServiceManager.getService("alarm").setTime(timestamp); 
// 设置系统时间

恢复系统时间

Settings = android.provider.Settings;
Settings.Global.putString(context.getContentResolver(), 'auto_time', 0);
Settings.Global.putString(context.getContentResolver(), 'auto_time', 1);
// 设置恢复系统时间

获取下一个从空闲唤醒的时间

next = android.os.ServiceManager.getService("alarm").getNextWakeFromIdleTime();

if (next >= 9000000000) {
    "当前没有任何会唤醒设备的闹钟";
} else {
    real = java.lang.System.currentTimeMillis() + next - android.os.SystemClock.elapsedRealtime();
    new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date(real));
}
// 获取下一次从Doze/空闲模式唤醒的时间

获取当前音量

audioManager = context.getSystemService("audio");
// 获取指定音量类型的音量值并返回
function getVolumeInfo(context, streamType) {
     volume = android.os.ServiceManager.getService("audio").getStreamVolume(streamType);
    return volume;
}

getVolumeInfo(context, audioManager.STREAM_RING);
// 获取当前铃声音量
// 获取指定音量类型当前音量

设置音量

audioManager = context.getSystemService("audio");
function getVolumeInfo(context, streamType, targetVolume) {
     volume = android.os.ServiceManager.getService("audio").setStreamVolume(streamType, targetVolume, 0, null);
    return volume;
}

getVolumeInfo(context, audioManager.STREAM_ALARM, 7);
// 设置闹钟音量
// 设置指定音量类型

调节音量

audioManager = context.getSystemService("audio");
audio =android.os.ServiceManager.getService("audio");
function getVolumeInfo(context, streamType, targetVolume) {
    currentVolume = audio.getStreamVolume(streamType);
    newVolume = currentVolume + targetVolume;
    maxVolume = audio.getStreamMaxVolume(streamType);
    minVolume = 0;
    newVolume = Math.max(minVolume, Math.min(newVolume, maxVolume));
    audio.setStreamVolume(streamType, newVolume, 0, null);
    return newVolume;
}

getVolumeInfo(context, audioManager.STREAM_ALARM, 2);
// 调整闹钟音量(比如2 或 -2)
// 调节指定音量类型

获取音量上限

audioManager = context.getSystemService("audio");
audio =android.os.ServiceManager.getService("audio");
function getVolumeInfo(context, streamType, targetVolume) {
    currentVolume = audio.getStreamVolume(streamType);
    maxVolume = audio.getStreamMaxVolume(streamType);
    return maxVolume;
}

getVolumeInfo(context, audioManager.STREAM_ALARM);
// 获取指定音量类型的上限

音量类型

/*
// 通话音量
audioManager.STREAM_VOICE_CALL
// 系统音量
audioManager.STREAM_SYSTEM
// 铃声音量
audioManager.STREAM_RING
// 媒体音量
audioManager.STREAM_MUSIC
// 闹钟音量
audioManager.STREAM_ALARM
// 通知音量
audioManager.STREAM_NOTIFICATION
// 蓝牙 SCO 音频流
audioManager.STREAM_BLUETOOTH_SCO
// 强制可听音频流
audioManager.STREAM_ENFORCED_AUDIBLE
// DTMF 音频流
audioManager.STREAM_DTMF
// TTS 音频流
audioManager.STREAM_TTS
// 辅助功能音频流
audioManager.STREAM_ACCESSIBILITY
// 助理音频流
audioManager.STREAM_ASSISTANT
*/

显示屏刷新率显示管理

/*
 * 显示刷新率开关控制函数
 *     0 = 关闭
 *     1 = 开启  
 *     2 = 查询当前状态(返回 true/false)
 *     3 = 切换(打开→关 / 关→开)
 */
function showRefreshRate(mode) {
    sf = android.os.ServiceManager.getService("SurfaceFlinger");

    function call(flag, needReply) {
        data = android.os.Parcel.obtain();
        reply = needReply ? android.os.Parcel.obtain() : null;
        data.writeInterfaceToken("android.ui.ISurfaceComposer");
        data.writeInt(flag);
        sf.transact(1034, data, reply, 0);
        return reply;
    }

    if (mode == 3) {
        current = call(2, true).readBoolean();
        call(current ? 0 : 1, false);
        return !current;
    }

    // mode: 0=关 1=开 2=查
    if (mode == 2) {
        return call(2, true).readBoolean();
    } else {
        call(mode, false);
        return mode == 1;
    }
}

// 切换显示屏刷新率显示开关
showRefreshRate(3);

刷新率支持状态

modes = (android.os.ServiceManager.getService("display").getDisplayInfo(android.view.Display.DEFAULT_DISPLAY)).supportedModes;
s = "";
for (i = 0; i < modes.length; i++) {
    m = modes[i];
    s += "id=" + m.getModeId() + ": " + m.getRefreshRate() + "Hz\n";
}
s.trim();
// 获取当前显示屏支持的刷新率以及对应ID

锁定刷新率

/*
 * 强制锁定指定刷新率
 */
function lockRefreshRate(modeId) {
    realMode = modeId - 1;

    sf = android.os.ServiceManager.getService("SurfaceFlinger");

    data = android.os.Parcel.obtain();
    data.writeInterfaceToken("android.ui.ISurfaceComposer");
    data.writeInt(realMode);
    sf.transact(1035, data, null, 0);
}
// 重启需重新设置,个别系统锁屏后也会失效,自己测试。
// 改成自己想锁定的刷新率对应ID,不要乱填
lockRefreshRate(1);

创建Thanox应用集

importClass(Packages.github.tornaco.android.thanos.core.app.ThanosManagerNative);

var iThanos = ThanosManagerNative.getDefault();

var pkgManager = iThanos.getPkgManager();

result = pkgManager.createPackageSet("测试创建集合");

动态快捷方式

//给指定应用动态快捷方式添加指定Intent URI
importClass(android.content.Context);
importClass(android.content.pm.ShortcutInfo);
importClass(android.graphics.drawable.Icon);
importClass(android.content.Intent);
importClass(java.util.ArrayList);
importClass(java.util.Collections);
// ===== 目标包名 =====
var targetPackage = "tornaco.apps.shortx";

// ===== 指定要写入的 Intent URI =====
var intentUri = `intent:#Intent;action=com.tmessages.openchat0;component=org.telegram.messenger/.OpenChatReceiver;l.chatId=1604486631;end`;

try {
    var otherContext = context.createPackageContext(
        targetPackage,
        Context.CONTEXT_IGNORE_SECURITY
    );
    var shortcutManager =
        otherContext.getSystemService(Context.SHORTCUT_SERVICE);

    if (!shortcutManager) {
        throw "ShortcutManager 不可用";
    }
    var targetIntent = Intent.parseUri(intentUri, 0);
    targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    // ===== 新快捷方式ID=====
    //ID用来区分不同的快捷方式,删除也必须使用同样ID
    var shortcutId = "shortcut_0001";

    var newShortcut =
        new ShortcutInfo.Builder(otherContext, shortcutId)
             //快捷方式 桌面显示名称
            .setShortLabel("ShortX群组")
            //长名称 
            .setLongLabel("ShortX群组")
            .setIcon(
                Icon.createWithResource(
                    otherContext,
                    otherContext.getApplicationInfo().icon
                )
            )
            .setIntent(targetIntent)
            .build();
    var existing = shortcutManager.getDynamicShortcuts();
    if (existing.size() >= shortcutManager.getMaxShortcutCountPerActivity()) {
        throw "动态快捷方式数量已达系统上限";
    }
    shortcutManager.addDynamicShortcuts(
        Collections.singletonList(newShortcut)
    );
      shortcutId;
} catch (e) {
    "写入失败: " + e;
}

删掉动态快捷方式

// 删掉指定应用指定动态快捷方式
importClass(android.content.Context);
importClass(android.content.pm.ShortcutManager);
importClass(java.util.Collections);

// ================= 目标应用包名 =================
var targetPackage = "包名"; // ← 可修改为任意 app 包名

try {
    // 获取目标应用上下文
    var otherContext = context.createPackageContext(
        targetPackage,
        Context.CONTEXT_INCLUDE_CODE |
        Context.CONTEXT_IGNORE_SECURITY |
        Context.CONTEXT_DEVICE_PROTECTED_STORAGE |
        Context.CONTEXT_REGISTER_PACKAGE
    );

    // 获取系统服务 ShortcutManager
    var shortcutManager = otherContext.getSystemService(Context.SHORTCUT_SERVICE);

    if (shortcutManager == null) {
        console.log("❌ 此设备不支持 ShortcutManager。");
        JSON.stringify([]);
    }

    // ================= 删除指定 ID 的动态快捷方式 =================
    var shortcutId = "shortcut_1759818721903"; // ← 只删这个 ID
    var list = java.util.Collections.singletonList(shortcutId);
    shortcutManager.removeDynamicShortcuts(list);

    "✅ 已删除 " + targetPackage + " 的快捷方式 ID: " + shortcutId;

} catch (e) {
    console.log("❌ 删除快捷方式出错: " + e);
    JSON.stringify([]);
}

HTML解析

// 使用指定语法解析HTML
importPackage(Packages.org.jsoup);

var htmlContent = `<html><body><h1>这是一个标题</h1><p>这是段落内容。</p></body></html>`;

// 解析 HTML
var document = Jsoup.parse(htmlContent);

// 获取 p 标签
var pElement = document.select("p").first();

// 提取 p 标签的文本内容
pText = pElement.text();

ShortX OCR

importClass(Packages.tornaco.apps.shortx.core.proto.action.OcrDetect);
importClass(Packages.tornaco.apps.shortx.core.proto.common.RectSourceRect);
importClass(Packages.tornaco.apps.shortx.core.proto.common.Rect);
importClass(com.google.protobuf.Any);

var action = OcrDetect.newBuilder()
    .setRectSrc(
        Any.pack(
            RectSourceRect.newBuilder()
                .setRect(
                    Rect.newBuilder()
                        .setLeft("")
                        .setTop("")
                        .setRight("")
                        .setBottom("")
                        .build()
                )
                .build()
        )
    )
    .build();

var result = shortx.executeAction(action);

result.contextData.get("ocrResult")
// 输入屏幕区域

蓝牙共享网络

importPackage(android.bluetooth);
importPackage(android.content);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function enableBt() {
    var a = BluetoothAdapter.getDefaultAdapter();
    if (a == null) throw new Error("不支持蓝牙");
    a.enable();
    return a;
}

function withPan(adapter, fn) {
    var latch = new CountDownLatch(1);
    var out = { v: false };

    adapter.getProfileProxy(context, new BluetoothProfile.ServiceListener({
        onServiceConnected: function(p, proxy) {
            if (p == BluetoothProfile.PAN) {
                out.v = fn(proxy);
                adapter.closeProfileProxy(BluetoothProfile.PAN, proxy);
            }
            latch.countDown();
        },
        onServiceDisconnected: function() {
            latch.countDown();
        }
    }), BluetoothProfile.PAN);

    latch.await(2, TimeUnit.SECONDS);
    return out.v;
}

function toggleBluetoothTethering(context) {
    var adapter = enableBt();
    var state = withPan(adapter, function(p) { return p.isTetheringOn(); });
    withPan(adapter, function(p) { p.setBluetoothTethering(!state); });
    return state ? "蓝牙网络共享已关闭" : "蓝牙网络共享已开启";
}

toggleBluetoothTethering(context);
// 通过蓝牙共享手机的网络连接

以太网网络共享

android.os.ServiceManager.getService("ethernet").setEthernetEnabled(true);
// false 关闭
// 通过以太网共享手机的网络连接

USB网络共享

android.os.ServiceManager.getService("usb").setCurrentFunctions(32, 0);
// 通过 USB 共享手机的网络连接

设置USB功能

android.os.ServiceManager.getService("usb").setCurrentFunctions(4, 0);
// 开启USB文件传输模式

/*
none         → 仅充电        → 0
adb          → 设备调试      → 1
accessory    → 外设模式      → 2
mtp          → 文件传输      → 4
midi         → MIDI          → 8
ptp          → 图片传输      → 16
rndis        → USB共享网络   → 32
audio_source → USB音频       → 64
uvc          → USB摄像头     → 128
ncm          → USB网络(NCM)  → 1024
*/

列表对话框 JSON格式

importPackage(Packages.tornaco.apps.shortx.core.proto.action);
importClass(Packages.tornaco.apps.shortx.core.proto.common.DialogUiStyleSettings);

var dataJson = `[
    {
        "name": "Android",
        "version": 16,
        "__value": "android",
        "__icon": "android-fill"
    }
]`;

// ShowListDialog Action
var action = ShowListDialog.newBuilder()
    .setTitle("列表对话框")
    .setData(dataJson)
    .setDataType(ShowListDialogDataType.ShowListDialogDataType_Json)
    .setStyle(
        DialogUiStyleSettings.newBuilder()
            .setFontScale(1.0)
            .build()
    )
    .setIsMultipleChoice(true)
    // 显示底部确认按钮
    .setNeedConfirmAction(true)
    // 支持多选
    .setCancelable(true)
    // 是否可取消
    .build();

var result = shortx.executeAction(action);

result.contextData.get("selectedListItem");
// 列表对话框JSON格式

配置热点策略

importClass(android.net.wifi.SoftApConfiguration);
importClass(android.net.MacAddress);
importClass(android.os.ServiceManager);
// ---------- 热点名称(SSID) ----------
var HOTSPOT_SSID = "66666";

// ---------- 热点密码 ----------
// - OPEN(开放热点)时必须为 null
var HOTSPOT_PASSWORD = "55555";

// ---------- 安全类型 ----------
// SoftApConfiguration.SECURITY_TYPE_OPEN
// SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
// SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION
// SoftApConfiguration.SECURITY_TYPE_WPA3_SAE
var SECURITY_TYPE = SoftApConfiguration.SECURITY_TYPE_WPA3_SAE;

// ---------- 是否隐藏 SSID ----------
// true  = 隐藏热点
var HIDDEN_SSID = false;

// ---------- 频段模式 ----------
// "2.4G" | "5G" | "6G" | "DUAL" | "AUTO"
var BAND_MODE = "5G";

// ---------- 信道(0 = 自动) ----------
var CHANNEL_2G = 0;   // 1 ~ 14
var CHANNEL_5G = 36;  // 34 ~ 196
var CHANNEL_6G = 0;   // 1 ~ 253

// ---------- 最大客户端数 ----------
// 0 = 系统默认
var MAX_CLIENTS = 0;
// ---------- 自动关闭 ----------
var AUTO_SHUTDOWN = false;
// 单位:毫秒
// 600000 = 10 分钟
// 300000 = 5 分钟
// 60000  = 1 分钟
var SHUTDOWN_TIMEOUT_MS = 600000;

// ---------- 用户控制 ----------
var CLIENT_CONTROL_BY_USER = false;

// ---------- 白名单 ----------
var ALLOWED_MAC_LIST = [
    // "AA:BB:CC:DD:EE:FF",
    // "11:22:33:44:55:66"
];

// ---------- 黑名单 ----------
var BLOCKED_MAC_LIST = [
    // "99:88:77:66:55:44",
    // "22:33:44:55:66:77"
];

function startCustomHotspot() {
    // 创建配置构建器
    var builder = new SoftApConfiguration.Builder();
    // 1. SSID
    builder.setSsid(HOTSPOT_SSID);
    // 2. 密码 & 安全类型
    builder.setPassphrase(HOTSPOT_PASSWORD, SECURITY_TYPE);
    // 3. 是否隐藏
    builder.setHiddenSsid(HIDDEN_SSID);
    // 4. 频段
    if (BAND_MODE == "2.4G") {
        builder.setBand(SoftApConfiguration.BAND_2GHZ);
    } else if (BAND_MODE == "5G") {
        builder.setBand(SoftApConfiguration.BAND_5GHZ);
    } else if (BAND_MODE == "6G") {
        builder.setBand(SoftApConfiguration.BAND_6GHZ);
    } else if (BAND_MODE == "DUAL") {
        builder.setBand(
            SoftApConfiguration.BAND_2GHZ |
            SoftApConfiguration.BAND_5GHZ
        );
    } else {
        builder.setBand(SoftApConfiguration.BAND_ANY);
    }
    // 5. 信道(仅单频有效)
    if (BAND_MODE == "2.4G" && CHANNEL_2G > 0) {
        builder.setChannel(CHANNEL_2G, SoftApConfiguration.BAND_2GHZ);
    }
    if (BAND_MODE == "5G" && CHANNEL_5G > 0) {
        builder.setChannel(CHANNEL_5G, SoftApConfiguration.BAND_5GHZ);
    }
    if (BAND_MODE == "6G" && CHANNEL_6G > 0) {
        builder.setChannel(CHANNEL_6G, SoftApConfiguration.BAND_6GHZ);
    }
    // 6. 最大客户端
    builder.setMaxNumberOfClients(MAX_CLIENTS);

    // 7. 自动关闭
    builder.setAutoShutdownEnabled(AUTO_SHUTDOWN);
    builder.setShutdownTimeoutMillis(SHUTDOWN_TIMEOUT_MS);
    // ================= 客户端控制 =================
    // 8. 用户确认模式
    builder.setClientControlByUserEnabled(CLIENT_CONTROL_BY_USER);
    // 9. 白名单
    if (CLIENT_CONTROL_BY_USER && ALLOWED_MAC_LIST.length > 0) {
        var allowedList = [];
        for (var i = 0; i < ALLOWED_MAC_LIST.length; i++) {
            allowedList.push(
                MacAddress.fromString(ALLOWED_MAC_LIST[i])
            );
        }
        builder.setAllowedClientList(allowedList);
    }
    // 10. 黑名单
    if (BLOCKED_MAC_LIST.length > 0) {
        var blockedList = [];
        for (var j = 0; j < BLOCKED_MAC_LIST.length; j++) {
            blockedList.push(
                MacAddress.fromString(BLOCKED_MAC_LIST[j])
            );
        }
        builder.setBlockedClientList(blockedList);
    }
    var config = builder.build();
    try {
        var wifiService = ServiceManager.getService("wifi");
        if (!wifiService) {
            console.log("无法获取 wifi service");
        }
        // 设置配置
        wifiService.setSoftApConfiguration(config, "android");
        // 启动热点
        shortx.executeAction(Packages.tornaco.apps.shortx.core.proto.action.SetHotSpotEnabled.newBuilder().setEnable(true).build()
);

    } catch (e) {
        console.log("设置失败: " + e);
       
    }
}
startCustomHotspot();
/*
可选项包括:热点标识(SSID、是否隐藏)、安全认证(加密类型、密码)、无线参数(频段、信道)、连接策略(最大客户端数、是否自动关闭)、客户端管控(用户确认、白名单、黑名单)
*/

固定指定应用

android.os.ServiceManager.getService("activity_task").startSystemLockTaskMode(taskId);
// 固定指定应用

固定前台应用

android.os.ServiceManager.getService("activity_task").startSystemLockTaskMode((android.os.ServiceManager.getService("activity_task")).getTasks(1)[0].taskId);
// 固定前台应用

取消固定应用

android.os.ServiceManager.getService("activity_task").stopSystemLockTaskMode()
// 取消固定应用

运行内存详情

// 运行内存详情
MemoryInfo = android.app.ActivityManager.MemoryInfo;
memInfo = new MemoryInfo();
activityService = android.os.ServiceManager.getService("activity");
activityService.getMemoryInfo(memInfo);

availGB = memInfo.availMem / 1024.0 / 1024 / 1024;
totalGB = memInfo.totalMem / 1024.0 / 1024 / 1024;
thresholdMB = memInfo.threshold / 1024.0 / 1024;

usedGB = totalGB - availGB;
usedPercent  = (usedGB  / totalGB) * 100;
availPercent = (availGB / totalGB) * 100;

availGB2 = Math.floor(availGB * 100) / 100;
totalGB2 = Math.floor(totalGB * 100) / 100;
usedGB2  = Math.floor(usedGB  * 100) / 100;

usedPercent2  = Math.floor(usedPercent  * 100) / 100;
availPercent2 = Math.floor(availPercent * 100) / 100;
thresholdMB2 = Math.floor(thresholdMB * 100) / 100;


"可用内存: " + availGB2 + " GB (" + availPercent2 + " %)\n" +
"已用内存: " + usedGB2  + " GB (" + usedPercent2  + " %)\n" +
"总内存: " + totalGB2 + " GB\n" +
"低内存模式: " + memInfo.lowMemory + "\n" +
"低内存阈值: " + thresholdMB2 + " MB";

内部存储详情

// 内部存储详情
StatFs = android.os.StatFs;
stat = new StatFs("/data");

totalGB = stat.getTotalBytes() / 1024.0 / 1024 / 1024;
availGB = stat.getAvailableBytes() / 1024.0 / 1024 / 1024;

usedGB = totalGB - availGB;
usedPercent  = (usedGB  / totalGB) * 100;
availPercent = (availGB / totalGB) * 100;

"总存储: " + (Math.floor(totalGB * 100) / 100) + " GB\n" +
"已用存储: " + (Math.floor(usedGB * 100) / 100) + " GB\n" +
"可用存储: " + (Math.floor(availGB * 100) / 100) + " GB\n" +
"已用比例: " + (Math.floor(usedPercent * 100) / 100) + " %\n" +
"可用比例: " + (Math.floor(availPercent * 100) / 100) + " %";

夜间模式判断

(context.getResources().getConfiguration().uiMode & 48) == 32;

//android.os.ServiceManager.getService("uimode").getNightMode() == 2;

// 
((android.os.ServiceManager.getService("activity").getConfiguration()).uiMode & 48) == 32;

// 三种方式
// 深色主题(夜间模式)判断

获取陀螺仪数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getGyroscopeData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

    if (gyroscope == null) {
        return "设备不支持陀螺仪传感器";
    }

    var x = 0, y = 0, z = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            latch.countDown(); // 收到数据后释放
        },
        onAccuracyChanged: function (sensor, accuracy) {}
    });

    // 注册监听器,必须在主线程
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, gyroscope, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待 2 秒获取数据
    var received = latch.await(2, TimeUnit.SECONDS);

    // 无论成功与否都要注销监听器
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取陀螺仪数据";
    }

    return "陀螺仪数据:\nX: " + x + "\nY: " + y + "\nZ: " + z;
}

getGyroscopeData();

获取设备屏幕方向

// 根据加速度传感器获取设备屏幕方向
importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);
importClass(java.lang.Runnable);

function getPhoneOrientation() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    if (accelerometer == null) {
        return "设备不支持加速度传感器";
    }

    var x = 0, y = 0, z = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function(event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            latch.countDown();
        },
        onAccuracyChanged: function(sensor, accuracy) {}
    });

    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function() {
            sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    var received = latch.await(2, TimeUnit.SECONDS);
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取加速度传感器数据";
    }

    // 判断朝向
    var absX = Math.abs(x), absY = Math.abs(y), absZ = Math.abs(z);

    if (absZ > absX && absZ > absY) {
        return z > 0 ? "屏幕朝上" : "屏幕朝下";
    } else if (absY > absX && absY > absZ) {
        return y > 0 ? "顶部朝上" : "底部朝上";
    } else if (absX > absY && absX > absZ) {
        return x > 0 ? "右侧朝上" : "左侧朝上";
    } else {
        return "无法判断";
    }
}

getPhoneOrientation();

获取数据传感器数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getProximityData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

    if (proximitySensor == null) {
        return "设备不支持距离传感器";
    }

    var maxRange = proximitySensor.getMaximumRange();
    var distance = -1;

    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            distance = event.values[0];
            latch.countDown(); // 一旦收到数据就释放等待
        },
        onAccuracyChanged: function (sensor, accuracy) {
            // 可选:处理精度变化
        }
    });

    // 在主线程中注册监听器
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待2秒
    var received = latch.await(2, TimeUnit.SECONDS);

    // 不管成功与否都注销监听器
    sensorManager.unregisterListener(listener);

    if (!received || distance < 0) {
        return "未能获取距离传感器数据";
    }

    // 判断是否接近(通常 0 表示接近)
    var isNear = distance <= 1.0;  // 兼容某些 maxRange 比较小的设备

    return "距离传感器数据: " + distance + " 厘米\n是否接近: " + (isNear ? "是" : "否");
}

getProximityData();

获取手电筒状态

importClass(android.content.Context);
importClass(android.hardware.camera2.CameraManager);
importClass(android.os.Build);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getTorchState() {
    if (Build.VERSION.SDK_INT < 24) {
        return "当前 Android 版本不支持监听手电筒状态(需要 Android 7.0+)";
    }

    try {
        var latch = new CountDownLatch(1);
        var torchOn = null;

        var cameraManager = context.getSystemService(Context.CAMERA_SERVICE);
        var handler = new Handler(Looper.getMainLooper()); // 使用主线程的 Looper

        var torchCallback = new android.hardware.camera2.CameraManager.TorchCallback({
            onTorchModeChanged: function (cameraId, enabled) {
                torchOn = enabled;
                latch.countDown(); // 获取到状态后退出等待
            },
            onTorchModeUnavailable: function (cameraId) {
                torchOn = null;
                latch.countDown(); // 无法获取状态也退出
            }
        });

        cameraManager.registerTorchCallback(torchCallback, handler);

        latch.await(1, TimeUnit.SECONDS);

        cameraManager.unregisterTorchCallback(torchCallback);

        if (torchOn === null) {
            return "无法获取手电筒状态";
        }

        return torchOn;
    } catch (e) {
        return "发生错误: " + e;
    }
}

getTorchState();

获取加速度传感器数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getAccelerometerData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    if (accelerometer == null) {
        return "设备不支持加速度传感器";
    }

    var x = 0, y = 0, z = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            latch.countDown(); // 收到数据后释放
        },
        onAccuracyChanged: function (sensor, accuracy) {}
    });

    // 注册监听器,必须在主线程
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待 2 秒获取数据
    var received = latch.await(2, TimeUnit.SECONDS);

    // 无论成功与否都要注销监听器
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取加速度传感器数据";
    }

    return "加速度传感器数据:\nX: " + x + "\nY: " + y + "\nZ: " + z;
}

getAccelerometerData();

获取磁场传感器数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getMagneticFieldData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

    if (magneticField == null) {
        return "设备不支持磁力计传感器";
    }

    var x = 0, y = 0, z = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            latch.countDown(); // 收到数据后释放
        },
        onAccuracyChanged: function (sensor, accuracy) {}
    });

    // 注册监听器,必须在主线程
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, magneticField, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待 2 秒获取数据
    var received = latch.await(2, TimeUnit.SECONDS);

    // 无论成功与否都要注销监听器
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取磁力计传感器数据";
    }

    return "磁力计传感器数据:\nX: " + x + "\nY: " + y + "\nZ: " + z;
}

getMagneticFieldData();

获取方向传感器数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getOrientationData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var orientationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

    if (orientationSensor == null) {
        return "设备不支持方向传感器";
    }

    var azimuth = 0, pitch = 0, roll = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            azimuth = event.values[0];  // 方位角(0°-360°,朝北为0°)
            pitch = event.values[1];    // 俯仰角(-90° 到 90°,0° 为水平)
            roll = event.values[2];     // 滚转角(-90° 到 90°,0° 为水平)
            latch.countDown(); // 收到数据后释放
        },
        onAccuracyChanged: function (sensor, accuracy) {}
    });

    // 注册监听器,必须在主线程
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待 2 秒获取数据
    var received = latch.await(2, TimeUnit.SECONDS);

    // 无论成功与否都要注销监听器
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取方向传感器数据";
    }

    return "方向传感器数据:\nX: " + azimuth + "°\nY: " + pitch + "°\nZ: " + roll + "°";
}

getOrientationData();

获取重力传感器数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getGravityData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

    if (gravitySensor == null) {
        return "设备不支持重力传感器";
    }

    var x = 0, y = 0, z = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            latch.countDown(); // 收到数据后释放
        },
        onAccuracyChanged: function (sensor, accuracy) {}
    });

    // 注册监听器,必须在主线程
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, gravitySensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待 2 秒获取数据
    var received = latch.await(2, TimeUnit.SECONDS);

    // 无论成功与否都要注销监听器
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取重力传感器数据";
    }

    return "重力传感器数据:\nX: " + x + "\nY: " + y + "\nZ: " + z;
}

getGravityData();

获取光线传感器数据

importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.hardware.SensorEvent);
importClass(java.lang.Thread);
importClass(java.lang.Runnable);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);

function getLightData() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

    if (lightSensor == null) {
        return "设备不支持光线传感器";
    }

    var lightLevel = 0;
    var latch = new CountDownLatch(1);

    var listener = new SensorEventListener({
        onSensorChanged: function (event) {
            lightLevel = event.values[0];  // 光线强度(单位:勒克斯 lux)
            latch.countDown(); // 收到数据后释放
        },
        onAccuracyChanged: function (sensor, accuracy) {}
    });

    // 注册监听器,必须在主线程
    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function () {
            sensorManager.registerListener(listener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }));

    // 最多等待 2 秒获取数据
    var received = latch.await(2, TimeUnit.SECONDS);

    // 无论成功与否都要注销监听器
    sensorManager.unregisterListener(listener);

    if (!received) {
        return "未能获取光线传感器数据";
    }

    return "光线传感器数据:\n光照强度: " + lightLevel + " lux";
}

getLightData();

获取摇一摇状态

// 根据加速度传感器获取摇一摇状态
importClass(android.content.Context);
importClass(android.hardware.Sensor);
importClass(android.hardware.SensorManager);
importClass(android.hardware.SensorEventListener);
importClass(android.os.Looper);
importClass(android.os.Handler);
importClass(java.util.concurrent.CountDownLatch);
importClass(java.util.concurrent.TimeUnit);
importClass(java.lang.Runnable);

function simulateShake() {
    var sensorManager = context.getSystemService(Context.SENSOR_SERVICE);
    var accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    if (accelerometer == null) {
        return "设备不支持加速度传感器";
    }

    var latch = new CountDownLatch(1);
    var isShaked = false;

    var listener = new SensorEventListener({
        onSensorChanged: function(event) {
            var x = event.values[0];
            var y = event.values[1];
            var z = event.values[2];

            // 计算三轴加速度的合力大小(去掉重力后相对变化)
            var magnitude = Math.sqrt(x * x + y * y + z * z);

            // 简单阈值判断:加速度变化超过 15(m/s²)认为是摇动
            if (magnitude > 15) {
                isShaked = true;
                latch.countDown();
            }
        },
        onAccuracyChanged: function(sensor, accuracy) {}
    });

    new Handler(Looper.getMainLooper()).post(new Runnable({
        run: function() {
            sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_GAME);
        }
    }));

    // 最多等 3 秒
    latch.await(3, TimeUnit.SECONDS);
    sensorManager.unregisterListener(listener);

    if (isShaked) {
        return "检测到摇一摇";
    } else {
        return "未检测到摇一摇";
    }
}

simulateShake();

展开快捷设置面板

ServiceManager = android.os.ServiceManager;

ServiceManager.getService("statusbar").expandSettingsPanel(null);
// 展开快捷设置面板

//ServiceManager.getService("statusbar").collapsePanels();
// 收起所有面板
// 如果当前使用的是定制化系统的快捷设置与通知分离面板的话,需要把第二段代码解除注释状态

收起所有面板

android.os.ServiceManager.getService("statusbar").collapsePanels();
// 包括通知与快捷设置面板

切换面板状态

android.os.ServiceManager.getService("statusbar").togglePanel();

重启

android.os.ServiceManager.getService("power").reboot(false, null, true);
// 重启设备

显示输入法

importClass(Packages.tornaco.apps.shortx.core.proto.action.ShowHideInsets);
importClass(Packages.tornaco.apps.shortx.core.proto.common.WindowInsetType);

shortx.executeAction(ShowHideInsets.newBuilder().setIsHide(false).addType(WindowInsetType.WindowInsetType_Ime).build());

隐藏输入法

importClass(Packages.tornaco.apps.shortx.core.proto.action.ShowHideInsets);
importClass(Packages.tornaco.apps.shortx.core.proto.common.WindowInsetType);

shortx.executeAction(ShowHideInsets.newBuilder().setIsHide(true).addType(WindowInsetType.WindowInsetType_Ime).build());

音频焦点判断

android.os.ServiceManager.getService("audio").getCurrentAudioFocus() != 0;
// 判断当前是否有音频焦点

判断指定音频静音状态

android.os.ServiceManager.getService("audio").isStreamMute(3);

// 判断媒体音量静音状态

音量类型

/*
通话音量       → 0
系统音量       → 1
铃声音量       → 2
媒体音量       → 3
闹钟音量       → 4
通知音量       → 5
蓝牙 SCO 音频流 → 6
强制系统音量   → 7
DTMF 音频流     → 8
TTS 音频流      → 9
辅助功能音量   → 10
助理音频流   → 11
*/

系统崩溃

android.os.ServiceManager.getService("power").crash(null);
// 引发设备崩溃

进入安全模式

android.os.ServiceManager.getService("power").rebootSafeMode(false, true);
// 设备重启并进入安全模式

省电模式判断

android.os.ServiceManager.getService("power").isPowerSaveMode();
// 判断是否处于省电模式

设置省电模式

android.os.ServiceManager.getService("power").setPowerSaveModeEnabled(true);
// 设置省电模式

设置指定显示屏的窗口模式

android.os.ServiceManager.getService("window").setWindowingMode(0, 5);
// 该命令有点问题,暂时不要运行。
// 设置指定显示屏为小窗

// (int displayId, int mode)
/* 小窗模式
Color →  100
默认  →  5
/*

查看指定显示屏窗口模式

android.os.ServiceManager.getService("window").getWindowingMode(0);
// 该命令暂时不要用。
// 查看指定显示屏当前窗口模式

获取当前应用的窗口模式

(android.os.ServiceManager.getService("activity_task").getTasks(1))[0].configuration.windowConfiguration.getWindowingMode();
// 获取当前应用的窗口模式数值

获取输入法区域

android.os.ServiceManager.getService("window").getCurrentImeTouchRegion();
//获取当前输入法的显示(触摸)区域

获取主显示设备的Token

Build = android.os.Build;
SurfaceControl = android.view.SurfaceControl;
DisplayControl = com.android.server.display.DisplayControl;

if (Build.VERSION.SDK_INT < 34) { // 
    surfaceControl = new SurfaceControl();
    displayToken = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
        surfaceControl.getBuiltInDisplay(0) : SurfaceControl.getInternalDisplayToken();

} else {
    displayToken = DisplayControl.getPhysicalDisplayToken(DisplayControl.getPhysicalDisplayIds()[0]);

}

息屏运行(屏幕电源)

// 仅对主显示设备生效
Build = android.os.Build;
SurfaceControl = android.view.SurfaceControl;
DisplayControl = com.android.server.display.DisplayControl;

displayMode = 0;  // 直接设置电源模式  2: 开启, 0: 关闭

if (Build.VERSION.SDK_INT < 34) { 
    surfaceControl = new SurfaceControl();

    displayToken = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
        surfaceControl.getBuiltInDisplay(0) : SurfaceControl.getInternalDisplayToken();

    SurfaceControl.setDisplayPowerMode(displayToken, displayMode);

} else {
    displayToken = DisplayControl.getPhysicalDisplayToken(DisplayControl.getPhysicalDisplayIds()[0]);

        SurfaceControl.setDisplayPowerMode(displayToken, displayMode);
}
// Extinguish 息屏挂机 息屏运行 听剧模式 仅关屏 息屏不锁屏 息屏不锁屏 游戏挂机 开屏伪装FakeSceen

设置电源模式

Service = android.os.ServiceManager.getService("display");

if (android.os.Build.VERSION.SDK_INT > 35) {
    Service.requestDisplayPower(0, 1);
} else {
    Service.requestDisplayPower(0, true);
}
// Android 15及以上方可使用
// 设置指定显示器电源模式
// Android 16+(int displayId, int state)
/*
state 模式
电源关闭         → 1
电源开启         → 2
待机模式         → 3
深度待机模式     → 4
*/
// Android 15 (int displayId, boolean on)

获取主设备显示ID

(android.hardware.display.DisplayManagerGlobal.getInstance()).getDisplayInfo(0).address.getPhysicalDisplayId();
// 获取主设备ID

获取距离上一次触摸的时间差

// 全局空闲秒数,即获取距离上一次触摸时间差(秒
var idle = 0;
try {
    var h = {};
    var t = new java.lang.Thread(function () {
        try {
            var im = android.hardware.input.IInputManager.Stub.asInterface(android.os.ServiceManager.getService("input"));
            var p = android.os.ParcelFileDescriptor.createReliablePipe();
            im.dump(p[1].getFileDescriptor(), null);
            p[1].close();

            var s = new android.os.ParcelFileDescriptor.AutoCloseInputStream(p[0]);
            var b = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);
            var o = new java.io.ByteArrayOutputStream();
            while ((r = s.read(b)) != -1 && o.size() < 999999) o.write(b, 0, r);
            s.close();

            h.t = o.toString("UTF-8");
        } catch (e) {}
    });

    t.start();
    t.join(3000);

    var m = h.t && h.t.match(/age=([0-9.]+)ms/);
    if (m) idle = m[1] / 1000;
} catch (e) {}

if (!idle) {
    var result = shortx.executeAction(Packages.tornaco.apps.shortx.core.proto.action.ShellCommand.newBuilder().setCommand("dumpsys input 2>/dev/null | sed -rn \"/RecentQueue:/ n;/.*age=([0-9]*).*/{s//\\1/p;q}\"").build()).contextData.get("shellOut");

    if (result) idle = result / 1000;
}

idle;

清空Http log

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().clearHttpRequestLogs();
// 清空HTTP请求的日志

清空JS logs

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().clearJSLogs();
// 清空JS执行日志

清空Hook方法的调用日志

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().clearMethodHookLogs();
// 清空Hook方法的调用日志

清空指令记录

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().clearEvaluateRecords();
// 清空指令记录

获取开关指令总数量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getToggleCount();
// 获取开关指令总数量

获取自动指令总数量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getRuleCount();
// 获取自动指令总数量

获取一键指令总数量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getDirectActionCount();
// 获取一键指令总数量

获取代码库总数量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getCodeLibraryItemCount();
// 获取代码库总数量

获取ShortX日志文件的存储路径

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getLogDir();
// 获取ShortX日志文件的根目录路径

获取JS代码执行日志的存储路径

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getJSLogPath();
// 获取JS代码执行日志的存储路径

获取Hook方法调用日志的存储路径

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getMethodHookLogPath();
// 获取Hook方法调用日志的存储路径

获取ShortX根目录

new java.io.File(Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getLogDir()).getParentFile().getAbsolutePath();
// 获取ShortX根目录

判断ShortX是否正在进行录音

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isAudioRecording();
// 判断ShortX是否正在进行录音

判断按键紧急停用ShortX功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isForceDisableShortXByKeyPressEnabled();
// 判断按键紧急停用ShortX功能是否开启

判断ShortX是否正在录制手势

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isGestureRecording();
// 判断ShortX是否正在录制手势

判断Http请求日志功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isHttpRequestLogEnabled();
// 判断HTTP请求日志功能是否开启

判断Shell命令引擎-Shell in SystemUI功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isInjectedShellEnabled();
// 判断Shell命令引擎-Shell in SystemUI功能是否开启

判断按键事件提示功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isKeyEventPromptEnabled();
// 判断按键事件提示功能是否开启

判断指针位置显示功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isPointerLocationEnabled();
// 判断指针位置显示功能是否开启

判断ShortX调试(详细)日志功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isLogDebugEnable();
// 判断ShortX调试(详细)日志功能是否开启

判断ShortX应用通知功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isPostNByAppEnabled();
// 判断ShortX应用通知功能是否开启

判断磁贴点击优化功能是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isQSTileOptEnabled();
// 判断磁贴点击优化功能是否开启

判断ShortX是否出现致命错误

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().hasFatalError();
// 判断ShortX是否出现致命错误

判断指定规则引擎是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isRuleEngineEnabled('引擎标识');
// 判断指定规则引擎是否开启
/*
shell  → Shell命令引擎
mvel  →  MVEL表达式引擎
*/

判断自动规则核心功能(总开关)是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isRuleFeatureEnabled();
// 判断自动规则核心功能(总开关)是否开启

判断指定开关指令是否开启

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isToggleEnabled('toggle-84eb65f4-115c-416b-bef2-xxxxxxxxxx');
// 判断指定开关指令是否开启 

判断快捷栏图标是否为深色模式

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().isLightBarTransitionsIconsDark();
// 判断快捷栏图标是否为深色模式

获取所有正在执行的任务

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getActiveJobs();
// 获取所有正在执行的任务                                              

获取所有正在执行的动作列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getEvaluatingActions();
// 获取所有正在执行的动作列表

获取设备SIM卡的运营商订阅信息

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getActiveSubscriptionInfoList();
// 获取设备SIM卡的运营商订阅信息

获取ShortX所有音频录制文件数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllAudioRecordFiles();
// 获取ShortX所有音频录制文件数据

获取所有上下文菜单(触发器)的配置列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllContextMenuSettings();
// 获取所有上下文菜单(触发器)的配置列表

查询指定App的所有Activity组件

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getActivities(0, "tornaco.apps.shortx");
// 查询指定App的所有Activity组件
// 猜测参数1为筛选状态(0=全部、1=启用),参数2为App包名

获取ShortX所有功能开关的数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllToggles();
// 获取ShortX所有功能开关的数据

获取所有代码库数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllCodeLibraryItems();
// 获取所有代码库数据

获取所有一键指令集

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllDASets(true);
// 获取所有一键指令集

获取所有自动指令集数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllRuleSets(true);
// 获取所有自动指令集数据

关键词查询自动规则

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllDirectAction(String, int, int);
// 关键词查询自动规则
// 猜测参数1为关键词,参数2=分类ID,参数3=状态
// 分类ID(0=全部、1=系统、2=自定义),状态(0=全部、1=启用、2=禁用)

关键词查询一键指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllDirectAction(String, int, int);
// 关键词查询一键指令
// 猜测 参数1为模糊关键词,参数2=分类ID,参数3=状态
// 分类ID(0=全部、1=系统、2=自定义),状态(0=全部、1=启用、2=禁用)

查询符合条件的所有一键指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllDirectAction(int, int);
// 查询符合条件的所有一键指令
// 猜测参数1为分类ID(0=全部、1=系统、2=自定义),参数2为状态(0=全部、1=启用、2=禁用)

带缓存+关键词查询一键指令,效率更高

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllDirectActionWithQueryCache(String, int, int);
// 带缓存+关键词查询一键指令,效率更高
// 猜测参数1为指令名称关键词(模糊匹配),参数2=分类ID,参数3=状态(同上)

获取所有动态快捷方式的配置列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllDynamicShortcutSettings();
// 获取所有动态快捷方式的配置列表

获取所有手势记录数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllGestureRecords(boolean);
// 获取所有手势记录数据
/*
true=具体详情
false=应用集名称
/*

获取所有已创建的全局变量数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllGlobalVars();
// 获取所有已创建的全局变量数据

获取所有应用集数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllPkgSets(true);
// 获取所有应用集数据
/*
true=具体详情
false=应用集名称
*/

获取设备所有铃声、提示音、闹钟音的数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllRingtones();
// 获取设备所有铃声、提示音、闹钟音的数据

获取所有状态栏图标的配置列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllStatusBarTileSettings();
// 获取所有状态栏图标的配置列表

获取当前Android系统的所有环境变量、系统参数列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllSystemEnv();
// 获取当前Android系统的所有环境变量、系统参数列表

获取设备上所有创建的用户账号列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllUsers();
// 获取设备上所有创建的用户账号列表

获取所有已配置的WebDav同步配置列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllWebDavProfiles();
// 获取所有已配置的WebDav同步配置列表

获取设备已配对的所有蓝牙设备列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getBTBondedDevices();
// 获取设备已配对的所有蓝牙设备列表

获取设备所有已安装App数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getInstalledApps();
// 获取设备所有已安装App数据

查询指定App的BroadcastReceiver组件

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getProviders(int, String);
// 查询指定App的BroadcastReceiver组件
// 参数1为筛选状态,参数2为App包名

删除指定音频录制文件

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteAudioRecordFile(ByteArrayWrapper);
// 删除指定音频录制文件

删除指定代码库片段

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteCodeLibraryItem('id');
// 删除指定代码库片段

删除指定一键指令集

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteDASet('DS-xxxxxxxx-xxxx-xxxx-8943-xxxxxxxxxx');
// 删除指定一键指令集

删除指定一键指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteDirectAction('DA-xxxxxxxx-4xxxxx-43ed-bf32-172c0adcxxxxx');
// 删除指定一键指令

删除指定自动指令集

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteRuleSet('RS-xxxxxxx-xxxx-xxxx-be4e-xxxxxxxxx');
// 删除指定自动指令集

删除指定自动指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteRule('rule-xxxxxxx-xxxx-xxxxxxx-a19d-xxxxxxxxxx');
// 删除指定自动指令

删除指定开关指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteToggle('toggle-xxxxxxx-115c-416b-bef2-xxxxxxxxxx');
// 删除指定开关指令

删除指定手势

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteGestureRecordById('7919aacb-xxxxx-xxxx-xxxx-xxxxxxxxx');
// 删除指定手势

删除指定全局变量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deleteGlobalVar('变量名字');
// 删除指定全局变量

删除指定应用集合

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deletePkgSet('应用集名字');
// 删除指定应用集合

删除指定WebDav配置

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().removeWebDavProfile('配置名字');
// 删除指定WebDav配置

新增代码库片段

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addCodeLibraryItem(ByteArrayWrapper);
// 新增代码库片段

新增一键指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addDirectAction(ByteArrayWrapper);
// 新增一键指令

新增自动指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addRule(ByteArrayWrapper);
// 新增自动指令

新增开关指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addToggle(ByteArrayWrapper);
// 新增开关指令

新增/更新一键指令集

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addOrUpdateDASet(ByteArrayWrapper);
// 新增/更新一键指令集

新增/更新自动指令集

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addOrUpdateRuleSet(ByteArrayWrapper);
// 新增/更新自动指令集

新增应用集

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addPkgSet(ByteArrayWrapper);
// 新增应用集

新增手势记录

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addGestureRecord(ByteArrayWrapper);
// 新增手势记录

新增全局变量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addGlobalVar(ByteArrayWrapper);
// 新增全局变量

新增WebDav配置

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addWebDavProfile(ByteArrayWrapper);
// 新增WebDav配置

开启指定Hook功能

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().addHookFlags(String);
// 开启指定Hook功能

触发DeepLink跳转,打开指定App/页面

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().deepLinkTriggerCalled('shortx名字');
// 触发DeepLink跳转,打开指定App/页面

主动触发Android系统服务崩溃

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().crashSystemServer();
// 主动触发Android系统服务崩溃

获取当前设备指纹标识字符串

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().fingerprint();
// 获取当前设备指纹标识字符串

获取下拉快捷设置面板磁贴数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAllQSTiles();
// 获取下拉快捷设置面板磁贴数据

获取指定App的组件信息(Activity/Service等)

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAppComponentInfo(ByteArrayWrapper);
// 获取指定App的组件信息(Activity/Service等)

获取指定App的图标位图

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAppIcon(String, int);
// 获取指定App的图标位图

获取指定App的显示名称

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getAppLabel(ByteArrayWrapper);
// 获取指定App的显示名称

获取指定代码库片段

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getCodeLibraryItemById('codeid') ;
// 获取指定代码库片段

获取指定App组件的启用状态

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getComponentEnabledSetting(ByteArrayWrapper);
// 获取指定App组件的启用状态
// 猜测参数为组件封装对象,返回0=默认、1=启用、2=禁用

获取上下文菜单配置指令名称

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getContextMenuSettingsByMenuNumber(0);
// 获取上下文菜单配置指令名称
// 参数为编号

获取当前已挂载的Root权限实现标识(自定义su路径)

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getCustomSU();
// 获取当前已挂载的Root权限实现标识(自定义su路径)

获取一键指令集数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getDASetById('DS-xxxxxxxx-xxxx-xxxx-8943-xxxxxxxxxx', boolean);
// 获取一键指令集数据
// 参数1为指令集ID,参数2为布尔值,true=查详情、false=基础信息

获取自动指令集数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getRuleSetById('RS-xxxxxxx-xxxx-xxxx-be4e-xxxxxxxxx', boolean);
// 获取自动指令集数据
// 参数1为指令集ID,参数2为布尔值,true=查详情、false=基础信息

获取ShortX弹幕功能的UI配置数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getDanmuUISettings();
// 获取ShortX弹幕功能的UI配置数据

获取指定一键指令数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getDirectActionById('DA-xxxxxxxx-4xxxxx-43ed-bf32-172c0adcxxxxx');
// 获取指定一键指令数据

获取指定自动指令数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getRuleById('rule-xxxxxxx-xxxx-xxxxxxx-a19d-xxxxxxxxxx');
// 获取指定自动指令数据

获取指定开关指令数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getToggleById('toggle-84eb65f4-115c-416b-bef2-xxxxxxxxxx');
// 获取指定开关指令数据

获取指定WebDav配置

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getWebDavProfileById('id');
// 获取指定WebDav配置

获取动态快捷方式配置

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getDynamicShortcutSettingsByNumber(int);
// 获取动态快捷方式配置

获取边缘手势的触摸区域厚度

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getGestureAreaSize();
// 获取边缘手势的触摸区域厚度

获取指定手势记录数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getGestureRecordById('7919aacb-xxxxx-xxxx-xxxx-xxxxxxxxx');
// 获取指定手势记录数据

获取指定全局变量数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getGlobalVarByName('变量名字');
// 获取指定全局变量数据

获取Hook方法调用日志(数据)文件描述符

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getMethodHookLogFD();
// 获取Hook方法调用日志(数据)文件描述符 ParcelFileDescriptor

获取JS代码执行日志(数据)文件描述符

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getJSLogFD();
// 获取JS代码执行日志(数据)文件描述符 ParcelFileDescriptor

获取HTTP请求日志(数据)文件描述符

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getHttpRequestLogFD();
// 获取HTTP请求日志(数据)文件描述符 ParcelFileDescriptor

获取已安装插件提供的所有自动化动作列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getInstalledPluginActions();
// 获取已安装插件提供的所有自动化动作列表

获取已安装插件提供的所有自动化条件列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getInstalledPluginConditions();
// 获取已安装插件提供的所有自动化条件列表

获取所有已安装的ShortX拓展插件列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getInstalledPluginFacts();
// 获取所有已安装的ShortX拓展插件列表

获取所有已添加快捷方式的App列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getInstalledShortcutApps();
// 获取所有已添加快捷方式的App列表

获取按键长按检测的超时时间

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getKeyDetectorLongPressTimeoutMS();
// 获取按键长按检测的超时时间

获取设备移动网络信号的最大强度值

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getMaxSignalLevel();
// 获取设备移动网络信号的最大强度值

获取当前启用的OCR文字识别引擎

// 获取OCR引擎值
var ocrEngine = Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getOCREngine();
// 根据返回值输出对应的OCR引擎名称
if (ocrEngine == 1) {
    "Tesseract";
} else if (ocrEngine == 0) {
    "Paddle";
} else {
    "Unknown";
}
// 获取当前启用的OCR文字识别引擎

获取指定应用集数据

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getPkgSetByLabel('应用集名字');
// 获取指定应用集数据

查询指定状态的运行中App包名

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getRunningAppPkgs(String);
// 查询指定状态的运行中App包名

获取指定App正在运行的服务列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getRunningServices(ByteArrayWrapper);
// 获取指定App正在运行的服务列表

获取设备屏幕的分辨率

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getScreenSize();
// 获取设备屏幕的分辨率(宽、高),返回Point对象

获取指定App的Service组件

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getServices(0, 'tornaco.apps.shortx');
// 获取指定App的Service组件

获取ShortX服务的相关目录路径封装对象

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getShortXServerDirs();
// 获取ShortX服务的相关目录路径封装对象

获取状态栏图标配置

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getStatusBarTileSettingsByNumber(int);
// 获取状态栏图标配置

获取状态栏剪贴板的功能配置封装对象

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getStatusbarClipSettings();
// 获取状态栏剪贴板的功能配置封装对象

获取指定音频流的最大音量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getStreamMaxVolume(int);
// 获取指定音频流的最大音量

获取指定音频流的最小音量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getStreamMinVolume(int);
// 获取指定音频流的最小音量

获取指定音频流的当前音量

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getStreamVolume(int);
// 获取指定音频流的当前音量

设置滑动手势触发阈值

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().setSwipeDistanceThresholdDp(int);
// 设置滑动手势触发阈值

获取滑动手势的触发阈值

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getSwipeDistanceThresholdDp();
// 获取滑动手势的触发阈值

设置滑动手势长度缩放比例

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().setSwipeLengthScale(float);
// 设置滑动手势长度缩放比例

获取滑动手势的长度缩放比例

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getSwipeLengthScale();
// 获取滑动手势的长度缩放比例

获取当前WiFi扫描列表

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().getWifiScanResults();
// 获取当前WiFi扫描列表

取消(停止)指定执行中的任务

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().cancelJobs(List);
// 取消(停止)指定执行中的任务

执行JS代码

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeJS('js代码', 0);
// 执行JS代码
/*
Default    → 0
IO         → 1
UI         → 2
*/

执行MVEL表达式

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeMVEL('mvel代码', 0);
// 执行MVEL表达式
/*
Default    → 0
IO         → 1
UI         → 2
*/

执行系统Shell命令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeShellCommand(String, ICallback);
// 执行系统Shell命令
// 返回命令取消信号;参数1为完整Shell命令,参数2为命令执行回调

执行HTTP网络请求

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeHttpRequest(ByteArrayWrapper);
// 执行HTTP网络请求

执行指定自动指令的绑定动作

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().directExecuteRuleActions(ByteArrayWrapper, String);
// 跳过条件判断,执行指定自动指令的绑定动作
// 参数1为上下文数据封装,参数2为目标规则ID

执行指定动作

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeAction(ByteArrayWrapper, ByteArrayWrapper, ByteArrayWrapper);
// 执行指定动作
// 猜测参数1为动作配置,参数2为上下文数据,参数3为附加参数(如延迟时间)

执行单条自动动作

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeActionBlocking(ByteArrayWrapper, ByteArrayWrapper);
// 阻塞式(同步)执行单条自动动作(完成后再执行后续操作)
// 参数1为动作配置,参数2为上下文数据

执行指定自动指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeDirectionAction(ByteArrayWrapper, ByteArrayWrapper, ByteArrayWrapper);
// 执行指定自动指令
// 参数1为指令配置,参数2为上下文,参数3为附加参数

执行指定一键指令

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeDirectionActionById(ByteArrayWrapper, String);
// 执行指定一键指令
// 参数1为上下文数据,参数2为自动指令唯一ID

执行指定代码库片段

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().executeCodeLibraryItem(String, int);
// 执行指定代码库片段

开始录制手势

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().startGestureRecording();
// 开始录制手势

停止手势录制

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().stopGestureRecording(boolean);
// 停止手势录制
// 参数为布尔值,true=保存录制、false=放弃

停止当前音频录制

Packages.tornaco.apps.shortx.core.OooO0O0.OooO00o().stopAudioRecording();
// 停止当前音频录制

获取所有应用集名称

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importClass(Packages.tornaco.apps.shortx.core.proto.pkgset.PkgSet);

function getByteData(wrapper) {
    if (!wrapper) return null;
    try { return wrapper.getClass().getMethod("getByteData").invoke(wrapper); } catch(e) {}
    try { var f = wrapper.getClass().getDeclaredField("byteData"); f.setAccessible(true); return f.get(wrapper); } catch(e) {}
    return null;
}

function parsePkgSetFromBytes(bytes) {
    try { return PkgSet.parseFrom(bytes); } catch(e) { return null; }
}

var iShortX = OooO0O0.OooO00o();

var resultList = iShortX.getAllPkgSets(false);
var labels = [];

for (var i = 0; resultList && i < resultList.size(); i++) {
    var wrapper = resultList.get(i);
    var bytes = getByteData(wrapper);
    if (!bytes) continue;
    var pkgSet = parsePkgSetFromBytes(bytes);
    if (!pkgSet) continue;

    var setLabel = pkgSet.getLabel ? pkgSet.getLabel() : null;
    if (setLabel) labels.push(setLabel);
}

labels.join("\n");

判断指定应用集是否存在

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importClass(Packages.tornaco.apps.shortx.core.proto.pkgset.PkgSet);

// =================== 工具函数 ===================
function getByteData(wrapper) {
    if (!wrapper) return null;
    try { return wrapper.getClass().getMethod("getByteData").invoke(wrapper); } catch(e) {}
    try { var f = wrapper.getClass().getDeclaredField("byteData"); f.setAccessible(true); return f.get(wrapper); } catch(e) {}
    return null;
}

function parsePkgSetFromBytes(bytes) {
    try { return PkgSet.parseFrom(bytes); } catch(e) { return null; }
}

// =================== 查询指定应用集合名是否存在 ===================
function findLabel(targetLabel) {
    var iShortX = OooO0O0.OooO00o();
    var result = iShortX.getPkgSetByLabel(targetLabel);

    if (result) {
        var bytes = getByteData(result);
        if (!bytes) return false;
        var pkgSet = parsePkgSetFromBytes(bytes);
        return pkgSet ? true : false;
    }
    
    return false; // 如果没有找到对应的集合,返回 false
}

// =================== 使用示例 ===================
var target = "Proxy"; // 要查询的应用集合名
findLabel(target); // true 或 false

获取指定应用集数据

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importClass(Packages.tornaco.apps.shortx.core.proto.pkgset.PkgSet);
importClass(java.io.ByteArrayInputStream);

function getByteData(wrapper) {
    if (!wrapper) return null;
    try { return wrapper.getClass().getMethod("getByteData").invoke(wrapper); } catch(e) {}
    try { var f = wrapper.getClass().getDeclaredField("byteData"); f.setAccessible(true); return f.get(wrapper); } catch(e) {}
    return null;
}

function parsePkgSetFromBytes(bytes) {
    try { return PkgSet.parseFrom(bytes); } catch(e) { return null; }
}

var iShortX = OooO0O0.OooO00o();
var installedMap = {};
var installed = iShortX.getInstalledApps();
for (var i = 0; installed && i < installed.size(); i++) {
    var w = installed.get(i);
    var bd = getByteData(w);
    if (!bd) continue;
    var ps = parsePkgSetFromBytes(bd);
    if (!ps) continue;
    var setLabel = ps.getLabel ? ps.getLabel() : null;
    var list = ps.getAppPkgsList();
    for (var j = 0; j < list.size(); j++) {
        var ap = list.get(j);
        var pName = ap.getPkgName ? ap.getPkgName() : null;
        if (!pName) continue;
        var apLabel = ap.getLabel ? ap.getLabel() : setLabel;
        installedMap[pName] = apLabel || pName;
    }
}

function getAppsByLabel(targetLabel) {
    var output = [];
    var result = iShortX.getPkgSetByLabel(targetLabel);

    if (result) {
        var bytes = getByteData(result);
        if (!bytes) return output;
        var pkgSet = parsePkgSetFromBytes(bytes);
        if (!pkgSet) return output;

        var setLabel = pkgSet.getLabel ? pkgSet.getLabel() : null;
        var list = pkgSet.getAppPkgsList();
        for (var j = 0; j < list.size(); j++) {
            var ap = list.get(j);
            var pName = ap.getPkgName ? ap.getPkgName() : null;
            if (!pName) continue;
            var finalName = installedMap[pName] || (ap.getLabel ? ap.getLabel() : setLabel) || pName;
            output.push({
                name: finalName,
                version: pName,
                __value: pName,
                __icon: "app://" + pName
            });
        }
    }

    return output;
}

var targetLabel = "User"; // 你想要查找的应用集名
JSON.stringify(getAppsByLabel(targetLabel), null, 2);

获取指定应用集内应用是否存在

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importClass(Packages.tornaco.apps.shortx.core.proto.pkgset.PkgSet);
importClass(java.io.ByteArrayInputStream);

function getByteData(wrapper) {
    if (!wrapper) return null;
    try { return wrapper.getClass().getMethod("getByteData").invoke(wrapper); } catch(e) {}
    try { var f = wrapper.getClass().getDeclaredField("byteData"); f.setAccessible(true); return f.get(wrapper); } catch(e) {}
    return null;
}

function parsePkgSetFromBytes(bytes) {
    try { return PkgSet.parseFrom(bytes); } catch(e) { return null; }
}

var iShortX = OooO0O0.OooO00o();
var installedMap = {};
var installed = iShortX.getInstalledApps();
for (var i = 0; installed && i < installed.size(); i++) {
    var w = installed.get(i);
    var bd = getByteData(w);
    if (!bd) continue;
    var ps = parsePkgSetFromBytes(bd);
    if (!ps) continue;
    var setLabel = ps.getLabel ? ps.getLabel() : null;
    var list = ps.getAppPkgsList();
    for (var j = 0; j < list.size(); j++) {
        var ap = list.get(j);
        var pName = ap.getPkgName ? ap.getPkgName() : null;
        if (!pName) continue;
        var apLabel = ap.getLabel ? ap.getLabel() : setLabel;
        installedMap[pName] = apLabel || pName;
    }
}

// =================== 查找指定应用集名及应用包名 ===================
function findAppInPkgSet(targetLabel, targetPackageName) {
    var result = iShortX.getPkgSetByLabel(targetLabel);

    if (result) {
        var bytes = getByteData(result);
        if (!bytes) return false;
        var pkgSet = parsePkgSetFromBytes(bytes);
        if (!pkgSet) return false;

        // 遍历当前应用集中的所有应用包名
        var list = pkgSet.getAppPkgsList();
        for (var j = 0; j < list.size(); j++) {
            var ap = list.get(j);
            var pName = ap.getPkgName ? ap.getPkgName() : null;
            if (!pName) continue;

            // 如果找到了目标包名,立即返回 true
            if (pName == targetPackageName) {
                return true;
            }
        }
    }

    return false; // 如果没有找到指定应用包名,返回 false
}

var targetLabel = "User"; // 你想要查找的应用集名
var targetPackageName = "tornaco.apps.shortx"; // 你想要查找的应用包名
findAppInPkgSet(targetLabel, targetPackageName);  
// 返回布尔值 (true 或 false)

获取设备所有已安装App数据

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importClass(Packages.tornaco.apps.shortx.core.proto.pkgset.PkgSet);
importClass(java.io.ByteArrayInputStream);

var result = [];
var iShortX = OooO0O0.OooO00o();
var pkgManager = iShortX.getInstalledApps();

for (var i = 0; i < pkgManager.size(); i++) {
    var wrapper = pkgManager.get(i);
    var byteData = wrapper.getByteData();
    var byteStream = new ByteArrayInputStream(byteData);
    var pkgSet = PkgSet.parseFrom(byteStream);

    var applabel = pkgSet.getLabel();
    var appPkgsList = pkgSet.getAppPkgsList();

    for (var j = 0; j < appPkgsList.size(); j++) {
        var appPkg = appPkgsList.get(j);
        var packageName = appPkg.getPkgName ? appPkg.getPkgName() : (typeof appPkg === "string" ? appPkg : "");

        result.push({
            name: applabel,
            version: packageName,
            __value: packageName,
            __icon: "app://" + packageName
        });
    }
}

JSON.stringify(result, null, 2);

获取所有全局变量数据

importPackage(Packages.tornaco.apps.shortx.core.proto.gv);
importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importClass(Packages.com.google.protobuf.Any);

function unpackAny(anyVar) {
    if (!anyVar) return null;
    try {
        var mapping = {
            "Int64Var": Int64Var,
            "StringVar": StringVar,
            "BoolVar": BoolVar,
            "StringListVar": StringListVar,
            "Int64ListVar": Int64ListVar,
            "BoolListVar": BoolListVar,
            "GlobalVarCreatedBy_Rule": GlobalVarCreatedBy_Rule,
            "GlobalVarCreatedBy_User": GlobalVarCreatedBy_User
        };
        for (var key in mapping) {
            var cls = mapping[key];
            if (anyVar.is(cls)) {
                var parsed = cls.parseFrom(anyVar.getValue());
                if (key === "GlobalVarCreatedBy_Rule") return { type: key, value: { srcId: parsed.getSrcId() } };
                if (key === "GlobalVarCreatedBy_User") return { type: key, value: {} };
                if (key.indexOf("ListVar") >= 0) return { type: key, value: parsed.getValuesList().toArray() };
                return { type: key, value: parsed.getValue() };
            }
        }
        return { type: anyVar.getTypeUrl(), value: anyVar.toString() };
    } catch (e) {
        return { type: "Error", value: "解包失败: " + e };
    }
}

function getByteData(wrapper) {
    if (!wrapper) return null;
    try { return wrapper.getClass().getMethod("getByteData").invoke(wrapper); } catch(e) {}
    try { var f = wrapper.getClass().getDeclaredField("byteData"); f.setAccessible(true); return f.get(wrapper); } catch(e) {}

    for (var i = 0; i < methods.length; i++) {
        try { var r = wrapper.getClass().getMethod(methods[i]).invoke(wrapper); if (r instanceof Array) return r; } catch(e) {}
    }
    return null;
}

// =================== 获取 ShortX 全局变量 ===================
var output = [];
try {
    var iShortX = OooO0O0.OooO00o();
    var vars = iShortX.getAllGlobalVars();
    for (var i = 0; i < vars.size(); i++) {
        try {
            var byteData = getByteData(vars.get(i));
            if (!byteData) { output.push({error:"第"+i+"个变量字节数据为 null"}); continue; }

            var gv = GlobalVar.parseFrom(byteData);
            var varObj = unpackAny(gv.getVar());
            var typeObj = unpackAny(gv.getType());
            var createdByObj = unpackAny(gv.getCreatedBy());

            output.push({
                name: gv.getName(),
                value: varObj ? varObj.value : null,
                type: typeObj ? typeObj.type : null,
                isSecret: gv.getIsSecret(),
                note: gv.getNote(),
                createdBy: createdByObj ? createdByObj.value : null
            });
        } catch(e) {
            output.push({error:"解析第"+i+"个变量失败: "+e.toString()});
        }
    }
} catch(e) {
    output.push({error:"脚本执行失败: "+e.toString()});
}

JSON.stringify(output,null,2);

获取HTTP请求日志内容

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importPackage(Packages.java.io);
importClass(Packages.java.nio.charset.Charset);

var iShortX = OooO0O0.OooO00o();

// 获取HTTP请求日志的ParcelFileDescriptor
var Httplog = iShortX.getHttpRequestLogFD();

// 获取底层的FileDescriptor
var fileDescriptor = Httplog.getFileDescriptor();
// 创建FileInputStream来读取FileDescriptor
var fileInputStream = new FileInputStream(fileDescriptor);
// 创建Java字节数组(byte[])
var buffer = new java.lang.reflect.Array.newInstance(Packages.java.lang.Byte.TYPE, 1024);
// 读取数据
var bytesRead = fileInputStream.read(buffer);
// 将字节数组转换为字符串输出
var logContent = "";
if (bytesRead > 0) {
    logContent = new java.lang.String(buffer, 0, bytesRead, Charset.forName("UTF-8"));
}
logContent;

获取JS代码执行日志内容

importClass(Packages.tornaco.apps.shortx.core.OooO0O0);
importPackage(Packages.java.io);
importClass(Packages.java.nio.charset.Charset);

var iShortX = OooO0O0.OooO00o();
// 获取JS日志的ParcelFileDescriptor
var Jslog = iShortX.getJSLogFD();
// 获取底层的FileDescriptor
var fileDescriptor = Jslog.getFileDescriptor();
// 创建FileInputStream来读取FileDescriptor
var fileInputStream = new FileInputStream(fileDescriptor);
// 创建Java字节数组(byte[])
var buffer = new java.lang.reflect.Array.newInstance(Packages.java.lang.Byte.TYPE, 1024);
// 读取数据
var bytesRead = fileInputStream.read(buffer);
// 将字节数组转换为字符串输出
var logContent = "";
if (bytesRead > 0) {
    logContent = new java.lang.String(buffer, 0, bytesRead, Charset.forName("UTF-8"));
}
logContent;

新增应用集数据

importClass(Packages.tornaco.apps.shortx.core.rule.action.ByteArrayWrapper);
importClass(Packages.tornaco.apps.shortx.core.proto.pkgset.PkgSet);
importClass(Packages.tornaco.apps.shortx.core.proto.common.AppPkg);
importClass(Packages.tornaco.apps.shortx.core.OooO0O0);

// 创建一个应用集合名称为 "测试应用集合" 并设置相同的 userId(为0)
var appPkgNames = [
    "com.yangdai.opennote",
    "com.github.android",
    "FPS.Watcher"
];

var pkgSetBuilder = PkgSet.newBuilder()
    .setLabel("测试应用集合")           // 设置应用集合名称
    .setDescription("")
    .setIsPrebuilt(false);

// 创建多个 AppPkg 对象并添加到 PkgSet 中
for (var i = 0; i < appPkgNames.length; i++) {
    var appPkg = AppPkg.newBuilder()
        .setPkgName(appPkgNames[i])    // 设置每个应用的包名
        .setUserId(0)                  // 设置 userId 为 0
        .build();
    pkgSetBuilder.addAppPkgs(appPkg);   // 将应用包添加到 PkgSet 中
}
// 构建 PkgSet
var pkgSet = pkgSetBuilder.build();

// 将 PkgSet 转换为字节数据
var byteData = pkgSet.toByteArray();

// 将字节数据封装为 ByteArrayWrapper
var byteArrayWrapper = new ByteArrayWrapper(byteData);
// 调用 addPkgSet 方法来添加该 ByteArrayWrapper
var iShortX = OooO0O0.OooO00o();
iShortX.addPkgSet(byteArrayWrapper);

指定App添加动态快捷方式

// 给指定应用指定用户动态快捷方式添加指定Intent URI
importClass(android.content.Context);
importClass(android.content.pm.ShortcutInfo);
importClass(android.graphics.drawable.Icon);
importClass(android.content.Intent);
importClass(android.os.ServiceManager);
importClass(android.content.pm.ParceledListSlice);
importClass(java.util.ArrayList);
importClass(android.os.UserHandle);

// ===== 目标包名 =====
var targetPackage = "tornaco.apps.shortx";

// ===== 指定要写入的 Intent URI =====
var intentUri = `intent:#Intent;action=com.tmessages.openchat0;component=org.telegram.messenger/.OpenChatReceiver;l.chatId=1604486631;end`;

try {
    var context = context.createPackageContext(targetPackage,Context.CONTEXT_IGNORE_SECURITY);
    
    var targetIntent = Intent.parseUri(intentUri, 0);
    targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    // ===== 新快捷方式ID =====
    var shortcutId = "shortcut_00001";

    var newShortcut = new ShortcutInfo.Builder(context, shortcutId)
        // 快捷方式 桌面显示名称
        .setShortLabel("ShortX群组")
        // 长名称
        .setLongLabel("ShortX群组")
        .setIcon(
            Icon.createWithResource(
                context,
                context.getApplicationInfo().icon
            )
        )
        .setIntent(targetIntent)
        .build();

    // 创建 ParceledListSlice 包装的快捷方式信息列表
    var shortcutInfoList = new ArrayList();
    shortcutInfoList.add(newShortcut);

    // 获取到 "shortcut" 服务
    var shortcutService = ServiceManager.getService("shortcut");

    if (shortcutService) {
        // 使用 addDynamicShortcuts 方法添加动态快捷方式
        shortcutService.addDynamicShortcuts(targetPackage, new ParceledListSlice(shortcutInfoList), 0);
    } else {
        throw "Shortcut 服务不可用";
    }

    shortcutId;
} catch (e) {
    "写入失败: " + e;
}

从指定App中移除指定ID的动态快捷方式

android.os.ServiceManager.getService("shortcut").removeDynamicShortcuts("tornaco.apps.shortx", ["shortcut_00001"], 0);
// 从指定App中移除指定ID的动态快捷方式

清空指定App的所有动态快捷方式

android.os.ServiceManager.getService("shortcut").removeAllDynamicShortcuts("tornaco.apps.shortx", 0);
// 清空指定App的所有动态快捷方式

将指定APP快捷方式请求固定桌面

Intent = android.content.Intent;

targetPackage = "tornaco.apps.shortx";

// 创建一个 Intent
intentUri = `intent:#Intent;action=com.tmessages.openchat0;component=org.telegram.messenger/.OpenChatReceiver;l.chatId=1604486631;end`;

targetIntent = Intent.parseUri(intentUri, 0);
    targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
context = context.createPackageContext(targetPackage, 2);

// 创建一个 ShortcutInfo
shortcut = android.content.pm.ShortcutInfo.Builder(context, "shortcut_001")
        // 快捷方式 桌面显示名称
        .setShortLabel("ShortX群组")
        // 长名称
        .setLongLabel("ShortX群组")
        .setIcon(
            android.graphics.drawable.Icon.createWithResource(
                context,
                context.getApplicationInfo().icon
            )
        )
        .setIntent(targetIntent)
        .build();
shortcutService = android.os.ServiceManager.getService("shortcut").requestPinShortcut(targetPackage, shortcut, null, 0);

获取指定App的所有快捷方式信息

// 获取指定App的所有快捷方式信息
targetPackage = "tornaco.apps.shortx";

// 1. 获取 ShortcutService 的 IBinder
var shortcutService = android.os.ServiceManager.getService("shortcut");
if (!shortcutService) {
    throw "无法获取 shortcut 服务";
}
// ==================== 主流程 ====================
var MATCH_ALL = 0x0000000F; // MATCH_MANIFEST (1) | MATCH_DYNAMIC (2) | MATCH_PINNED (4) | MATCH_CACHED (8)

var slice = shortcutService.getShortcuts(targetPackage, MATCH_ALL, userId);
var shortcutList = slice.getList();

var result = [];

if (shortcutList && shortcutList.size() > 0) {
    for (var i = 0; i < shortcutList.size(); i++) {
        var shortcutItem = shortcutList.get(i);  // 获取每个快捷方式
        
        // 反射所有字段
        var fields = shortcutItem.getClass().getDeclaredFields();
        var shortcut = {};

        // 遍历字段并输出字段名及其值
        for (var j = 0; j < fields.length; j++) {
            var field = fields[j];
            field.setAccessible(true); // 允许访问私有字段
            try {
                var fieldName = field.getName();  // 获取字段名
                var fieldValue = field.get(shortcutItem);  // 获取字段值
                
                // 将字段名和值加入到结果中
                shortcut[fieldName] = fieldValue ? fieldValue.toString() : "null";
            } catch (e) {
                shortcut[fieldName] = "无法获取值";
            }
        }
        
        result.push(shortcut); // 添加到结果数组
    }
}

// 输出结果
JSON.stringify(result, null, 2);

获取指定用户的默认主屏启动器包名

android.os.ServiceManager.getService("shortcut").getDefaultLauncher(0);
// 获取指定用户的默认主屏启动器包名

解锁

android.os.ServiceManager.getService("window").dismissKeyguard(null, null);
// 其实就是Xposed Edge中的解锁动作

输出附件所有的WiFi名称

// 输出附件所有的WiFi名称
scanResults = context.getSystemService("wifi").getScanResults();

// 使用HashSet保证SSID唯一性
uniqueSSIDs = new java.util.HashSet();

for (var i = 0; i < scanResults.size(); i++) {
     result = scanResults.get(i);
    uniqueSSIDs.add(result.SSID); 
}

wifiInfo = "";
iterator = uniqueSSIDs.iterator();
while (iterator.hasNext()) {
    wifiInfo += iterator.next() + "\n";  // 拼接SSID
}

wifiInfo;

输出所有的WiFi Mac地址

// 输出所有的WiFi Mac地址
var scanResults = context.getSystemService("wifi").getScanResults();

// 使用HashSet保证BSSID唯一性
uniqueBSSIDs = new java.util.HashSet();

for (var i = 0; i < scanResults.size(); i++) {
    var result = scanResults.get(i);
    uniqueBSSIDs.add(result.BSSID);  // 只加入BSSID
}

bssidInfo = "";
iterator = uniqueBSSIDs.iterator();
while (iterator.hasNext()) {
    bssidInfo += iterator.next() + "\n";  // 拼接BSSID (Mac地址)
}

bssidInfo;

触发WiFi扫描

context.getSystemService("wifi").startScan();  
 // 触发WiFi扫描

设置强身份验证(禁用生物验证)

// 即单次禁用生物识别(人脸、指纹等)
android.os.ServiceManager.getService("lock_settings").requireStrongAuth(32, 0);
// (int strongAuthReason, int userId)

/*
strongAuthReason 
0 - 不需要强身份验证
1 - 设备启动后需要强身份验证
2 - 设备管理器锁定后需要强身份验证
8 - 设备锁定后需要强身份验证
16 - 超时后需要强身份验证
32 - 用户锁定后需要强身份验证
64 - 无人值守更新时需要强身份验证
128 - 非强生物识别超时后需要强身份验证
256 - 信任代理过期后需要某种身份验证
512 - 适应性认证请求后需要某种身份验证
772 - 允许生物识别身份验证
*/

静默卸载指定用户指定应用

// 静默卸载指定用户指定应用
packageManager = android.os.ServiceManager.getService("package");
packageName = "com.google.android.apps.photos";
userid = 0;
// 获取版本号
version = packageManager.getPackageInfo(packageName, 128, userid).versionCode;

packageManager.deletePackageAsUser(packageName, version, null, userid, 2);

// (String packageName, int versionCode, IPackageDeleteObserver observer, int userId, int flags)
/*
Deletion Flags
1 - 删除应用但保留数据
2 - 删除所有用户的数据
4 - 允许删除系统应用
8 - 删除但不杀死应用进程
16 - 存档应用(而非完全删除)
*/
© 版权声明
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容