如何使用 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
。所以是的,如果this
是Activity
、Service
或其他父类是Context
。我已将完整代码添加到我的答案中。
我没有出错,但它不会改变分辨率。我在简单的新项目上尝试过。有什么想法吗?
我在清单文件中声明了 WRITE_SECURE_SETTINGS 权限。然后我安装应用程序。然后我使用 adb 命令授予权限。然后我运行应用程序。之后我重新启动手机。重新启动后,我的设备分辨率发生了变化。这就是我所做的一切。
重启后就可以了。你能写代码来改变dpi吗?您知道如何在不重新启动的情况下更改分辨率和 dpi 吗?无论如何,非常感谢您的帮助。以上是关于如何使用 Android 代码更改分辨率(大小)和密度,Runtime.getRuntime().exec(...) 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
更改分辨率时如何保留其他应用程序窗口的大小和位置? (例如,以非桌面分辨率来回全屏游戏)
国产系统——银河麒麟 在VMware虚拟机中如何更改窗口分辨率(大小)?