He intentado esto….

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

y….

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

El Gnex tiene una pantalla de 720×1280. El resultado devuelto por la anchura/altura (dependiendo de la orientación de curso) nunca es 1280. Pensé que esto podría tener algo que ver con la barra de navegación de pantalla en Ice Cream Sandwich, por lo que puedo ocultar que con :

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

…y luego comenzó un hilo que registra de forma continua el tamaño de la pantalla altura/anchura. Incluso después de que el ICS de la barra de navegación había desaparecido por completo….el tamaño de la pantalla nunca informe de 1280 valor. Me gustaría conseguir los números como este:

width  = 720
height = 1184

¿Cómo se puede obtener el verdadero dispositivo de la resolución de la pantalla en ICS?

La razón por la que necesita este valor es debido a que mi aplicación se reproduce el vídeo y me gustaría ver el vídeo para tomar la totalidad de la pantalla cuando el dispositivo está en orientación horizontal. Ahora sé lo que estás pensando, ¿por qué no dar la videoview un valor de «match_parent» para la altura, la anchura? La razón es porque mis vídeos tienen múltiples relaciones de aspecto y me gustaría ser capaz de calcular el correcto tamaño de vídeo, dependiendo del ancho completo de la pantalla.

InformationsquelleAutor dell116 | 2012-06-12

6 Comentarios

  1. 19

    De la respuesta de Ahmed, este es el código completo sin errores:

        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();
        }
  2. 19

    He encontrado este tesoro escondido por el ICS SÓLO……si usted está apuntando a la API es más alto que el de ICS ver el comentario de Chris Schmich a continuación.

    Cómo ocultar y mostrar la barra de navegación en Android ICS construir

    En caso de que el enlace se muere….aquí es cómo conseguir el real tamaño de pantalla del dispositivo…..

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

    EDITAR (11/19/12)

    El código anterior NO funciona en Android 4.2 y se producirá una excepción….Todavía tengo que encontrar una manera de obtener el máximo tamaño de la pantalla de un dispositivo en Android 4.2. Cuando lo hago, voy a editar esta respuesta, pero por ahora, usted debe de código con la contingencia de android 4.2!!

    • – y ¿por qué Google tiene para que me vaya raw?
    • Muchas gracias, me ahorra un montón de problemas
    • En Android 4.2 (API 17) y de los mayores, puede utilizar la Pantalla.getRealMetrics para obtener la física real de la pantalla métricas. Me confirmó que esto funciona en mi Samsung Galaxy Nexus con Jelly Bean (4.2.1). Consulte developer.android.com/reference/android/view/…
    • Tenga en cuenta también que getRawHeight y getRawWidth sólo están disponibles desde la API de 14. Así que sólo las pueden utilizar para la API 14, 15 y 16.
    • He escrito una respuesta sobre un tema diferente que utiliza esta y otras opciones para obtener la mejor visualización de métricas posible en la api de 10+.
    • gran post.. muy útil para mí.. gracias me alegró el día… !!!
    • No utilizar la reflexión para tener acceso a métodos como este. Métodos como este están ocultos por una razón – no hay ninguna garantía de que va a existir en futuras versiones o devolverá el mismo valor entre versiones.

  3. 8

    Puede utilizar getRealSize para obtener la resolución de la pantalla. Es oficialmente soportado en la API de 17 y más alto, pero en realidad existía en el SDK desde la API de 14. Si utiliza el SDK de la plataforma para la API de 17 o más, usted puede tener acceso al método normalmente y acaba de pasar por alto la advertencia acerca de que sólo está disponible en la 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;    
    }

    He probado esto en un verdadero Android 5.0.2 dispositivo y un emulador ejecuta 4.1.1 (y posiblemente otros).

    Gracias a benc para señalar esto en los comentarios.

  4. 6

    Probar este

        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();
                }
            }
    • En mi limitada de prueba hasta el momento, getRealMetrics() da los resultados correctos, incluso en 4.0 dispositivos, donde se espera que se bloquee. También es de destacar que getRealMetrics devuelve el correcto DPI, donde los otros métodos para la obtención de un DisplayMetrics puede devolver datos falsos. (Con los otros métodos, mi S4 estaba afirmando ser un mpdi dispositivo!)
  5. 1

    En algunos dispositivos, por ejemplo, las tabletas, la barra de navegación no puede ser escondida en todos (fuente, consulte la sección «Controles de interfaz de usuario del sistema visibilidad’) debido a que no hay botones de hardware de copia de seguridad. Si en el dispositivo que ha conseguido ocultar la barra, sin embargo, usted podría hacer una Vista de pantalla completa y solicitar su tamaño con getWidth() y getHeight().

    Hasta donde yo sé, no hay una manera confiable de obtener el tamaño de la pantalla en todos los dispositivos de ICS.

    • TIENE que haber una manera de hacer esto. La aplicación de youtube para ICS es de alguna manera lleve los ICS de la barra de navegación y obtención de la videoview para convertirse en el todo el ancho de la pantalla.
    • Esto depende del dispositivo, en tablets con ICS el bar está tachado (los controles están ocultos), pero no se ha ido.
    • Stuart, no puedo confirmar si se puede o no completa librar a la pantalla de la OS de la barra de navegación en una tablet con ICS, pero incluso si lo que dices es cierto….que la ocultación de la OS de la barra de Navegación es dependiente del dispositivo….No sé por qué Google obstaculizar intencionalmente un desarrollador de obtener las dimensiones exactas de un dispositivo. Qué sentido tendría que hacer? Por CIERTO….por favor no tome esto como un ataque a su respuesta. Agradezco la discusión!
    • No te preocupes, agradezco la discusión y estoy de acuerdo en que tendría sentido para Android para ofrecer un camino a la solicitud de la resolución de la pantalla. He querido utilizar esta característica mismo, recientemente, pero Cuando hice una búsqueda sobre cómo hacerlo, no podía encontrar la manera. He añadido un enlace a mi respuesta original por si desea verificar que la barra de navegación no puede ser escondida en algunos dispositivos.

Dejar respuesta

Please enter your comment!
Please enter your name here