不同Android版本裝置正確擷取螢幕解析度的通用方法 談到android螢幕解析度,大家都知道,但是怎麼正確的擷取螢幕的解析度呢?android2.2\2.3\4.0\4.1使用的方法一樣嗎? 答案是否定的。事物是發展變化的,android也不例外,android2.2、2.3因為標配是有觸控螢幕按鈕的,也就是說觸控螢幕上BACK、HOME、MEAN是在觸控螢幕解析度識別範圍之外的。但是在android4.0以後,已經取消了,開始使用軟體按鈕了,在螢幕的下方會佔掉一定的高度,因此使用同樣的方法去取螢幕解析度,可能得到的值會不大一樣。 筆者使用的android4.0平台,螢幕解析度是1280X800寫了一個能稍微智能一點,能正確擷取螢幕解析度的方法,主要修改代碼: [html] @@ -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); 運行列印如下: [plain] 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裡面也有擷取螢幕解析度的介面:主要代碼如下,大同小異, [java] WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); android.view.Display display = wm.getDefaultDisplay(); int width = display.getRawWidth(); int height = display.getRawHeight(); 通過使用筆者提供的介面,可以正確的擷取不同android版本的裝置擷取到正確的螢幕解析度,難度不是很大,方法簡單,其實都是android現成的東西,但是對還不瞭解的同學來說還是很有好處的。