以编程方式更改系统显示大小Android N

问题描述 投票:9回答:3

Background:除了以前存在的更改Display Size的功能外,Android N还具有从设置更改系统Font Size的功能。

更改显示尺寸

enter image description here

Image Source:pcmag.com

问题

[如果应用具有android.permission.WRITE_SETTINGS权限来更改设置,则有一些方法可以按How to programmatically change font settings of Device: font style and font size?中所述以编程方式更改系统字体大小。但是我找不到以编程方式更改显示尺寸的方法。可能吗?

我尝试了什么?

我已经检查了Settings.System便捷功能列表中可能提供的选项,这些功能可通过编程方式更改设置。

更新

我已经在此处打开了一个功能请求:https://code.google.com/p/android/issues/detail?id=214124。如果您觉得有用,请加注星标。

android android-settings android-7.0-nougat
3个回答
1
投票

只需分享我解决此要求的方法即可。我通过使用肮脏的Java反射方法来实现此功能-尽管效果不佳。

主要参考源代码文件是:

然后,按照以下步骤操作,则可以获取所需的控件:

  1. 读取ZoomScreenSettings .java的onCreate()和commit()。他们演示了如何正确获取密度值并将其设置到框架中。
  2. 读取DisplayDensityUtils .java。它显示了如何使用WindowManagerService控制系统密度。因为我们无法通过反射获取DisplayDensityUtils的实例,所以我们需要了解使用了哪些WindowManagerService方法。
  3. 使用反射获取WindowManagerService的实例,并将类似DisplayDensityUtils的类写入您的项目。
// Where wm is short for window manager
val wmGlobalClz = Class.forName("android.view.WindowManagerGlobal")
val getWmServiceMethod = wmGlobalClz.getDeclaredMethod("getWindowManagerService")
val wmService = getWmServiceMethod.invoke(wmGlobalClz)

val wmInterfaceClz = Class.forName("android.view.IWindowManager")

// Now, we already have the ability to do many things we want.
// For instance, to get the default density value.
val getInitialDisplayDensityMethod = wmInterfaceClz.getDeclaredMethod(
        "getInitialDisplayDensity", 
        Integer.TYPE
)
val defaultDensity = getInitialDisplayDensityMethod.invoke(
        wmService,
        Display.DEFAULT_DISPLAY
) as Int

  1. 使用类DisplayDensityUtils的类设置或获取浓度值。刚提到的一件事是,如果您要传递一个索引值(例如,对于大尺寸的显示器,则为2),请将其馈送到类DisplayDensityUtils的类的mValues数组中,以获取实际的密度值,即传递给框架的权利。获取当前密度指数也适用相同的概念。

0
投票

[引用Settings.System时,有[putConfiguration(ContentResolver cr, Configuration config)](https://developer.android.com/reference/android/provider/Settings.System.html#putConfiguration(android.content.ContentResolver,android.content.res.Configuration))方法。使用此方法是:

便捷功能,用于从Configuration对象写入一批与配置相关的设置。

Configuration

这既包括用户指定的配置选项(语言环境列表和缩放比例),又包括设备配置(例如输入模式屏幕尺寸屏幕方向)。

用屏幕尺寸的SCREENLAYOUT_SIZE_MASK 值设置配置。它是:

SCREENLAYOUT_SIZE_MASK位定义屏幕的整体大小。它们可以是SCREENLAYOUT_SIZE_SMALLSCREENLAYOUT_SIZE_NORMALSCREENLAYOUT_SIZE_LARGESCREENLAYOUT_SIZE_XLARGE之一。

希望它对您有帮助。


0
投票

清单中,正在申请中:android:configChanges="density"

在活动/应用程序中:

public void adjustDisplayScale(Configuration configuration) {
    if (configuration != null) {
        Log.d("TAG", "adjustDisplayScale: " + configuration.densityDpi);
        if(configuration.densityDpi >= 485) //for 6 inch device OR for 538 ppi
            configuration.densityDpi = 500; //decrease "display size" by ~30
        else if(configuration.densityDpi >= 300) //for 5.5 inch device OR for 432 ppi
            configuration.densityDpi = 400; //decrease "display size" by ~30
        else if(configuration.densityDpi >= 100) //for 4 inch device OR for 233 ppi
            configuration.densityDpi = 200; //decrease "display size" by ~30
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(metrics);
        metrics.scaledDensity = configuration.densityDpi * metrics.density;
        this.getResources().updateConfiguration(configuration, metrics);
    }
}

在super.onCreate(..)之后调用它:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adjustDisplayScale( getResources().getConfiguration());

这将在“显示尺寸”的“较小”和“小”设置之间设置显示尺寸,从而覆盖用户设置的任何显示尺寸设置。对于4英寸,5.5英寸,6英寸等设备,它可以正确[。但是我敢肯定,比使用那些if语句会有更好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.