不同Android版本设备正确获取屏幕分辨率的通用方法

简介: 不同Android版本设备正确获取屏幕分辨率的通用方法         谈到android屏幕分辨率,大家都知道,但是怎么正确的获取屏幕的分辨率呢?android2.2\2.3\4.0\4.1使用的方法一样吗?       答案是否定的。

不同Android版本设备正确获取屏幕分辨率的通用方法

 

      谈到android屏幕分辨率,大家都知道,但是怎么正确的获取屏幕的分辨率呢?android2.2\2.3\4.0\4.1使用的方法一样吗?

      答案是否定的。事物是发展变化的,android也不例外,android2.22.3因为标配是有触摸屏按钮的,也就是说触摸屏上BACKHOMEMEAN是在触摸屏分辨率识别范围之外的。但是在android4.0以后,已经取消了,开始使用软件按钮了,在屏幕的下方会占掉一定的高度,因此使用同样的方法去取屏幕分辨率,可能得到的值会不大一样。

       笔者使用的android4.0平台,屏幕分辨率是1280X800写了一个能稍微智能一点,能正确获取屏幕分辨率的方法,主要修改代码:

@@ -26,12 +26,17 @@ import android.app.ProgressDialog;
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.util.Log;
+import android.util.DisplayMetrics;
+import java.lang.reflect.Method;
+import android.os.Build;
+import android.view.Display;
 
 public class MainActivity extends Activity {
        public Button Btn_Music, Btn_Movie, Btn_DVD, Btn_CMMB;
        public TextView src_title;
        private static final boolean DEBUG = true;
        private int all_src, cur_src;
+       private int screen_w, screen_h;
 
        public static SerialService localService = null;
 
@@ -182,6 +187,8 @@ public class MainActivity extends Activity {
 
                setContentView(R.layout.src_main);
 
+    getDisplayScreenResolution();
+
                connected = 0;
                connect_retry_cnt = 0;
                mConnectCheckTask = new TimerTask() {
@@ -303,6 +310,47 @@ public class MainActivity extends Activity {
                }
        }
 
+public int getDisplayScreenResolution() 
+    {         
+        int ver = Build.VERSION.SDK_INT; 
+
+        DisplayMetrics dm = new DisplayMetrics(); 
+        android.view.Display display = getWindowManager().getDefaultDisplay(); 
+        display.getMetrics(dm); 
+         
+        screen_w  = dm.widthPixels;
+       
+        Log.d(TAG, "Run1 first get resolution:"+dm.widthPixels+" * "+dm.heightPixels+", ver "+ver);
+       if (ver < 13) 
+        { 
+            screen_h = dm.heightPixels; 
+        } 
+        else if (ver == 13) 
+        { 
+            try { 
+                Method mt = display.getClass().getMethod("getRealHeight"); 
+                screen_h = (Integer) mt.invoke(display); 
+            } catch (Exception e) { 
+                e.printStackTrace(); 
+            }  
+        } 
+        else if (ver > 13) 
+        { 
+            try { 
+                Method mt = display.getClass().getMethod("getRawHeight"); 
+                screen_h = (Integer) mt.invoke(display); 
+           
+            } catch (Exception e) { 
+                e.printStackTrace(); 
+            } 
+        }    
+        
+       Log.d(TAG, "Run2 Calibration  resolution:"+screen_w+" * "+screen_h);
+
+        return 0; 
+    }
+
+
        void HideSrcAll() {
                //src_title.setVisibility(View.GONE);
                Btn_Music.setVisibility(View.GONE);

 

运行打印如下:

01-01 09:37:40.989 I/ActivityManager(  174): Start proc com.jeavox.Serial for activity com.jeavox.Serial/.MainActivity: pid=807 uid=10036 gids={}
01-01 09:37:41.059 D/OpenGLRenderer(  361): Flushing caches (mode 1)
01-01 09:37:41.189 D/OpenGLRenderer(  361): Flushing caches (mode 0)
01-01 09:37:41.209 D/MainActivity(  807): Run1 first get resolution:1280 * 740, ver 15
01-01 09:37:41.209 D/MainActivity(  807): Run2 Calibration  resolution:1280 * 800
01-01 09:37:41.279 D/ViewRootImpl(  807): pckname = com.jeavox.Serial
01-01 09:37:41.299 D/ViewRootImpl(  807): pckname = com.jeavox.Serial
01-01 09:37:41.319 E/SerialService(  807): ###################->>>>>> service create <<<<<<<

 

        在android4.0以前,display.getMetrics(dm);就能够获取正确的屏幕分辨率,4.04.1的就不行。所以在Run1 first get resolution:1280 * 740,而使用getRawHeight新方法修正后能得到正确的分辨率Run2 Calibration resolution:1280 * 800。在android4.0 SDK自带的Setting apk里ScreenAdaption.java里面也有获取屏幕分辨率的接口:主要代码如下,大同小异,

	    WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
	    android.view.Display display = wm.getDefaultDisplay();
	    int width     = display.getRawWidth();
	    int height    = display.getRawHeight();


      通过使用笔者提供的接口,可以正确的获取不同android版本的设备获取到正确的屏幕分辨率,难度不是很大,方法简单,其实都是android现成的东西,但是对还不了解的同学来说还是很有好处的。

 

 

目录
相关文章
|
3月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
162 2
|
15天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
40 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
44 2
|
3月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
182 1
|
3月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
119 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
390 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
3月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
48 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
3月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
53 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
3月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
73 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
3月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
44 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
下一篇
无影云桌面