Wie bekomme ich die ScreenSize programmgesteuert in Android

75

Android definiert Bildschirmgrößen als Normal Large XLarge usw.

Es wird automatisch zwischen statischen Ressourcen in entsprechenden Ordnern ausgewählt. Ich benötige diese Daten zum aktuellen Gerät in meinem Java-Code. Die DisplayMetrics gibt nur Auskunft über die aktuelle Gerätedichte. Bezüglich der Bildschirmgröße ist nichts verfügbar.

Ich habe die ScreenSize-Enumeration hier im Grep-Code gefunden. Dies scheint mir jedoch für 4.0 SDK nicht verfügbar zu sein. Gibt es eine Möglichkeit, diese Informationen zu erhalten?

user1454356
quelle

Antworten:

118

Kopieren Sie diesen Code und fügen Sie ihn in Ihren ein. ActivityWenn er ausgeführt wird, wird Toastdie Bildschirmgrößenkategorie des Geräts angezeigt.

int screenSize = getResources().getConfiguration().screenLayout &
        Configuration.SCREENLAYOUT_SIZE_MASK;

String toastMsg;
switch(screenSize) {
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        toastMsg = "Large screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        toastMsg = "Normal screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        toastMsg = "Small screen";
        break;
    default:
        toastMsg = "Screen size is neither large, normal or small";
}
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
Alex Lockwood
quelle
14
Ich habe dies oben verwendet und verschiedene Emulatoren wie groß, mittel, klein ausgeführt. aber ich bekomme Toast normalen Bildschirm .. wie man es löst
Palaniraja
59
private static String getScreenResolution(Context context)
{
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;

    return "{" + width + "," + height + "}";
}
David
quelle
Ihr Code gibt Ergebnis ohne Soft-Touch-Schaltflächen unten und Statusleiste und Symbolleiste oben @David
Umar Ata
Genau das, was ich wollte! Funktioniert wie ein Zauber
Itoun
Vielen Dank. Dieser Code funktioniert gut für mich auf Android-Emulator-Handys und Tablets. Wenn ich das Tablet drehe, werden die Auflösungszahlen nicht invertiert, sondern der tatsächliche Wert ändert sich. Aber für Telefon funktioniert es gut. Wie kann ich das lösen?
SAIFI369
14

Bildschirmgröße bestimmen:

int screenSize = getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK;
  switch(screenSize) {
      case Configuration.SCREENLAYOUT_SIZE_LARGE:
        Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
         break;
       case Configuration.SCREENLAYOUT_SIZE_NORMAL:
          Toast.makeText(this, "Normal screen",Toast.LENGTH_LONG).show();
           break;
       case Configuration.SCREENLAYOUT_SIZE_SMALL:
           Toast.makeText(this, "Small screen",Toast.LENGTH_LONG).show();
           break;
       default:
           Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();

 }

Dichte bestimmen:

int density= getResources().getDisplayMetrics().densityDpi;
   switch(density)
  {
  case DisplayMetrics.DENSITY_LOW:
     Toast.makeText(context, "LDPI", Toast.LENGTH_SHORT).show();
      break;
  case DisplayMetrics.DENSITY_MEDIUM:
       Toast.makeText(context, "MDPI", Toast.LENGTH_SHORT).show();
      break;
  case DisplayMetrics.DENSITY_HIGH:
      Toast.makeText(context, "HDPI", Toast.LENGTH_SHORT).show();
      break;
  case DisplayMetrics.DENSITY_XHIGH:
       Toast.makeText(context, "XHDPI", Toast.LENGTH_SHORT).show();
      break;
  }

für Ref: http://devl-android.blogspot.in/2013/10/wifi-connectivity-and-hotspot-in-android.html

Anshu P.
quelle
2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
JoseK
Der gepostete Link ist falsch. Den richtigen Link zu derselben Quelle finden Sie hier: devl-android.blogspot.com/2013/10/… . Für diejenigen unter Ihnen, die Kotlin verwenden, bedeutet "&" "und".
Panos Gr
4

Ich denke, es ist ein ziemlich einfacher Code!

public Map<String, Integer> deriveMetrics(Activity activity) {
    try {
        DisplayMetrics metrics = new DisplayMetrics();

        if (activity != null) {
            activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        }

        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("screenWidth", Integer.valueOf(metrics.widthPixels));
        map.put("screenHeight", Integer.valueOf(metrics.heightPixels));
        map.put("screenDensity", Integer.valueOf(metrics.densityDpi));

        return map;
    } catch (Exception err) {
        ; // just use zero values
        return null;
    }
}

Diese Methode kann jetzt überall unabhängig verwendet werden. Wenn Sie Informationen zum Gerätebildschirm erhalten möchten, gehen Sie wie folgt vor:

        Map<String, Integer> map = deriveMetrics2(this);
        map.get("screenWidth");
        map.get("screenHeight");
        map.get("screenDensity");

Ich hoffe, dies könnte für jemanden da draußen hilfreich sein und es einfacher finden, es zu verwenden. Wenn ich neu korrigieren oder verbessern muss, zögern Sie bitte nicht, mich zu informieren! :-)

Prost!!!

Randika Vishman
quelle
Vielen Dank. Dieser Code funktioniert gut für mich auf Android-Emulator-Handys und Tablets. Wenn ich das Tablet drehe, werden die Auflösungszahlen nicht invertiert, sondern der tatsächliche Wert ändert sich. Aber für Telefon funktioniert es gut. Wie kann ich das lösen?
SAIFI369
4
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width = displayMetrics.widthPixels;

int height = displayMetrics.heightPixels;
omor
quelle
Vielen Dank. Dieser Code funktioniert gut für mich auf Android-Emulator-Handys und Tablets. Wenn ich das Tablet drehe, werden die Auflösungszahlen nicht invertiert, sondern der tatsächliche Wert ändert sich. Aber für Telefon funktioniert es gut. Wie kann ich das lösen?
SAIFI369
3

Mit diesem Code können Sie die Anzeigegröße in Pixel ermitteln.

Display display = getWindowManager().getDefaultDisplay();
SizeUtils.SCREEN_WIDTH = display.getWidth();
SizeUtils.SCREEN_HEIGHT = display.getHeight();
Aqif Hamid
quelle
3
Dies ist nicht das, was das OP verlangt.
Alex Lockwood
8
Dies ist veraltet
Mickey Tin
getHeightund getWidthsind ab API 16 veraltet: Android 4.1 (Jelly Bean)
Bruno Bieri
2

Sie können dies versuchen, es funktioniert Beispiel

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int ht = displaymetrics.heightPixels;
int wt = displaymetrics.widthPixels;

if ((getResources().getConfiguration().screenLayout &     Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
Toast.makeText(this, "Large screen", Toast.LENGTH_LONG).show();}

  else if ((getResources().getConfiguration().screenLayout &  Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
Toast.makeText(this, "Normal sized screen", Toast.LENGTH_LONG)
        .show();

  } else if ((getResources().getConfiguration().screenLayout &        Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
Toast.makeText(this, "Small sized screen", Toast.LENGTH_LONG)
        .show();
 } else {
Toast.makeText(this,
        "Screen size is neither large, normal or small",
        Toast.LENGTH_LONG).show();
 }

 // Determine density
 DisplayMetrics metrics = new DisplayMetrics();
 getWindowManager().getDefaultDisplay().getMetrics(metrics);
 int density = metrics.densityDpi;

 if (density == DisplayMetrics.DENSITY_HIGH) {
Toast.makeText(this,
        "DENSITY_HIGH... Density is " + String.valueOf(density),
        Toast.LENGTH_LONG).show();
 } else if (density == DisplayMetrics.DENSITY_MEDIUM) {
Toast.makeText(this,
        "DENSITY_MEDIUM... Density is " + String.valueOf(density),
        Toast.LENGTH_LONG).show();
 } else if (density == DisplayMetrics.DENSITY_LOW) {
Toast.makeText(this,
        "DENSITY_LOW... Density is " + String.valueOf(density),
        Toast.LENGTH_LONG).show();
 } else {
Toast.makeText(
        this,
        "Density is neither HIGH, MEDIUM OR LOW.  Density is "
                + String.valueOf(density), Toast.LENGTH_LONG)
        .show();
 }

 // These are deprecated
 Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
    .getDefaultDisplay();
 int  width = display.getWidth();
 int height = display.getHeight();
Takermania
quelle
1

simon-

Unterschiedliche Bildschirmgrößen haben unterschiedliche Pixeldichten. Ein 4-Zoll-Display Ihres Telefons kann mehr oder weniger Pixel haben als ein 26-Zoll-Fernseher. Wenn ich richtig verstehe, möchte er erkennen, welche der Größengruppen der aktuelle Bildschirm klein, normal, groß und extra groß ist. Ich kann mir nur vorstellen, die Pixeldichte zu ermitteln und damit die tatsächliche Größe des Bildschirms zu bestimmen.

Kevin Brey
quelle
1

Ich benötige dies für einige meiner Apps und der folgende Code war meine Lösung für das Problem. Nur den Code in onCreate anzeigen. Dies ist eine eigenständige App, die auf jedem Gerät ausgeführt werden kann, um die Bildschirminformationen zurückzugeben.

setContentView(R.layout.activity_main);
    txSize = (TextView) findViewById(R.id.tvSize);

    density = (TextView) findViewById(R.id.density);
    densityDpi = (TextView) findViewById(R.id.densityDpi);
    widthPixels = (TextView) findViewById(R.id.widthPixels);
    xdpi = (TextView) findViewById(R.id.xdpi);
    ydpi = (TextView) findViewById(R.id.ydpi);

    Configuration config = getResources().getConfiguration();

    if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
        Toast.makeText(this, "Large screen", Toast.LENGTH_LONG).show();
        txSize.setText("Large screen");
    } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
        Toast.makeText(this, "Normal sized screen", Toast.LENGTH_LONG)
                .show();
        txSize.setText("Normal sized screen");
    } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
        Toast.makeText(this, "Small sized screen", Toast.LENGTH_LONG)
                .show();
        txSize.setText("Small sized screen");
    } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
        Toast.makeText(this, "xLarge sized screen", Toast.LENGTH_LONG)
                .show();
        txSize.setText("Small sized screen");
    } else {
        Toast.makeText(this,
                "Screen size is neither large, normal or small",
                Toast.LENGTH_LONG).show();
        txSize.setText("Screen size is neither large, normal or small");
    }

    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    Log.i(TAG, "density :" + metrics.density);
    density.setText("density :" + metrics.density);

    Log.i(TAG, "D density :" + metrics.densityDpi);
    densityDpi.setText("densityDpi :" + metrics.densityDpi);

    Log.i(TAG, "width pix :" + metrics.widthPixels);
    widthPixels.setText("widthPixels :" + metrics.widthPixels);

    Log.i(TAG, "xdpi :" + metrics.xdpi);
    xdpi.setText("xdpi :" + metrics.xdpi);

    Log.i(TAG, "ydpi :" + metrics.ydpi);
    ydpi.setText("ydpi :" + metrics.ydpi);

Und eine einfache XML-Datei

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/tvSize"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/density"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/densityDpi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/widthPixels"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/xdpi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/ydpi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

Eric Engel
quelle
1

Mit Dekorationen (einschließlich Knopfleiste):

private static String getScreenResolution(Context context) {
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRealMetrics(metrics);
    return "{" + metrics.widthPixels + "," + metrics.heightPixels + "}";
}

Ohne Dekorationen:

private static String getScreenResolution(Context context) {
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
    return "{" + metrics.widthPixels + "," + metrics.heightPixels + "}";
}

Der Unterschied ist die Methode getMetrics () vs getRealMetrics () der Display-Klasse.

Julian Paul
quelle
1

Möglichkeiten, um DisplayMetrics zu erhalten:

1.

val dm = activity.resources.displayMetrics
val dm = DisplayMetrics() 
activity.windowManager.defaultDisplay.getMetrics(dm)
  1. val dm = DisplayMetrics () val wm = context.getSystemService (Context.WINDOW_SERVICE) als WindowManager wm..defaultDisplay.getMetrics (dm)

dann bekommen

Die Bildschirmdichte ausgedrückt als Punkte pro Zoll. Kann entweder DENSITY_LOW, DENSITY_MEDIUM oder DENSITY_HIGH sein

dm.densityDpi

Die absolute Höhe der verfügbaren Anzeigegröße in Pixel.

dm.heightPixels

Die absolute Breite der verfügbaren Anzeigegröße in Pixel.

dm.widthPixels

Die genauen physischen Pixel pro Zoll des Bildschirms in der X-Dimension.

dm.xdpi

Die genauen physischen Pixel pro Zoll des Bildschirms in der Y-Dimension.

dm.ydpi

DisplayMetrics

iamanbansal
quelle
0

Wenn Sie sich in einer Nichtaktivität befinden, z. B. Fragment, Adapter, Modellklasse oder eine andere Java-Klasse, die nicht erweitert wird, funktioniert dies Activityeinfach getResources()nicht. Sie können getActivity()in Fragment verwenden oder verwenden, contextdass Sie an die entsprechende Klasse übergeben.

mContext.getResources()

Ich würde empfehlen, eine Klasse dazu zu bringen, Utils zu sagen, die Methoden für die gemeinsame Arbeit haben. Der Vorteil hierfür ist, dass Sie das gewünschte Ergebnis mit einer einzelnen Codezeile an einer beliebigen Stelle in der App erzielen können, die diese Methode aufruft.

Inzimam Tariq IT
quelle
0

Der folgende Algorithmus kann verwendet werden, um zu identifizieren, welche Kategorie für die Auswahl zwischen den statischen Ressourcen verwendet wird, und um auch die neueren hohen Dichten XX und XXX zu berücksichtigen

    DisplayMetrics displayMetrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    mDensityDpi = displayMetrics.densityDpi;
    mDensity = displayMetrics.density;
    mDisplayWidth = displayMetrics.widthPixels;
    mDisplayHeight = displayMetrics.heightPixels;

    String densityStr = "Unknown";
    int difference, leastDifference = 9999;

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_LOW);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "LOW";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_MEDIUM);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "MEDIUM";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_HIGH);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "HIGH";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_XHIGH);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "XHIGH";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_XXHIGH);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "XXHIGH";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_XXXHIGH);
    if (difference < leastDifference) {
        densityStr = "XXXHIGH";
    }

    Log.i(TAG, String.format("Display [h,w]: [%s,%s] Density: %s Density DPI: %s [%s]", mDisplayHeight, mDisplayWidth, mDensity, mDensityDpi, densityStr));
Alex Kon
quelle
0

Holen Sie sich die Bildschirmauflösung oder Bildschirmgröße in Kotlin

fun getScreenResolution(context: Context): Pair<Int, Int> {
    try {
        val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = wm.defaultDisplay
        val metrics = DisplayMetrics()
        display.getMetrics(metrics)
        val width = metrics.widthPixels
        val height = metrics.heightPixels
        //Log.d(AppData.TAG, "screenSize: $width, $height")
        return Pair(width, height)

    } catch (error: Exception) {
        Log.d(AppData.TAG, "Error : autoCreateTable()", error)
    }

    return Pair(0, 0)
}
TOUSIF AHAMMAD
quelle
0

Der Code gibt Ihnen das Ergebnis im folgenden Format: Breite x Höhe

String displayResolution = getResources().getDisplayMetrics().widthPixels + "x" + getResources().getDisplayMetrics().heightPixels;
Alice Iceberg
quelle
Was ist, wenn das von diesem OP verwendete Gerät nicht 1440 x 2560 verwendet? Ihre Antwort sollte spezifischer sein. Der Code mag gut sein, aber die Beschreibung ist nicht immer gültig.
Magiczne
@ Magiczne danke für den wertvollen Kommentar. Ich habe meine Antwort bearbeitet
Alice Iceberg