Determinar si el dispositivo es un teléfono inteligente o tableta? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Me gustaría obtener información sobre un dispositivo para ver si es un teléfono inteligente o tableta. ¿Cómo puedo hacerlo?

Me gustaría mostrar diferentes páginas web de recursos basados en el tipo de dispositivo:

String s="Debug-infos:";
s += "\n OS Version: " + System.getProperty("os.version") + "(" +    android.os.Build.VERSION.INCREMENTAL + ")";
s += "\n OS API Level: " + android.os.Build.VERSION.SDK;
s += "\n Device: " + android.os.Build.DEVICE;
s += "\n Model (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")";

Sin Embargo, parece inútil para mi caso.


Esta solución funciona para mí ahora:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;

if (SharedCode.width > 1023 || SharedCode.height > 1023){
   //code for big screen (like tablet)
}else{
   //code for small screen (like smartphone)
}
Author: Fllo, 2012-02-14

9 answers

Este tema se discute en el Entrenamiento de Android:

Utilice el calificador de ancho más pequeño

Si lee el tema completo, explican cómo establecer un valor booleano en un archivo de valor específico (como res/values-sw600dp/attr.xml):

<resources>
    <bool name="isTablet">true</bool>
</resources>

Porque el calificador sw600dp solo es válido para plataformas superiores a Android 3.2. Si desea asegurarse de que esta técnica funciona en todas las plataformas (antes de la 3.2), cree el mismo archivo en la carpeta res/values-xlarge:

<resources>
    <bool name="isTablet">true</bool>
</resources>

Entonces, en el archivo de valores" estándar " (como res / values/), se establece el valor booleano en false:

<resources>
    <bool name="isTablet">false</bool>
</resources>

Luego, en su actividad, puede obtener este valor y verificar si se está ejecutando en un dispositivo de tamaño tableta:

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
} else {
    // do something else
}
 659
Author: ol_v_er,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 19:48:27

Considero que una tableta tiene al menos una pantalla de 6.5 pulgadas. Esta es la forma de calcularlo, basado en la respuesta de Nolf anterior.

DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

float yInches= metrics.heightPixels/metrics.ydpi;
float xInches= metrics.widthPixels/metrics.xdpi;
double diagonalInches = Math.sqrt(xInches*xInches + yInches*yInches);
if (diagonalInches>=6.5){
    // 6.5inch device or bigger
}else{
    // smaller device
}
 66
Author: gtsouk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-28 14:40:23

Mi suposición es que cuando define 'Móvil/Teléfono' desea saber si puede hacer una llamada telefónica en el dispositivo que no se puede hacer en algo que se definiría como una 'Tableta'. La forma de verificar esto está a continuación. Si desea saber algo basado en sensores, tamaño de pantalla, etc, entonces esta es realmente una pregunta diferente.

También, mientras se utiliza la resolución de pantalla, o la gestión de recursos grande vs xlarge, puede haber sido un enfoque válido en el pasado nuevos dispositivos 'Móviles' son ahora viene con pantallas tan grandes y altas resoluciones que están difuminando esta línea, mientras que si realmente desea saber la capacidad de llamada telefónica vs sin llamada telefónica, la siguiente es "mejor".

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
            return "Tablet";
        }else{
            return "Mobile";
        }
 37
Author: Robert Dale Johnson III,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-14 21:35:30

Me gusta la solución de Ol_v_er y su simplicidad sin embargo, he encontrado que no siempre es tan simple, con nuevos dispositivos y pantallas que salen constantemente, y quiero ser un poco más "granular" al tratar de averiguar el tamaño real de la pantalla. Otra solución que encontré aquí por John usa un recurso de cadena, en lugar de un booleano, para especificar el tamaño de la tableta. Por lo tanto, en lugar de solo poner true en a /res/valores-sw600dp/pantalla.archivo xml (suponiendo que aquí es donde están sus diseños para tabletas pequeñas) usted pondría:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="screen_type">7-inch-tablet</string>
</resources>

Referencialo como sigue y luego haz lo que necesites basado en el resultado:

String screenType = getResources().getString(R.string.screen_type);
if (screenType.equals("7-inch-tablet")) {
    // do something
} else {
    // do something else
}

La respuesta de Sean O'Toole para Detectar 7 pulgadas y 10 pulgadas tableta programáticamente también era lo que estaba buscando. Es posible que desee comprobar que hacia fuera si las respuestas aquí no le permiten ser tan específico como le gustaría. Él hace un gran trabajo de explicar cómo calcular diferentes métricas para averiguar lo que realmente está tratando con.

ACTUALIZACIÓN

Al mirar el código fuente de la aplicación Google I/O 2013, me encontré con lo siguiente que usan para identificar si el dispositivo es una tableta o no, así que pensé que lo agregaría. Lo anterior te da un poco más de "control" sobre él, pero si solo quieres saber si es una tableta, lo siguiente es bastante simple:

public static boolean isTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK)
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
 27
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:53

Dado que las tabletas son en general más grandes que los teléfonos inteligentes y dado que una tableta de baja resolución puede tener el mismo número de píxeles que un teléfono inteligente de alta resolución, una forma de resolver esto es calcular el TAMAÑO físico (no la resolución) de un dispositivo:

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

    float yInches= metrics.heightPixels/metrics.ydpi;
    float xInches= metrics.widthPixels/metrics.xdpi;

   if (yInches> smallestTabletSize|| xInches > smallestTabletSize)
    {
                  //We are on a 
    }
 6
Author: Nolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 06:25:30

La mejor opción que encontré y la menos intrusiva, es establecer un parámetro de etiqueta en tu xml, como

DISEÑO XML DEL TELÉFONO

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="phone"/>

DISEÑO XML DE LA TABLETA

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="tablet">

    ...

</RelativeLayout>

Y luego llama a esto en tu clase de actividad:

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));

Espero que funcione para u.

 5
Author: Alejandro Tellez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-06 00:39:07

Utilizo este método en todas mis aplicaciones, y funciona correctamente:

public static boolean isTablet(Context ctx){    
    return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}
 3
Author: Jorgesys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-28 22:00:14

La solución que utilizo es definir dos layouts. Uno con la carpeta de diseño establecida en, por ejemplo diseño-sw600dp Uso esto para proporcionar un botón de menú para los usuarios de mi tableta y para ocultar esto para los usuarios de teléfonos. De esa manera no tengo (todavía) que implementar la barra de acción para mis aplicaciones existentes ...

Ver este post para más detalles.

 1
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-08 08:03:00

Re: la tangente anterior sobre cómo distinguir un teléfono de un no-teléfono: por lo que sé, solo un teléfono tiene un IMEI (International Mobile Station Equipment Identity) de 15 dígitos, por lo que el siguiente código distinguirá definitivamente un teléfono de un no-teléfono:

    TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    String deviceInfo = "";
    deviceInfo += manager.getDeviceId(); // the IMEI
    Log.d(TAG, "IMEI or unique ID is " + deviceInfo);

    if (manager.getDeviceId() == null) {
        Log.d(TAG, "This device is NOT a phone");
    } else {
        Log.d(TAG, "This device is a phone.");
    }

He encontrado que en un emulador de Nook getPhoneType() devuelve un tipo de teléfono de "GSM" por alguna razón, por lo que parece que comprobar el tipo de teléfono no es confiable. Del mismo modo, getNetworkType() devolverá 0 para un teléfono en modo avión. En de hecho, el modo airplane hará que getLine1Number () y los métodos getSim* devuelvan null también. Pero incluso en modo avión, el IMEI de un teléfono persiste.

 1
Author: John Ulmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-22 23:45:28