Déterminer si le périphérique est un smartphone ou une tablette?

J’aimerais obtenir des informations sur un périphérique pour savoir s’il s’agit d’un smartphone ou d’une tablette. Comment puis-je le faire?

J’aimerais afficher différentes pages Web à partir de ressources en fonction du type d’appareil:

Ssortingng 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 + ")"; 

Cependant, cela semble inutile pour mon cas.


Cette solution fonctionne pour moi maintenant:

 DisplayMesortingcs mesortingcs = new DisplayMesortingcs(); getWindowManager().getDefaultDisplay().getMesortingcs(mesortingcs); int width = mesortingcs.widthPixels; int height = mesortingcs.heightPixels; if (SharedCode.width > 1023 || SharedCode.height > 1023){ //code for big screen (like tablet) }else{ //code for small screen (like smartphone) } 

Ce sujet est abordé dans la formation Android:

Utilisez le qualificatif de plus petite largeur

Si vous lisez l’intégralité de la rubrique, ils expliquent comment définir une valeur booléenne dans un fichier de valeur spécifique (comme res / values-sw600dp / attr.xml):

  true  

Parce que le qualificatif sw600dp n’est valable que pour les plates-formes ci-dessus Android 3.2. Si vous voulez vous assurer que cette technique fonctionne sur toutes les plates-formes (avant 3.2), créez le même fichier dans le dossier res / values-xlarge:

  true  

Ensuite, dans le fichier de valeur “standard” (comme res / values ​​/), vous définissez le booléen sur false:

  false  

Ensuite, dans votre activité, vous pouvez obtenir cette valeur et vérifier si vous utilisez un périphérique de taille de tablette:

 boolean tabletSize = getResources().getBoolean(R.bool.isTablet); if (tabletSize) { // do something } else { // do something else } 

Je considère une tablette comme ayant au moins un écran de 6,5 pouces. Voici comment le calculer, basé sur la réponse de Nolf ci-dessus.

 DisplayMesortingcs mesortingcs = new DisplayMesortingcs(); getActivity().getWindowManager().getDefaultDisplay().getMesortingcs(mesortingcs); float yInches= mesortingcs.heightPixels/mesortingcs.ydpi; float xInches= mesortingcs.widthPixels/mesortingcs.xdpi; double diagonalInches = Math.sqrt(xInches*xInches + yInches*yInches); if (diagonalInches>=6.5){ // 6.5inch device or bigger }else{ // smaller device } 

Mon hypothèse est que lorsque vous définissez «Mobile / Phone», vous souhaitez savoir si vous pouvez passer un appel téléphonique sur l’appareil, ce qui ne peut pas être fait avec une tablette. La manière de vérifier ceci est ci-dessous. Si vous souhaitez savoir quelque chose en fonction des capteurs, de la taille de l’écran, etc., la question est vraiment différente.

En outre, lorsqu’on utilise la résolution de l’écran, ou si la gestion des ressources est importante par rapport à xlarge, de nouveaux appareils «mobiles» viennent avec de grands écrans et des résolutions élevées, ce qui rend cette ligne floue. pour connaître les appels téléphoniques et non la capacité d’appel téléphonique ci-dessous est le meilleur.

 TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){ return "Tablet"; }else{ return "Mobile"; } 

J’aime la solution d’Ol_v_er et sa simplicité, cependant, j’ai constaté que ce n’est pas toujours simple, avec de nouveaux périphériques et écrans qui sortent constamment, et je veux être un peu plus “granulaire” pour essayer de déterminer la taille réelle de l’écran . Une autre solution trouvée par John utilise une ressource Ssortingng, au lieu d’un booléen, pour spécifier la taille de la tablette. Donc, au lieu de simplement mettre true dans un fichier /res/values-sw600dp/screen.xml (en supposant que ce soit là où se trouvent les mises en page pour les petites tablettes), vous devez mettre:

   7-inch-tablet  

Référencez-le comme suit et faites ensuite ce dont vous avez besoin en fonction du résultat:

 Ssortingng screenType = getResources().getSsortingng(R.ssortingng.screen_type); if (screenType.equals("7-inch-tablet")) { // do something } else { // do something else } 

La réponse de Sean O’Toole pour Detect 7 pouces et 10 pouces sur tablette était également ce que je cherchais. Vous voudrez peut-être vérifier cela si les réponses ne vous permettent pas d’être aussi précis que vous le souhaitez. Il fait un excellent travail en expliquant comment calculer différentes mésortingques pour déterminer ce que vous faites en réalité.

METTRE À JOUR

En regardant le code source de l’application Google I / O 2013, je suis tombé sur les éléments suivants pour identifier si le périphérique est une tablette ou non. Je me suis donc dit que je l’appendais. Ce qui précède vous donne un peu plus de “contrôle”, mais si vous voulez juste savoir si c’est une tablette, voici ce qui est simple:

 public static boolean isTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } 

Etant donné que les tablettes sont en général plus grandes que les smartphones et qu’une tablette basse résolution peut avoir le même nombre de pixels qu’un smartphone haute résolution, une solution consiste à calculer la taille physique (et non la résolution) d’un périphérique:

  DisplayMesortingcs mesortingcs = new DisplayMesortingcs(); getWindowManager().getDefaultDisplay().getMesortingcs(mesortingcs); float yInches= mesortingcs.heightPixels/mesortingcs.ydpi; float xInches= mesortingcs.widthPixels/mesortingcs.xdpi; if (yInches> smallestTabletSize|| xInches > smallestTabletSize) { //We are on a } 

La meilleure option que j’ai trouvée et la moins intrusive est de définir un paramètre tag dans votre fichier XML, comme

Mise en page XML du téléphone

  

MISE EN PAGE DE LA TABLETTE XML

  ...  

et puis appelez cela dans votre classe d’activité:

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

J’espère que ça marche pour vous.

J’utilise cette méthode dans toutes mes applications et cela fonctionne correctement:

 public static boolean isTablet(Context ctx){ return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } 

La solution que j’utilise consiste à définir deux dispositions. Un avec le dossier de disposition défini par exemple sur layout-sw600dp Je l’utilise pour fournir un bouton de menu aux utilisateurs de ma tablette et pour le masquer pour les utilisateurs du téléphone. De cette façon, je ne dois pas (encore) implémenter ActionBar pour mes applications existantes …

Voir ce post pour plus de détails .

Re: la tangente ci-dessus sur la façon de distinguer un téléphone d’un non-téléphone: pour autant que je sache, seul un téléphone a une identité IMEI (International Mobile Station Equipment Identity) à 15 chiffres, donc le code suivant distinguera définitivement un téléphone de un non-téléphone:

  TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); Ssortingng 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."); } 

J’ai trouvé que sur un émulateur Nook, getPhoneType () renvoie un téléphone de type “GSM” pour une raison quelconque. Il semble donc que la vérification du type de téléphone ne soit pas fiable. De même, getNetworkType () retournera 0 pour un téléphone en mode avion. En fait, en mode avion, les méthodes getLine1Number () et getSim * renvoient également null. Mais même en mode avion, l’IMEI d’un téléphone persiste.