如何使用 Android 代码更改分辨率(大小)和密度,Runtime.getRuntime().exec(...) 不起作用

Posted

技术标签:

【中文标题】如何使用 Android 代码更改分辨率(大小)和密度,Runtime.getRuntime().exec(...) 不起作用【英文标题】:How to change resolution(size) and density with Android Code, Runtime.getRuntime().exec(...) doens't works 【发布时间】:2020-01-14 11:49:07 【问题描述】:

我想使用我的应用程序切换手机的分辨率和密度(不想使用 ADB)。

当我使用Runtime.getRuntime().exec("wm density 220") 时,它不会 在 AVD 上工作,也可以在我的带有自定义 ROM 的 root 手机 Galaxy S8 上工作。 当我使用Runtime.getRuntime().exec("wm size 1080x1920")时 在我的 Galaxy S8 上更改分辨率,但在 AVD 上没有。

我将android.permission.WRITE_SECURE_SETTINGS 授予我的所有设备。

我已经尝试过的:

    具有通过授予的超级用户权限 (Runtime.getRuntime().exec("su"),我仍然无法改变密度 我的应用 我可以在任何设备上使用 adb 命令更改密度和大小(分辨率) 设备 我可以使用应用程序 Tasker 更改大小(分辨率)(这个 应用程序有 android.permission.WRITE_SECURE_SETTINGS) 但它 不可能改变密度。 Tasker 的变化密度是 只有 root 才有可能。 应用程序第二个屏幕(也有 android.permission.WRITE_SECURE_SETTINGS 并且可以下载 Github 上的源代码)可以改变我的 AVD 的分辨率和密度 在我没有 ROOT 的 Galaxy S8 上 使用终端仿真器,我可以更改大小和密度 仅使用 ROOT 应用程序第二个屏幕,并且在此站点上也提到过: http://nomone.com/2016/10/11/modifying-android-system-settings/ 使用代码“Settings.Global.putString”这应该可以解决我的问题, 但我不知道如何使用它。你能帮帮我吗?
//Part of the code used from http://nomone.com/ and is also used in app
//Second Screen, there they don't use Runtime.getRuntime.exec("...")
Settings.Global.putString(
mContext.getContentResolver(),
Settings.Global.DISPLAY_SIZE_FORCED, width + "," + height);

//this is part of the code with Runtime.getRuntime
Process process = Runtime.getRuntime().exec("wm density 220");
process.waitFor();

【问题讨论】:

主要问题是,设置“Settings.Global.DISPLAY_SIZE_FORCED”不存在。我也尝试了 Settings.Secure.DISPLAY_SIZE_FORCED,但仍然有很多人在互联网上写到这个设置。 在应用程序中使用第二个屏幕: Class.forName("android.view.IWindowManager") .getMethod("setForcedDisplaySize", int.class, int.class, int.class) .invoke(getWindowManagerService (), Display.DEFAULT_DISPLAY, 宽度, 高度); 【参考方案1】:

Settings.Global.DISPLAY_SIZE_FORCED 存在,但不可访问。您可以使用该字符串常量的实际值

所以代码是:

Settings.Global.putString(mContext.getContentResolver(),
                "display_size_forced", 
                 width + "," + height);

如果我通过终端使用 adb 命令授予 WRITE_SECURE_SETTINGS 权限,则此代码适用于我的 android 9 设备:

adb pm grant <package name> android.permission.WRITE_SECURE_SETTINGS 

我很惊讶,但屏幕分辨率会更改为没有 root 的新分辨率。我不知道没有 adb 命令怎么办。

编辑:我就是这么称呼这个方法的:

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Settings.Global.putString(getContentResolver(),
                "display_size_forced",
                width + "," + height);
    

在清单文件中添加权限:

 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

【讨论】:

我应该如何初始化mContext?可能是:上下文 mContext = this; ? 应该链接到Context。所以是的,如果thisActivityService 或其他父类是Context。我已将完整代码添加到我的答案中。 我没有出错,但它不会改变分辨率。我在简单的新项目上尝试过。有什么想法吗? 我在清单文件中声明了 WRITE_SECURE_SETTINGS 权限。然后我安装应用程序。然后我使用 adb 命令授予权限。然后我运行应用程序。之后我重新启动手机。重新启动后,我的设备分辨率发生了变化。这就是我所做的一切。 重启后就可以了。你能写代码来改变dpi吗?您知道如何在不重新启动的情况下更改分辨率和 dpi 吗?无论如何,非常感谢您的帮助。

以上是关于如何使用 Android 代码更改分辨率(大小)和密度,Runtime.getRuntime().exec(...) 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

更改分辨率时如何保留其他应用程序窗口的大小和位置? (例如,以非桌面分辨率来回全屏游戏)

在 Android 中根据屏幕分辨率更改 View 的高度

Pyglet:全屏时如何更改分辨率?

国产系统——银河麒麟 在VMware虚拟机中如何更改窗口分辨率(大小)?

React-Native:如何缩放字体大小以支持 Android 和 iOS 中的许多不同分辨率和屏幕?

如何在android中更改图像大小?