web-dev-qa-db-ja.com

Android DisplayMetricsが誤った画面サイズをピクセルで返すICS

私はこれを試しました...

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int fullscreenheight = metrics.heightPixels;
int fullscreenwidth = metrics.widthPixels;

そして....

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Gnexのディスプレイは720×1280です。幅/高さの返される結果(もちろん方向によって異なります)が決して1280になることはありません。これは、アイスクリームサンドイッチの画面上のナビゲーションバーに関係しているのではないかと思ったので、次のように非表示にします。

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

...そして、画面サイズの高さ/幅を継続的に記録するスレッドを開始しました。 ICSナビゲーションバーが完全になくなった後も...画面サイズが1280の値を報告することはありません。次のような数値が表示されます。

width  = 720
height = 1184

ICSで真のデバイス画面解像度をどのように取得しますか?

この値が必要な理由は、アプリがビデオを再生するため、デバイスが横向きのときにビデオが画面全体に表示されるようにするためです。今私はあなたが何を考えているのか知っています、ビデオビューに高さ/幅の「match_parent」の値を単に与えないのはなぜですか?その理由は、ビデオに複数のアスペクト比があり、画面の幅全体に応じて正しいビデオサイズを計算できるようにしたいためです。

22
dell116

ICSだけにこの隠された宝物を見つけました……ICSより高いAPIをターゲットにしている場合は、以下のChris Schmichのコメントを参照してください。

Android ICSビルドでナビゲーションバーを非表示および表示する方法

リンクが切れた場合...実際のデバイスの画面サイズを取得する方法は次のとおりです。

Display display = getWindowManager().getDefaultDisplay();     
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);

[〜#〜]編集[〜#〜](11/19/12)

上記のコードはAndroid 4.2では機能せず、例外がスローされます。..Android 4.2でデバイスの全画面サイズを取得する方法をまだ見つけていません。私がそうするとき、私はこの答えを編集しますが、今のところ、あなたはAndroid 4.2のために偶然でコーディングするべきです!!

19
dell116

アーメドの答えから、これはエラーのない完全なコードです:

    int width = 0, height = 0;
    final DisplayMetrics metrics = new DisplayMetrics();
    Display display = getWindowManager().getDefaultDisplay();
    Method mGetRawH = null, mGetRawW = null;

    try {
        // For JellyBean 4.2 (API 17) and onward
        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
            display.getRealMetrics(metrics);

            width = metrics.widthPixels;
            height = metrics.heightPixels;
        } else {
            mGetRawH = Display.class.getMethod("getRawHeight");
            mGetRawW = Display.class.getMethod("getRawWidth");

            try {
                width = (Integer) mGetRawW.invoke(display);
                height = (Integer) mGetRawH.invoke(display);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    } catch (NoSuchMethodException e3) {  
        e3.printStackTrace();
    }
19
Frank Nguyen

getRealSize を使用して画面の解像度を取得できます。 API 17以降で正式にサポートされていますが、API 14以降のSDKに実際に存在します。API17以降のSDKプラットフォームを使用している場合は、メソッドに通常どおりアクセスして、APIでのみ使用できるという警告をバイパスできます。 17。

/**
 * Gets the device's native screen resolution rotated
 * based on the device's current screen orientation.
 */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) //To remove warning about using
                                               //getRealSize prior to API 17
private Point screenResolution() {
    WindowManager windowManager =
        (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Point screenResolution = new Point();

    if (Build.VERSION.SDK_INT < 14)
        throw new RuntimeException("Unsupported Android version.");
    display.getRealSize(screenResolution);

    return screenResolution;    
}

私はこれを実際のAndroid 5.0.2デバイスと4.1.1(および他の可能性のある)を実行しているエミュレータ)でテストしました。

bencコメントでこれを指摘 に感謝します。

10
Sam

これを試して

    final DisplayMetrics metrics = new DisplayMetrics(); 
    Display display = getWindowManager().getDefaultDisplay();     
    Method mGetRawH = null,mGetRawW = null;

    try {
                    // For JellyBeans and onward
        if(Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN){
            display.getRealMetrics(metrics);

            realWidth = metrics.widthPixels;
            realHeight = metrics.heightPixels;
        }else{
            mGetRawH = Display.class.getMethod("getRawHeight");
            mGetRawW = Display.class.getMethod("getRawWidth");

            try {
                realWidth = (Integer) mGetRawW.invoke(display);
                realHeight = (Integer) mGetRawH.invoke(display);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
6
Ahmed
public static Point getRealSize(Display display) {
        Point outPoint = new Point();
        Method mGetRawH;
        try {
            mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            outPoint.x = (Integer) mGetRawW.invoke(display);
            outPoint.y = (Integer) mGetRawH.invoke(display);
            return outPoint;
        } catch (Throwable e) {
            return null;
        }
    }

    public static Point getSize(Display display) {
        if (Build.VERSION.SDK_INT >= 17) {
            Point outPoint = new Point();
            DisplayMetrics metrics = new DisplayMetrics();
            display.getRealMetrics(metrics);
            outPoint.x = metrics.widthPixels;
            outPoint.y = metrics.heightPixels;
            return outPoint;
        }
        if (Build.VERSION.SDK_INT >= 14) {
            Point outPoint = getRealSize(display);
            if (outPoint != null)
                return outPoint;
        }
        Point outPoint = new Point();
        if (Build.VERSION.SDK_INT >= 13) {
            display.getSize(outPoint);
        } else {
            outPoint.x = display.getWidth();
            outPoint.y = display.getHeight();
        }
        return outPoint;
    }
3
slartus

一部のデバイスでは、タブレットの場合、バックアップとしてハードウェアボタンがないため、ナビゲーションバーを非表示にすることはできません( source 、「システムUIの可視性のコントロール」を参照)。デバイスでバーを非表示にできた場合は、全画面表示を作成し、getWidth()およびgetHeight()を使用してそのサイズを要求できます。

私の知る限り、すべてのICSデバイスで画面サイズを取得する信頼できる方法はありません。

1
user1340450