屏蔽安卓7.0屏幕显示大小可调的问题

引言

前一阵子在7.0的机子上调试应用,发现设置中有一个显示大小的选项,这个选项可以改变应用显示的大小,即应用显示缩放功能,会改变机子的dpi,导致应用出现屏幕适配的问题。
当然,国内大部分手机厂商已经把此项设置给屏蔽掉了,此处记录该问题,后期项目若遇到该问题,可直接拿来解决。
注:我的解决方法是需要用到framework包下hide的api,只用该方法需要依赖编译安卓源码得到的framework.jar包。此种方法稍微麻烦,如找到其它简易的解决方法,我会贴上。

问题

在设置中改变应用显示大小。
屏蔽安卓7.0屏幕显示大小可调的问题_第1张图片

应用正常情况下:
屏蔽安卓7.0屏幕显示大小可调的问题_第2张图片

异常情况下:
屏蔽安卓7.0屏幕显示大小可调的问题_第3张图片

分析

这个问题,其实因为在设置中设置该选项后,会改变系统的dpi,通过log信息来看一下吧。

先看看通过adb命令查看到的手机屏幕信息:
这里写图片描述

设置中改变显示大小,查看输出屏幕分辨率/density信息。
测试代码:

        //获取densityDpi(方法一)
        int densityDpi = this.getResources().getConfiguration().densityDpi;
        LogUtils.d(TAG, "densityDpi " + densityDpi);
        WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);


        //获取densityDpi(方法二)、获取density
        DisplayMetrics displayMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        int densityDpi1 = displayMetrics.densityDpi;
        float density = displayMetrics.density;
        LogUtils.d(TAG, "densityDpi1 " + densityDpi1);
        LogUtils.d(TAG, "density " + density);
//设置显示大小为"小"时:
05-26 12:02:34.934 D/DeskClockDemo(17240): MainActivity  -----> densityDpi 204
05-26 12:02:34.937 D/DeskClockDemo(17240): MainActivity  -----> densityDpi1 204
05-26 12:02:34.937 D/DeskClockDemo(17240): MainActivity  -----> density 1.275
05-26 12:02:34.979 D/DeskClockDemo(17240): MainActivity  -----> onPageSelected 1
05-26 12:02:35.020 D/DeskClockDemo(17240): MainActivity  -----> topYLimit 77
05-26 12:02:35.020 D/DeskClockDemo(17240): MainActivity  -----> bottomYLimit 408
05-26 12:02:35.020 D/DeskClockDemo(17240): MainActivity  -----> mTouchSlop 10

//设置显示大小为"默认"时:
05-26 12:03:05.902 D/DeskClockDemo(17240): MainActivity  -----> densityDpi 240
05-26 12:03:05.906 D/DeskClockDemo(17240): MainActivity  -----> densityDpi1 240
05-26 12:03:05.906 D/DeskClockDemo(17240): MainActivity  -----> density 1.5
05-26 12:03:05.955 D/DeskClockDemo(17240): MainActivity  -----> onPageSelected 1
05-26 12:03:06.011 D/DeskClockDemo(17240): MainActivity  -----> topYLimit 90
05-26 12:03:06.012 D/DeskClockDemo(17240): MainActivity  -----> bottomYLimit 480
05-26 12:03:06.012 D/DeskClockDemo(17240): MainActivity  -----> mTouchSlop 12

通过log信息可以看到,改变显示大小后,相应的density以及densityDpi都相应的改变了,自然的,我们布局当中使用的dp也会随之改变。那么,屏蔽的方法自然就是,在你的app中,界面形成之前,把dpi手动的改为手机原始的(init)默认的dpi即可。
话不多说,还是直接贴代码,一看了然。

应用中屏蔽该问题的方法

先看方法:

    /**
     * 获取手机出厂时默认的densityDpi
     * @param displayId
     * @return
     */
    public static int getDefaultDisplayDensity(int displayId) {
        try {
            final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
            return wm.getInitialDisplayDensity(displayId);
        } catch (RemoteException exc) {
            return -1;
        }
    }

    /**
     * 获取手机出厂时默认的densityDpi并设置给手机
     * 在需要用到的activity中的onCreate中调用该方法
     * @param context
     */
    public static void setDefaultDisplay(Context context) {
        if(Build.VERSION.SDK_INT > 23) {
            Configuration origConfig = context.getResources().getConfiguration();
            origConfig.densityDpi = getDefaultDisplayDensity(Display.DEFAULT_DISPLAY);//获取手机出厂时默认的densityDpi
            context.getResources().updateConfiguration(origConfig, context.getResources().getDisplayMetrics());
        }
    }

使用方式,在需要屏蔽的activity的onCreate方法中调用,建议在BaseActivity中调用:
屏蔽安卓7.0屏幕显示大小可调的问题_第4张图片

以上,即可。

你可能感兴趣的:(android知识点)