You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备如何通过代码设置第二屏幕DPI?

问题分析与解决

一、代码执行wm命令无效的原因及修正

你用ADB执行wm density 160 -d 1能生效,是因为ADB默认拥有root/系统级权限,但你的APP通过Runtime.getRuntime().exec()执行命令时,默认是普通APP权限,没有修改系统显示参数的权限,这是核心问题。

要让代码生效,需要满足两个条件:

  • 设备已root,且你的APP获取了root权限
  • 执行命令时需要通过su提权,正确的命令格式如下:
try {
    // 用su -c包裹wm命令,确保以root权限执行
    Runtime.getRuntime().exec(new String[]{
        "su",
        "-c",
        "wm density " + Constants.DPI_TO_SET_DEVICE_TO + " -d 1"
    });
} catch (IOException e) {
    throw new RuntimeException(e);
}

另外,建议增加执行状态检查,避免因命令未正确执行导致无效果:

try {
    Process process = Runtime.getRuntime().exec(new String[]{
        "su",
        "-c",
        "wm density " + Constants.DPI_TO_SET_DEVICE_TO + " -d 1"
    });
    // 等待命令执行完成,获取退出码
    int exitCode = process.waitFor();
    if (exitCode != 0) {
        // 读取错误输出排查问题
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        String errorMsg = errorReader.readLine();
        throw new RuntimeException("设置DPI失败:" + errorMsg);
    }
} catch (IOException | InterruptedException e) {
    throw new RuntimeException(e);
}

二、关于DisplayMetrics的疑问

你的理解是对的——DisplayMetrics无法设置第二显示屏的DPI。它只是一个读取当前显示设备(主屏/指定副屏)分辨率、DPI等参数的工具类,所有字段都是只读的,没有提供修改系统显示参数的API。要修改系统级DPI,只能通过wm命令或者需要系统签名权限的底层API。

内容的提问来源于stack exchange,提问作者Dwebtron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:52:03