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

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

 

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

     
答案是否定的。事物是发展变化的,android也不例外,android2.2、2.3因为标配是有触摸屏按钮的,也就是说触摸屏上BACK、HOME、MEAN是在触摸屏分辨率识别范围之外的。但是在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.0、4.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现成的东西,但是对还不了解的同学来说还是很有好处的。

 

 

时间: 2024-12-10 09:44:35

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

Android 获取屏幕分辨率

原文:Android 获取屏幕分辨率 得到一个屏幕尺寸的三种方法如下:        // 通过WindowManager获取        DisplayMetrics dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);         // 通过Resources获取         DisplayMetrics dm2 = getResources().getDis

Android编程获取手机屏幕分辨率大小的方法

本文实例讲述了Android编程获取手机屏幕分辨率大小的方法.分享给大家供大家参考,具体如下: import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.widget.TextView; public class A03Activity extends Activity { private TextView mTextView01; /** C

[Android问答] 如何获得手机屏幕分辨率?

[Android问答] 如何获得手机屏幕分辨率? 这个问题并不复杂,但是问的人实在很多,所以还是集中回答一下. 从Android 3.2(API Level 13)开始,在Activity里使用下面的方法来获取屏幕分辨率(单位是像素): Display display = getWindowManager().getDefaultDisplay(); //Activity#getWindowManager() Point size = new Point(); display.getSize(s

获取屏幕分辨率的VBS代码_vbs

我想到的方法有两种. 一种是WMI中的Win32_DesktopMonitor类 复制代码 代码如下: strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select * from Win32_Desktop

Android基于Sensor感应器获取重力感应加速度的方法_Android

本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法.分享给大家供大家参考,具体如下: FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠谱,所以想到了android强大的感应器... 很多移动设备都内置了感应器,android通过Sensor和SensorManager类抽象了这些感应器,通过这些类可以使用android设备的传感器 一 介绍Sensor类 SDK只有一句介绍"Class representing a

Android基于Sensor感应器获取重力感应加速度的方法

本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法.分享给大家供大家参考,具体如下: FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠谱,所以想到了android强大的感应器... 很多移动设备都内置了感应器,android通过Sensor和SensorManager类抽象了这些感应器,通过这些类可以使用android设备的传感器 一 介绍Sensor类 SDK只有一句介绍"Class representing a

android获得当前view在屏幕中坐标的方法_Android

本文实例讲述了android获得当前view在屏幕中坐标的方法.分享给大家供大家参考.具体如下: final int[] location = new int[2]; view.getLocationOnScreen(location); 这样就可以得到该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是说包括了通知栏的高度) //获取在当前屏幕内的绝对坐标 location[0] x坐标 location[1] y坐标 应用 ,我们可以用来记录上一次listview滚动到了那

android获得当前view在屏幕中坐标的方法

本文实例讲述了android获得当前view在屏幕中坐标的方法.分享给大家供大家参考.具体如下: final int[] location = new int[2]; view.getLocationOnScreen(location); 这样就可以得到该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是说包括了通知栏的高度) //获取在当前屏幕内的绝对坐标 location[0] x坐标 location[1] y坐标 应用 ,我们可以用来记录上一次listview滚动到了那

javascript使用for循环批量注册的事件不能正确获取索引值的解决方法_javascript技巧

本文实例讲述了javascript使用for循环批量注册的事件不能正确获取索引值的解决方法.分享给大家供大家参考.具体分析如下: 可能不少朋友会遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name=&q