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);
    }
}
 
 
Back to Top