import android.content.Intent;
import android.provider.AlarmClock;

// 定义闹钟的属性
String message = "闹钟标签"; // 闹钟标签
int hour = 17;               // 闹钟小时(24小时制)
int minutes = 30;           // 闹钟分钟

// 创建一个系统闹钟的 Intent
Intent alarmIntent = new Intent(AlarmClock.ACTION_SET_ALARM);
alarmIntent.putExtra(AlarmClock.EXTRA_MESSAGE, message);
alarmIntent.putExtra(AlarmClock.EXTRA_HOUR, hour);
alarmIntent.putExtra(AlarmClock.EXTRA_MINUTES, minutes);
alarmIntent.putExtra(AlarmClock.EXTRA_SKIP_UI, true); // 设置跳过UI

// 为 Intent 添加 FLAG_ACTIVITY_NEW_TASK 标志
alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

// 发送 Intent,设置系统闹钟
context.startActivity(alarmIntent);

// 返回设置成功的信息
return "系统闹钟已设置成功";
import android.os.ServiceManager;
import android.hardware.input.IInputManager;
import android.view.InputDevice;  // 导入 InputDevice 类
import android.os.IBinder;

// 获取 IInputManager 接口
IBinder binder = ServiceManager.getService("input");
IInputManager inputManager = IInputManager.Stub.asInterface(binder);

// 获取设备ID
int[] deviceIds = inputManager.getInputDeviceIds();
int touchDeviceId = -1;

// 遍历输入设备并找到触摸设备
for (int id : deviceIds) {
    int sources = inputManager.getInputDevice(id).getSources(); // 获取输入设备源
    if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
        touchDeviceId = id;
    }
}

// 如果找到触摸设备,启用它
if (touchDeviceId != -1) {
    // 调用 IInputManager 的启用方法
    inputManager.enableInputDevice(touchDeviceId);  // 请替换为实际启用调用
    // 输出启用的设备 ID
    "启用触摸设备 ID: " + touchDeviceId;
}
import android.os.ServiceManager;
import android.hardware.input.IInputManager;
import android.view.InputDevice;  // 导入 InputDevice 类
import android.os.IBinder;

// 获取 IInputManager 接口
IBinder binder = ServiceManager.getService("input");
IInputManager inputManager = IInputManager.Stub.asInterface(binder);

// 获取设备ID
int[] deviceIds = inputManager.getInputDeviceIds();
int touchDeviceId = -1;

// 遍历输入设备并找到触摸设备
for (int id : deviceIds) {
    int sources = inputManager.getInputDevice(id).getSources(); // 获取输入设备源
    if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
        touchDeviceId = id;
    }
}

// 如果找到触摸设备,禁用它
if (touchDeviceId != -1) {
    // 调用 IInputManager 的禁用方法
    inputManager.disableInputDevice(touchDeviceId);  // 请替换为实际禁用调用
    // 输出禁用的设备 ID
    "禁用触摸设备 ID: " + touchDeviceId;
}
import android.content.Context;
import android.view.Surface;
import android.view.WindowManager;

// 获取当前的屏幕方向
WindowManager windowManager = context.getSystemService(Context.WINDOW_SERVICE);
int rotation = windowManager.getDefaultDisplay().getRotation();

//设置当前屏幕方向
android.provider.Settings$System.putInt(context.contentResolver, "user_rotation", rotation);

//关闭自动旋转
android.provider.Settings$System.putInt(context.contentResolver, "accelerometer_rotation", 0);
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
import android.os.ServiceManager;
import android.view.SurfaceControl;

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

if (Build.VERSION.SDK_INT < 34) { // Android 14 之前的版本
    // 获取 SurfaceControl 类
    CLASS = Class.forName("android.view.SurfaceControl");

    // 根据 Android 版本获取显示器 Token 方法
    getGetBuiltInDisplayMethod = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
        CLASS.getMethod("getBuiltInDisplay", Integer.TYPE) :
        CLASS.getMethod("getInternalDisplayToken");

    // 获取显示器 Token
    getBuiltInDisplay = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
        getGetBuiltInDisplayMethod.invoke(null, 0) :
        getGetBuiltInDisplayMethod.invoke(null);

    // 设置电源模式
    method = CLASS.getMethod("setDisplayPowerMode", IBinder, Integer.TYPE);
    if (displayMode == 0 || displayMode == 2) {
        method.invoke(null, getBuiltInDisplay, displayMode);
    }
} else { // Android 14 及以上版本
    // 获取 SurfaceFlinger 服务
    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();
    int displayCount = parcelReply.readInt();
    long[] displayIds = new long[displayCount];

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

    // 遍历每个显示器,设置电源模式
    for (displayId : displayIds) {
        // 开启电源模式
        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();
        IBinder displayToken = parcelReply.readStrongBinder();
        parcelData.recycle();
        parcelReply.recycle();

        // 直接调用 SurfaceControl 的方法,设置电源模式
        SurfaceControl.setDisplayPowerMode(displayToken, displayMode);
    }
}
import android.content.Context;
import android.view.Surface;
import android.view.WindowManager;

// 获取当前的屏幕方向
WindowManager windowManager = context.getSystemService(Context.WINDOW_SERVICE);
int rotation = windowManager.getDefaultDisplay().getRotation();

//设置当前屏幕方向
android.provider.Settings$System.putInt(context.contentResolver, "user_rotation", rotation);

//关闭自动旋转
android.provider.Settings$System.putInt(context.contentResolver, "accelerometer_rotation", 0);
import android.app.StatusBarManager;
import android.content.Context;

// 获取状态栏管理器
StatusBarManager statusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);

// 恢复所有图标
statusBarManager.disable(0); // 0表示不禁用任何功能
import android.app.StatusBarManager;
import android.content.Context;

// 获取状态栏管理器
StatusBarManager statusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);

// 尝试隐藏通知和系统信息以及时钟
statusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_SYSTEM_INFO | StatusBarManager.DISABLE_CLOCK);
import java.io.File;

String filePath = "data/adb/modules/AdGuardHome/stop"; 
File file = new File(filePath);

// 返回文件是否存在
return !file.exists();
//不存在输出true
import android.app.StatusBarManager;
import android.content.Context;
import java.lang.reflect.Method;
// 获取StatusBarManager的实例
statusBarManager = context.getSystemService("statusbar");

// 使用反射获取方法
Class statusBarManagerClass = Class.forName("android.app.StatusBarManager");

// 获取展开设置面板和收起所有面板的方法
Method expandSettingsPanel = statusBarManagerClass.getDeclaredMethod("expandSettingsPanel");
Method collapsePanels = statusBarManagerClass.getDeclaredMethod("collapsePanels");

// 调用展开控制中心的方法
expandSettingsPanel.invoke(statusBarManager);

// 调用收起通知栏的方法
collapsePanels.invoke(statusBarManager);
import android.app.ActivityManager;
import android.content.Context;

am = context.getSystemService(Context.ACTIVITY_SERVICE);
recentTasks = am.getRecentTasks(100, ActivityManager.RECENT_IGNORE_UNAVAILABLE); // 获取最近的任务列表

for (task : recentTasks) {
    if (task.baseIntent.getComponent().getPackageName() == "tornaco.apps.shortx") {
        return task.id; // 返回匹配包名的 taskId
    }
}
return -1; // 如果找不到指定包名的 taskId,返回 -1
音乐信息获取
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.media.MediaMetadata;
import java.util.List; // 确保导入List

// 获取MediaSessionManager实例
MediaSessionManager mediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);

// 获取所有活跃的MediaController
List mediaControllers = mediaSessionManager.getActiveSessions(null); // 避免使用泛型

// 初始化输出结果
StringBuilder output = new StringBuilder();

// 遍历所有MediaController,找到正在播放音乐的控制器
for (Object controller : mediaControllers) {
    if (controller instanceof MediaController) {
        MediaController mediaController = (MediaController) controller;
        PlaybackState playbackState = mediaController.getPlaybackState();
        MediaMetadata mediaMetadata = mediaController.getMetadata();

        // 检查是否正在播放音乐
        if (playbackState != null && mediaMetadata != null) {
            // 获取音乐包名
            String packageName = mediaController.getPackageName();

            // 获取专辑名
            String albumName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ALBUM);

            // 获取歌曲名
            String songName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_TITLE);

            // 获取歌手名
            String artistName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST);

            // 获取音乐总时长
            long totalDuration = mediaMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);

            // 获取当前播放进度
            long currentPosition = playbackState.getPosition();

            // 获取播放状态
            String playbackStatus;
            int state = playbackState.getState();
            if (state == PlaybackState.STATE_PLAYING) {
                playbackStatus = "正在播放";
            } else if (state == PlaybackState.STATE_PAUSED) {
                playbackStatus = "已暂停";
            } else if (state == PlaybackState.STATE_STOPPED) {
                playbackStatus = "已停止";
            } else {
                playbackStatus = "未知状态";
            }

            // 构建当前应用的输出结果
            output.append("音乐包名: ").append(packageName).append("\n");
            output.append("专辑名: ").append(albumName != null ? albumName : "未知").append("\n");
            output.append("歌曲名: ").append(songName != null ? songName : "未知").append("\n");
            output.append("歌手名: ").append(artistName != null ? artistName : "未知").append("\n");
            output.append("总时长: ").append(totalDuration).append(" 毫秒\n");
            output.append("播放进度: ").append(currentPosition).append(" 毫秒\n");
            output.append("播放状态: ").append(playbackStatus).append("\n\n");
        }
    }
}

// 如果没有找到正在播放的音乐,返回默认提示
if (output.length() == 0) {
    output.append("没有找到正在播放的音乐。");
}

// 返回最终结果
return output.toString();
import android.app.StatusBarManager;
import android.content.Context;

// 获取状态栏管理器
StatusBarManager statusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);

// 尝试隐藏通知和系统信息以及时钟
statusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_SYSTEM_INFO | StatusBarManager.DISABLE_CLOCK);
import android.content.Context;
import android.media.AudioManager;

// 获取系统音频管理器服务
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

// 获取各音量类型的音量值并拼接成字符串
volumeInfo = 
    "铃声音量: " + audioManager.getStreamVolume(AudioManager.STREAM_RING) + ", " +
    "媒体音量: " + audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) + ", " +
    "闹钟音量: " + audioManager.getStreamVolume(AudioManager.STREAM_ALARM) + ", " +
    "通话音量: " + audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL) + ", " +
    "通知音量: " + audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) + ", " +
    "系统音量: " + audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);

// 返回拼接好的音量信息字符串
return volumeInfo;
import android.app.StatusBarManager;
import android.content.Context;
import java.lang.reflect.Method;
// 获取StatusBarManager的实例
statusBarManager = context.getSystemService("statusbar");

// 使用反射获取方法
Class statusBarManagerClass = Class.forName("android.app.StatusBarManager");

// 获取展开设置面板和收起所有面板的方法
Method expandSettingsPanel = statusBarManagerClass.getDeclaredMethod("expandSettingsPanel");
Method collapsePanels = statusBarManagerClass.getDeclaredMethod("collapsePanels");

// 调用展开控制中心的方法
expandSettingsPanel.invoke(statusBarManager);

// 调用收起通知栏的方法
collapsePanels.invoke(statusBarManager);
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
import android.os.ServiceManager;
import android.view.SurfaceControl;

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

if (Build.VERSION.SDK_INT < 34) { // Android 14 之前的版本
// 获取 SurfaceControl 类
CLASS = Class.forName("android.view.SurfaceControl");

// 根据 Android 版本获取显示器 Token 方法
getGetBuiltInDisplayMethod = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
CLASS.getMethod("getBuiltInDisplay", Integer.TYPE) :
CLASS.getMethod("getInternalDisplayToken");

// 获取显示器 Token
getBuiltInDisplay = (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) ?
getGetBuiltInDisplayMethod.invoke(null, 0) :
getGetBuiltInDisplayMethod.invoke(null);

// 设置电源模式
method = CLASS.getMethod("setDisplayPowerMode", IBinder, Integer.TYPE);
if (displayMode == 0 || displayMode == 2) {
method.invoke(null, getBuiltInDisplay, displayMode);
}
} else { // Android 14 及以上版本
// 获取 SurfaceFlinger 服务
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();
int displayCount = parcelReply.readInt();
long[] displayIds = new long[displayCount];

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

// 遍历每个显示器,设置电源模式
for (displayId : displayIds) {
// 开启电源模式
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();
IBinder displayToken = parcelReply.readStrongBinder();
parcelData.recycle();
parcelReply.recycle();

// 直接调用 SurfaceControl 的方法,设置电源模式
SurfaceControl.setDisplayPowerMode(displayToken, displayMode);
}
}
import android.app.StatusBarManager;
import android.content.Context;
import java.lang.reflect.Method;
// 获取StatusBarManager的实例
statusBarManager = context.getSystemService("statusbar");

// 使用反射获取方法
Class statusBarManagerClass = Class.forName("android.app.StatusBarManager");

// 获取展开设置面板和收起所有面板的方法
Method expandSettingsPanel = statusBarManagerClass.getDeclaredMethod("expandSettingsPanel");
Method collapsePanels = statusBarManagerClass.getDeclaredMethod("collapsePanels");

// 调用展开控制中心的方法
expandSettingsPanel.invoke(statusBarManager);

// 调用收起通知栏的方法
collapsePanels.invoke(statusBarManager);
Derp
如何将通过 shortx.executeAction(ShellCommand.newBuilder()...) 运行的 shell 命令的结果返回到 mvel 中?这有可能实现吗?
importClass(Packages.tornaco.apps.shortx.core.proto.action.ShellCommand);
var command = ShellCommand.newBuilder()
.setCommand("ls").build();
shortx.executeAction(command).contextData.get("shellOut")
如何将通过 shortx.executeAction(ShellCommand.newBuilder()...) 运行的 shell 命令的结果返回到 mvel 中?这有可能实现吗?
Back to Top