web-dev-qa-db-fra.com

Android DisplayMetrics renvoie une taille d'écran incorrecte en pixels sur ICS

J'ai essayé ça ....

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

et....

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

Le Gnex a un écran de 720 × 1280. Le résultat renvoyé pour la largeur/hauteur (en fonction de l'orientation bien sûr) n'est jamais 1280. Je pensais que cela pourrait avoir quelque chose à voir avec la barre de navigation à l'écran dans Ice cream sandwich, donc je le cache avec:

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

... puis a commencé un fil qui enregistre en continu la taille/hauteur de l'écran. Même après que la barre de navigation ICS ait complètement disparu ... la taille de l'écran ne rapporterait jamais la valeur 1280. J'obtiendrais des chiffres comme celui-ci:

width  = 720
height = 1184

Comment obtenir la vraie résolution d'écran de l'appareil dans ICS?

La raison pour laquelle j'ai besoin de cette valeur est que mon application lit la vidéo et j'aimerais que la vidéo occupe tout l'écran lorsque l'appareil est en orientation paysage. Maintenant je sais ce que vous pensez, pourquoi ne pas simplement donner à la vidéo une valeur de "match_parent" pour la hauteur/largeur? La raison en est que mes vidéos ont plusieurs rapports d'aspect et j'aimerais pouvoir calculer la taille de la vidéo correcte en fonction de la largeur totale de l'écran.

22
dell116

J'ai trouvé ce trésor caché pour ICS UNIQUEMENT ...... si vous ciblez des API supérieures à ICS voir le commentaire de Chris Schmich ci-dessous).

Comment masquer et afficher la barre de navigation sur Android ICS build

Au cas où le lien mourrait .... voici comment obtenir la taille réelle de l'écran de l'appareil .....

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);

[~ # ~] modifier [~ # ~] (19/11/12)

Le code ci-dessus NE FONCTIONNERA PAS sur Android 4.2 et une exception sera levée .... Je n'ai pas encore trouvé de moyen d'obtenir la taille plein écran d'un appareil dans Android 4.2. Lorsque je le ferai, je modifierai cette réponse, mais pour l'instant, vous devez coder avec contingence pour Android 4.2 !!

19
dell116

D'après la réponse d'Ahmed, voici le code complet sans erreur:

    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

Vous pouvez utiliser getRealSize pour obtenir la résolution d'écran. Il est officiellement pris en charge dans l'API 17 et les versions ultérieures, mais il existait en fait dans le SDK depuis l'API 14. Si vous utilisez la plate-forme SDK pour l'API 17 ou une version ultérieure, vous pouvez accéder à la méthode normalement et contourner l'avertissement indiquant qu'elle n'est disponible que dans l'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;    
}

J'ai testé cela dans un vrai Android 5.0.2 et un émulateur exécutant 4.1.1 (et peut-être d'autres).

Merci à benc pour le signalant dans les commentaires .

10
Sam

Essaye ça

    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

Sur certains appareils, par exemple tablettes, la barre de navigation ne peut pas être cachée du tout ( source , voir la section 'Contrôles pour la visibilité de l'interface utilisateur du système') car il n'y a pas de boutons matériels comme sauvegarde. Si sur votre appareil, vous avez réussi à masquer la barre, vous pouvez créer une vue plein écran et demander sa taille avec getWidth () et getHeight ().

Pour autant que je sache, il n'y a pas de moyen fiable d'obtenir la taille de l'écran sur tous les appareils ICS.

1
user1340450