// 只对与手机分辨率相同的显示设备生效,可避免导致全部显示设备同时关闭屏幕电源
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;
        }
    }
}
// 只对与手机分辨率相同的显示设备生效,可避免导致全部显示设备同时关闭屏幕电源

#MVEL表达式 #Javascript
 
 
Back to Top