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