Existe-t-il un moyen de vérifier si l'utilisateur utilise une tablette ou un téléphone? J'ai des problèmes avec ma fonction d'inclinaison et ma nouvelle tablette (Transformer)
Vous posez la mauvaise question. Peu importe que l'appareil soit un téléphone, une tablette, une télévision, un grille-pain, une tasse à thé ou un thermomètre. Ce qui compte, ce sont les capacités et non la classe de l'appareil définie par le marketing. Veuillez poser une nouvelle question Android décrivant les capacités que vous recherchez et comment détecter si l'appareil dispose de telles capacités, ou comment vous filtrer du marché pour les appareils qui ne disposent pas de ces capacités.
CommonsWare
7
@CommonsWare: parfois, vous souhaitez ajouter des fonctionnalités supplémentaires pour les appareils qui ont un écran plus grand.
Bobs
10
@breceivemail: ce qui signifie que vous devez vérifier si l'appareil dispose d'un écran plus grand. "Écran plus grand"! = "Tablette".
Je souhaite voter contre toute cette page! Un téléphone fait de la téléphonie, pas une tablette. Presque toutes les suggestions sont des hacks sales que personne ne devrait utiliser. Le monde serait meilleur si personne ne revoyait cette page!
Mark Gjøl
Réponses:
122
Comme cela a été mentionné précédemment, vous ne souhaitez pas vérifier si l'appareil est une tablette ou un téléphone mais vous souhaitez connaître les fonctionnalités de l'appareil,
La plupart du temps, la différence entre une tablette et un téléphone réside dans la taille de l'écran, c'est pourquoi vous souhaitez utiliser des fichiers de mise en page différents. Ces fichiers sont stockés dans les res/layout-<qualifiers>répertoires. Vous pouvez créer un fichier XML dans le directoy res/values-<same qualifiers>pour chacune de vos mises en page et y placer une ressource int / bool / string pour distinguer les mises en page que vous utilisez.
Exemple:
Fichier res/values/screen.xml(en supposant qu'il res/layout/contient vos fichiers de mise en page pour les combinés)
Fichier res/values-sw600dp/screen.xml(en supposant qu'il res/layout-sw600dp/contient vos fichiers de mise en page pour les petites tablettes comme la Nexus 7)
Fichier res/values-sw720dp/screen.xml(en supposant qu'il res/layout-sw720dp/contient vos fichiers de mise en page pour les grandes tablettes comme le Nexus 10):
+1, excellente réponse car elle fournit plus d'informations sur les raisons pour lesquelles vous souhaitez réellement rechercher une tablette / téléphone. Nous approchons d'un moment où les téléphones deviendront de toute façon de petites tablettes;)
andr
Comment cela s'applique-t-il aux gros téléphones, tels que le Galaxy Note et le nouveau Nexus 6? En utilisant cette technique, ces gros appareils seront-ils détectés comme des téléphones ou des tablettes?
PerracoLabs
1
Malheureusement, cette approche ne fonctionne pas pour l'appareil Samsung Mega 6.3 et le renvoie sous forme de tablette (sw600dp) - d'autres idées pour capturer cela?
bkurzius
les tablettes passent-elles des appels téléphoniques?
Mike
61
Pour détecter si l'appareil est une tablette ou non, utilisez le code suivant:
Les tailles d'écran LARGE et XLARGE sont déterminées par le fabricant en fonction de la distance de l'œil à laquelle elles doivent être utilisées (d'où l'idée d'une tablette).
Sur les deux - Kindle Fire et Motorola Droid Bionic - le SCREENLAYOUT_SIZE_MASK == 15. Alors, pourquoi votre solution fonctionnerait-elle?
IgorGanapolsky
Je crois que cela est vrai sur le Kindle Fire. Je n'ai pas de bionique sur moi aujourd'hui ... mais je vérifierai dans quelques jours quand mon ami reviendra en ville. Cependant ... J'ai testé la réponse d'Helton Isac et cela fonctionne à merveille. Veuillez vérifier cela aussi.
petey
4
Il y a Configuration.SCREENLAYOUT_SIZE_XLARGE, donc vous n'avez pas besoin d'utiliser une constante, et vous pouvez l'utiliser >= LARGE.
Triang3l
2
Galaxy Note semble signaler SCREENLAYOUT_SIZE_LARGE donc il serait à tort classé comme tablette
miguelSantirso
1
Si la police du périphérique est petite et la taille d'affichage est petite dans les paramètres, ce cas est retourné vrai.
arul le
38
Ce post m'a beaucoup aidé,
Malheureusement, je n'ai pas la réputation nécessaire pour évaluer toutes les réponses qui m'ont aidé.
J'avais besoin d'identifier si mon appareil était une tablette ou un téléphone, avec cela je pourrais implémenter la logique de l'écran. Et dans mon analyse, la tablette doit mesurer plus de 7 pouces (Xlarge) à partir de MDPI.
Voici le code ci-dessous, qui a été créé à partir de cet article.
/**
* Checks if the device is a tablet or a phone
*
* @param activityContext
* The Activity Context.
* @return Returns true if the device is a Tablet
*/publicstaticboolean isTabletDevice(Context activityContext){// Verifies if the Generalized Size of the device is XLARGE to be// considered a Tabletboolean xlarge =((activityContext.getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK)==Configuration.SCREENLAYOUT_SIZE_XLARGE);// If XLarge, checks if the Generalized Density is at least MDPI// (160dpi)if(xlarge){DisplayMetrics metrics =newDisplayMetrics();Activity activity =(Activity) activityContext;
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);// MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160,// DENSITY_TV=213, DENSITY_XHIGH=320if(metrics.densityDpi ==DisplayMetrics.DENSITY_DEFAULT
|| metrics.densityDpi ==DisplayMetrics.DENSITY_HIGH
|| metrics.densityDpi ==DisplayMetrics.DENSITY_MEDIUM
|| metrics.densityDpi ==DisplayMetrics.DENSITY_TV
|| metrics.densityDpi ==DisplayMetrics.DENSITY_XHIGH){// Yes, this is a tablet!returntrue;}}// No, this is not a tablet!returnfalse;}
La meilleure solution que j'ai trouvée, merci Helton Isac! Peut-être pouvez-vous ajouter (pour une meilleure solution) un chèque pour les pouces de l'écran? de toute façon, un 10 pour cette solution
Aracem
7
Je suis vraiment en désaccord. C'est une méthode pour trouver une certaine taille d'écran. Encore une fois, comme je l'ai répondu, il n'y a AUCUNE différence entre une tablette et un téléphone. Ce n'est pas une réponse à la question. Il n'est pas possible de différencier car il n'y a pas de différence 1. Si vous avez besoin de coder pour certaines fonctionnalités (comme vous semblez le faire pour certaines tailles d'écran), faites-le, mais n'appelez pas cela tablette vs téléphone. Le sujet de départ semblait mettre la ligne @ certaines fonctionnalités d'inclinaison. Lisez attentivement le commentaire de @commonware sur la question.
Nanne
1
Je suis d'accord avec Nanne, mais comme je l'ai dit, dans mon application, je dois afficher deux panneaux si l'écran est assez grand pour le faire. Et je ne peux pas utiliser de dispositions dans ce cas, car la logique de l'écran était du côté Java.
Helton Isac
3
Helton, merci pour ça. Je pensais que je dirais que cela revient: Kindle Fire: faux, Moto Xoom (v1): vrai, Galaxy Note: faux, Galaxy Tab 10.1 limité: vrai
Cela ne fonctionne pas ... simplement certains téléphones rapportent les mauvaises valeurs de densité et le calcul en pouces échoue - voir là: stackoverflow.com/questions/2193457
...
Eh bien, j'aime les tablettes 7 '(format de poche) et cette réponse est la meilleure que je pense. Mais revenez (screenDiagonal> = 9.0); devrait être return (screenDiagonal> = 6.5). Cependant dépendant de l'utilisation comme commenté dans les commentaires à la question.
Jan Bergström
11
il n'y a pas de différence. Vous devez définir ce que vous pensez être la différence et vérifier cela. Un onglet Galaxy est-il un téléphone? ou une tablette? et pourquoi?
Vous devez définir les fonctionnalités spécifiques que vous recherchez et coder pour cela.
Il semble que vous recherchez «inclinaison». Je pense que c'est la même chose que l'accéléromètre (est-ce un mot?). Vous pouvez simplement vérifier si l'appareil le prend en charge, en utilisant:
J'ai des problèmes avec ma fonction d'inclinaison et ma nouvelle tablette (Transformer)
Benny
Une sorte de réponse idiote imo - bien sûr, il y a une différence. Galaxy = téléphone. Pourquoi? Parce que c'est un "smartphone" selon le fabricant pour un. Si vous laissez entendre qu'il a besoin de vérifier sa taille, sa capacité à appeler, ou ... quoi que ce soit, dites-le simplement.
Dave
3
Je ne suis pas d'accord, cela pourrait ne pas fonctionner pour tous les mobiles, alors que certaines tablettes ont ces capteurs. C'est pourquoi ma réponse initiale à propos de l'absence de différence. Quoi qu'il en soit, j'ai ajouté du code que vous devriez essayer.
Nanne
2
Le problème est que, comme les tablettes sont "construites" en mode paysage, les axes x et y de l'accéléromètre sont inversés lorsque vous prévoyez que votre application s'exécute en mode portrait. Cela peut gâcher un peu les choses :) Il est donc essentiel de vérifier la météo que vous utilisez sur une tablette ou non.
pumpkee
1
Mais alors c'est l'inverse => si c'est la seule chose qui fait d'un appareil une tablette, vous devriez découvrir comment fonctionne l'axe x / y, et non l'inverse. Je doute d'ailleurs que cela soit vrai pour toutes les tablettes et / ou téléphones?
Nanne
10
Je suppose que lorsque vous définissez «Mobile / Téléphone», vous souhaitez savoir si vous pouvez passer un appel téléphonique sur l'appareil, ce qui ne peut pas être fait sur quelque chose qui serait défini comme une «tablette». La façon de vérifier cela est ci-dessous. Si vous souhaitez savoir quelque chose en fonction des capteurs, de la taille de l'écran, etc., c'est vraiment une question différente.
En outre, tout en utilisant la résolution d'écran, ou la gestion des ressources large par rapport à xlarge, peut avoir été une approche valide dans le passé, de nouveaux appareils `` mobiles '' sont maintenant livrés avec des écrans si grands et des résolutions élevées qu'ils brouillent cette ligne si vous le souhaitez vraiment pour connaître les appels téléphoniques par rapport à aucune capacité d'appel téléphonique, ce qui suit est «meilleur».
Certaines tablettes peuvent téléphoner et avoir un type GSM ou CDMA ... Donc votre solution n'est pas parfaite aussi.
arnouf du
6
Basé sur Robert Dale Johnson III et Helton Isac, j'ai trouvé ce code J'espère que c'est utile
publicstaticboolean isTablet(Context context){TelephonyManager manager =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);if(manager.getPhoneType()==TelephonyManager.PHONE_TYPE_NONE){//Tabletreturntrue;}else{//Mobilereturnfalse;}}publicstaticboolean isTabletDevice(Context activityContext){// Verifies if the Generalized Size of the device is XLARGE to be// considered a Tabletboolean xlarge =((activityContext.getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK)==Configuration.SCREENLAYOUT_SIZE_XLARGE);// If XLarge, checks if the Generalized Density is at least MDPI (160dpi)if(xlarge){DisplayMetrics metrics =newDisplayMetrics();Activity activity =(Activity) activityContext;
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);// MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160,// DENSITY_TV=213, DENSITY_XHIGH=320if(metrics.densityDpi ==DisplayMetrics.DENSITY_DEFAULT
|| metrics.densityDpi ==DisplayMetrics.DENSITY_HIGH
|| metrics.densityDpi ==DisplayMetrics.DENSITY_MEDIUM
|| metrics.densityDpi ==DisplayMetrics.DENSITY_XHIGH){// Yes, this is a tablet!returntrue;}}// No, this is not a tablet!returnfalse;}
Pour ceux qui souhaitent se référer au code de Google pour décider quels appareils utiliseront une interface utilisateur pour tablette, vous pouvez vous référer ci-dessous:
// SystemUI (status bar) layout policyint shortSizeDp = shortSize
*DisplayMetrics.DENSITY_DEFAULT
/DisplayMetrics.DENSITY_DEVICE;if(shortSizeDp <600){// 0-599dp: "phone" UI with a separate status & navigation bar
mHasSystemNavBar =false;
mNavigationBarCanMove =true;}elseif(shortSizeDp <720){// 600-719dp: "phone" UI with modifications for larger screens
mHasSystemNavBar =false;
mNavigationBarCanMove =false;}else{// 720dp: "tablet" UI with a single combined status & navigation bar
mHasSystemNavBar =true;
mNavigationBarCanMove =false;}}
Cette solution ne fonctionne par exemple pas sur un émulateur avec API 18 et Nexus 7 1200 x 1920 xhdpi!
Ingo
1
vous devriez tester sur un appareil réel :)
hqt
J'ai testé sur Emulator et le résultat de "isTablet (contexte de contexte) était faux. Essayez par vous-même sur Emulator.
Ingo
1
Merci pour ce @hqt, je viens de le transcoder en C # nécessaire pour Xamarin Studio:public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
Phil Ryan
2
Aucun code nécessaire
Les autres réponses répertorient de nombreuses façons de déterminer par programme si l'appareil est un téléphone ou une tablette. Cependant, si vous lisez la documentation , ce n'est pas la méthode recommandée pour prendre en charge différentes tailles d'écran.
Au lieu de cela, déclarez différentes ressources pour les tablettes ou les téléphones. Pour ce faire , mes dossiers en ajoutant des ressources supplémentaires pour layout, valuesetc.
Pour Android 3.2 (niveau d'API 13) activé, ajoutez un sw600dpdossier. Cela signifie que le s mallest w idth est au moins 600dp, qui est approximativement la fracture téléphone / tablette. Cependant, vous pouvez également ajouter d'autres tailles. Consultez cette réponse pour un exemple de la façon d'ajouter un fichier de ressources de mise en page supplémentaire.
Si vous prenez également en charge les appareils antérieurs à Android 3.2, vous devrez ajouter largexlarge dossiers ou pour prendre en charge les tablettes. (Les téléphones sont généralement smallet normal.)
Voici une image de ce que vos ressources pourraient aimer après l'ajout de fichiers xml supplémentaires pour différentes tailles d'écran.
Lorsque vous utilisez cette méthode, le système détermine tout pour vous. Vous n'avez pas à vous soucier du périphérique utilisé au moment de l'exécution. Vous fournissez simplement les ressources appropriées et laissez Android faire tout le travail.
Remarques
Vous pouvez utiliser alias pour éviter de dupliquer des fichiers de ressources identiques.
Cette solution ne fonctionne par exemple pas sur un émulateur avec API 18 et Nexus 7 1200 x 1920 xhdpi!
Ingo
Cela ne fonctionne plus sur certains appareils. Par exemple, il renvoie false pour l'appareil Samsung Mega
bkurzius
Ouais .. Cela ne fonctionne plus ... J'avais l'habitude d'ajouter du booléen dans tout le fichier de chaîne pour chaque dossier values, values_large etc <bool name = "isTablet"> false </bool> <bool name = "isLargeTablet"> false </bool> puis vérifiez si R.bool.isTablet est vrai pour trouver si l'appareil est une tablette
Vyshnavi
1
Si la détection de la taille de l'écran ne renvoie pas la valeur correcte sur les appareils plus récents, essayez:
/*
Returns '1' if device is a tablet
or '0' if device is not a tablet.
Returns '-1' if an error occured.
May require READ_EXTERNAL_STORAGE
permission.
*/publicstaticint isTablet(){try{InputStream ism =Runtime.getRuntime().exec("getprop ro.build.characteristics").getInputStream();byte[] bts =newbyte[1024];
ism.read(bts);
ism.close();boolean isTablet =newString(bts).toLowerCase().contains("tablet");return isTablet ?1:0;}catch(Throwable t){t.printStackTrace();return-1;}}
Testé sur Android 4.2.2 (désolé pour mon anglais.)
Je sais que ce n'est pas directement une réponse à votre question, mais d'autres réponses ici donnent une bonne idée de la façon d'identifier la taille de l'écran. Vous avez écrit dans votre question que vous aviez des problèmes d'inclinaison et que cela m'est arrivé aussi.
Si vous exécutez le gyroscope (ou le capteur de rotation) sur un smartphone, les axes x et y peuvent être définis différemment que sur une tablette, selon l'orientation par défaut de cet appareil (par exemple, Samsung GS2 est le portrait par défaut, Samsung GT-7310 est paysage par défaut, le nouveau Google Nexus 7 est le portrait par défaut, bien qu'il s'agisse d'une tablette!).
Maintenant, si vous souhaitez utiliser Gyroscope, vous pourriez vous retrouver avec une solution fonctionnelle pour les smartphones, mais la confusion des axes sur certaines tablettes ou l'inverse.
Si vous utilisez l'une des solutions ci-dessus pour choisir uniquement la taille de l'écran, puis appliquez
pour retourner l'axe s'il a une taille d'écran grande ou très grande, cela peut fonctionner dans 90% des cas, mais par exemple sur le Nexus 7, cela causera des problèmes (car il a une orientation portrait par défaut et une grande taille d'écran).
Le moyen le plus simple de résoudre ce problème est fourni dans le RotationVectorSample fourni avec les démos de l'API en définissant sceenOrientation sur nosensordans votre manifeste:
com.sec.feature.multiwindow.tablet dans le gestionnaire de packages est spécifique uniquement à la tablette et com.sec.feature.multiwindow.phone est spécifique au téléphone.
La méthode ci-dessous calcule la longueur diagonale de l'écran de l'appareil pour décider que l'appareil est un téléphone ou une tablette. le seul souci de cette méthode est de savoir quelle est la valeur seuil pour décider si l'appareil est une tablette ou non. dans l'exemple ci-dessous, je l'ai défini sur 7 pouces et plus.
Il est de plus en plus difficile de faire la distinction entre le téléphone et la tablette. Par exemple (en août 2015), l'appareil Samsung Mega 6.3 extrait les ressources des dossiers sw600dp - donc en ce qui concerne Android, il s'agit d'une tablette.
La réponse de @Vyshnavi fonctionne dans tous les appareils que nous avons testés mais pas pour Mega 6.3.
La réponse @Helton Isac ci-dessus renvoie le Mega 6.3 en tant que téléphone - mais comme l'appareil saisit toujours des ressources de sw600dp, il peut causer d'autres problèmes - par exemple, si vous utilisez un viewpager pour les téléphones et non pour les tablettes, vous vous retrouverez avec des erreurs NPE .
En fin de compte, il semble juste qu'il y ait trop de conditions à vérifier et nous devrons peut-être accepter que certains téléphones soient en fait des tablettes :-P
Explication pour -1? , c'est une méthode recommandée par google.
Jorgesys
0
pourquoi utiliser ça?
Usethis method which returns truewhen the device is a tablet
publicboolean isTablet(Context context){return(context.getResources().getConfiguration().screenLayout
&Configuration.SCREENLAYOUT_SIZE_MASK)>=Configuration.SCREENLAYOUT_SIZE_LARGE;}
Je vois de nombreuses façons ci-dessus.
/**
* Check if the Configuration's current {@link #screenLayout} is at
* least the given size.
*
* @param size The desired size, either {@link #SCREENLAYOUT_SIZE_SMALL},
* {@link #SCREENLAYOUT_SIZE_NORMAL}, {@link #SCREENLAYOUT_SIZE_LARGE}, or
* {@link #SCREENLAYOUT_SIZE_XLARGE}.
* @return Returns true if the current screen layout size is at least
* the given size.
*/publicboolean isLayoutSizeAtLeast(int size){int cur = screenLayout&SCREENLAYOUT_SIZE_MASK;if(cur == SCREENLAYOUT_SIZE_UNDEFINED)returnfalse;return cur >= size;}
J'avais besoin de détecter le smartphone / la tablette uniquement dans le fichier de mise en page, car j'utilise le code de navigation.
J'ai d'abord créé un répertoire layout-sw600dp mais cela ne fonctionnait pas bien car il s'activerait sur mon Nokia 8 en mode paysage, mais la hauteur de l'écran serait trop petite.
J'ai donc renommé le répertoire en layout-sw600dp-h400dp et j'ai obtenu l'effet souhaité. Le paramètre h-xxxdp doit dépendre de la quantité de contenu que vous souhaitez déposer sur votre mise en page et, en tant que tel, doit dépendre de l'application.
privateboolean isTabletDevice(){if(android.os.Build.VERSION.SDK_INT >=11){// honeycomb// test screen size, use reflection because isLayoutSizeAtLeast is// only available since 11Configuration con = getResources().getConfiguration();try{Method mIsLayoutSizeAtLeast = con.getClass().getMethod("isLayoutSizeAtLeast",int.class);boolean r =(Boolean) mIsLayoutSizeAtLeast.invoke(con,0x00000004);// Configuration.SCREENLAYOUT_SIZE_XLARGEreturn r;}catch(Exception x){
x.printStackTrace();returnfalse;}}returnfalse;}
N'est plus valide avec ICS. En effet, il existe des tablettes avec des versions Android inférieures à 11
mdelolmo
1
Ce n'est PAS fiable. Les nouveaux téléphones ICS ont un niveau d'API> 11.
Jason Robinson
-1
Je pense qu'une tablette a une largeur et une hauteur minimale et maximale de 600 px,
il faut donc connaître la densité de l'écran et la hauteur / largeur en dp,
pour récupérer la valeur:
Ce n'est pas correct car Samsung Galaxy S3 resultion 720 x 1280.
Nikhil
-1
Par exemple, avoir une différence importante (au moins pour mon programme) entre le téléphone et la tablette. Il s'agit de l'orientation par défaut de l'appareil. Le téléphone a une orientation portrait, la tablette - paysage. Et respectivement méthode pour déterminer l'appareil:
Toutes les tablettes n'ont pas une orientation paysage par défaut. Et si l'orientation «par défaut» est importante pour votre programme, elle est probablement erronée à d'autres égards. Voir cet article du blog des développeurs Android pour un exemple.
Dan Hulme
Pouvez-vous donner des exemples spécifiques de tablettes dont la largeur par défaut est inférieure à la hauteur? Et bien sûr, vous savez mieux ce que devrait être mon application: D.
Argent
Le Nexus 7 en serait un exemple. Mais vous n'avez pas à me croire sur parole: lisez l'article que j'ai lié, qui explique tout.
Dan Hulme
Je pense qu'il faudrait changer le nom de ma méthode. En fait, plus important encore (au moins pour mon application;)) l'orientation de l'appareil par défaut, et ma méthode est adéquate pour cette tâche. Également très correctement identifié le problème @Nanne answer, voir ci-dessus.
Argent du
-1
Je recommande la bibliothèque Android «caféine» qui contient un téléphone ou une tablette, et 10 pouces ~!
Pour moi, la distinction entre téléphone et tablette n'est pas la taille de l'appareil et / ou la densité de pixels, qui changera avec la technologie et le goût, mais plutôt le rapport d'écran. Si j'affiche un écran de texte, j'ai besoin de savoir si, disons, 15 longues lignes sont nécessaires (téléphone) contre 20 lignes plus courtes (tablette). Pour mon jeu, j'utilise ce qui suit pour une estimation approximative du rectangle que mon logiciel traitera:
Réponses:
Comme cela a été mentionné précédemment, vous ne souhaitez pas vérifier si l'appareil est une tablette ou un téléphone mais vous souhaitez connaître les fonctionnalités de l'appareil,
La plupart du temps, la différence entre une tablette et un téléphone réside dans la taille de l'écran, c'est pourquoi vous souhaitez utiliser des fichiers de mise en page différents. Ces fichiers sont stockés dans les
res/layout-<qualifiers>
répertoires. Vous pouvez créer un fichier XML dans le directoyres/values-<same qualifiers>
pour chacune de vos mises en page et y placer une ressource int / bool / string pour distinguer les mises en page que vous utilisez.Exemple:
Fichier
res/values/screen.xml
(en supposant qu'ilres/layout/
contient vos fichiers de mise en page pour les combinés)Fichier
res/values-sw600dp/screen.xml
(en supposant qu'ilres/layout-sw600dp/
contient vos fichiers de mise en page pour les petites tablettes comme la Nexus 7)Fichier
res/values-sw720dp/screen.xml
(en supposant qu'ilres/layout-sw720dp/
contient vos fichiers de mise en page pour les grandes tablettes comme le Nexus 10):Désormais, le type d'écran est accessible via la
R.string.screen_type
constante.la source
Pour détecter si l'appareil est une tablette ou non, utilisez le code suivant:
Les tailles d'écran LARGE et XLARGE sont déterminées par le fabricant en fonction de la distance de l'œil à laquelle elles doivent être utilisées (d'où l'idée d'une tablette).
En savoir plus: http://groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f
la source
Configuration.SCREENLAYOUT_SIZE_XLARGE
, donc vous n'avez pas besoin d'utiliser une constante, et vous pouvez l'utiliser>= LARGE
.Ce post m'a beaucoup aidé,
Malheureusement, je n'ai pas la réputation nécessaire pour évaluer toutes les réponses qui m'ont aidé.
J'avais besoin d'identifier si mon appareil était une tablette ou un téléphone, avec cela je pourrais implémenter la logique de l'écran. Et dans mon analyse, la tablette doit mesurer plus de 7 pouces (Xlarge) à partir de MDPI.
Voici le code ci-dessous, qui a été créé à partir de cet article.
la source
Pourquoi ne pas calculer la taille de la diagonale de l'écran et l'utiliser pour décider si l'appareil est un téléphone ou une tablette?
Bien sûr, on peut se demander si le seuil doit être de 9 pouces ou moins.
la source
il n'y a pas de différence. Vous devez définir ce que vous pensez être la différence et vérifier cela. Un onglet Galaxy est-il un téléphone? ou une tablette? et pourquoi?
Vous devez définir les fonctionnalités spécifiques que vous recherchez et coder pour cela.
Il semble que vous recherchez «inclinaison». Je pense que c'est la même chose que l'accéléromètre (est-ce un mot?). Vous pouvez simplement vérifier si l'appareil le prend en charge, en utilisant:
(de http://stuffthathappens.com/blog/2009/03/15/android-accelerometer/ . Je ne l'ai pas testé)
la source
Je suppose que lorsque vous définissez «Mobile / Téléphone», vous souhaitez savoir si vous pouvez passer un appel téléphonique sur l'appareil, ce qui ne peut pas être fait sur quelque chose qui serait défini comme une «tablette». La façon de vérifier cela est ci-dessous. Si vous souhaitez savoir quelque chose en fonction des capteurs, de la taille de l'écran, etc., c'est vraiment une question différente.
En outre, tout en utilisant la résolution d'écran, ou la gestion des ressources large par rapport à xlarge, peut avoir été une approche valide dans le passé, de nouveaux appareils `` mobiles '' sont maintenant livrés avec des écrans si grands et des résolutions élevées qu'ils brouillent cette ligne si vous le souhaitez vraiment pour connaître les appels téléphoniques par rapport à aucune capacité d'appel téléphonique, ce qui suit est «meilleur».
la source
Basé sur Robert Dale Johnson III et Helton Isac, j'ai trouvé ce code J'espère que c'est utile
Donc, dans votre code, créez un filtre comme
la source
Dans le code source de l' application Google IOSched 2017 , la méthode suivante est utilisée:
la source
Pour ceux qui souhaitent se référer au code de Google pour décider quels appareils utiliseront une interface utilisateur pour tablette, vous pouvez vous référer ci-dessous:
la source
shortSize
?Cette méthode est une recommandation de Google. Je vois ce code dans l'application Android officielle Google
iosched
la source
public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
Aucun code nécessaire
Les autres réponses répertorient de nombreuses façons de déterminer par programme si l'appareil est un téléphone ou une tablette. Cependant, si vous lisez la documentation , ce n'est pas la méthode recommandée pour prendre en charge différentes tailles d'écran.
Au lieu de cela, déclarez différentes ressources pour les tablettes ou les téléphones. Pour ce faire , mes dossiers en ajoutant des ressources supplémentaires pour
layout
,values
etc.Pour Android 3.2 (niveau d'API 13) activé, ajoutez un
sw600dp
dossier. Cela signifie que le s mallest w idth est au moins 600dp, qui est approximativement la fracture téléphone / tablette. Cependant, vous pouvez également ajouter d'autres tailles. Consultez cette réponse pour un exemple de la façon d'ajouter un fichier de ressources de mise en page supplémentaire.Si vous prenez également en charge les appareils antérieurs à Android 3.2, vous devrez ajouter
large
xlarge
dossiers ou pour prendre en charge les tablettes. (Les téléphones sont généralementsmall
etnormal
.)Voici une image de ce que vos ressources pourraient aimer après l'ajout de fichiers xml supplémentaires pour différentes tailles d'écran.
Lorsque vous utilisez cette méthode, le système détermine tout pour vous. Vous n'avez pas à vous soucier du périphérique utilisé au moment de l'exécution. Vous fournissez simplement les ressources appropriées et laissez Android faire tout le travail.
Remarques
Documents Android à lire
la source
Si vous ciblez uniquement le niveau d'API> = 13, essayez
à votre santé :-)
la source
En pensant aux "nouveaux" répertoires acceptés (values-sw600dp par exemple), j'ai créé cette méthode basée sur la largeur de l'écran DP:
Et sur cette liste, vous pouvez trouver certains des DP des appareils et des tailles de tablettes populaires:
Wdp / Hdp
GALAXY Nexus: 360/567
XOOM: 1280/752
GALAXY NOTE: 400/615
NEXUS 7: 961/528
GALAXY TAB (> 7 && <10): 1280/752
GALAXY S3: 360/615
Wdp = Largeur dp
Hdp = Hauteur dp
la source
Eh bien, la meilleure solution qui a fonctionné pour moi est assez simple:
Utilisé comme ceci:
Je ne veux vraiment pas regarder les tailles de pixels, mais je ne compte que sur la taille de l'écran.
Fonctionne bien car le Nexus 7 (LARGE) est détecté comme une tablette, mais pas le Galaxy S3 (NORMAL).
la source
Utilisez cette méthode qui renvoie true lorsque l'appareil est une tablette
la source
Si la détection de la taille de l'écran ne renvoie pas la valeur correcte sur les appareils plus récents, essayez:
Testé sur Android 4.2.2 (désolé pour mon anglais.)
la source
Je sais que ce n'est pas directement une réponse à votre question, mais d'autres réponses ici donnent une bonne idée de la façon d'identifier la taille de l'écran. Vous avez écrit dans votre question que vous aviez des problèmes d'inclinaison et que cela m'est arrivé aussi.
Si vous exécutez le gyroscope (ou le capteur de rotation) sur un smartphone, les axes x et y peuvent être définis différemment que sur une tablette, selon l'orientation par défaut de cet appareil (par exemple, Samsung GS2 est le portrait par défaut, Samsung GT-7310 est paysage par défaut, le nouveau Google Nexus 7 est le portrait par défaut, bien qu'il s'agisse d'une tablette!).
Maintenant, si vous souhaitez utiliser Gyroscope, vous pourriez vous retrouver avec une solution fonctionnelle pour les smartphones, mais la confusion des axes sur certaines tablettes ou l'inverse.
Si vous utilisez l'une des solutions ci-dessus pour choisir uniquement la taille de l'écran, puis appliquez
pour retourner l'axe s'il a une taille d'écran grande ou très grande, cela peut fonctionner dans 90% des cas, mais par exemple sur le Nexus 7, cela causera des problèmes (car il a une orientation portrait par défaut et une grande taille d'écran).
Le moyen le plus simple de résoudre ce problème est fourni dans le RotationVectorSample fourni avec les démos de l'API en définissant sceenOrientation sur
nosensor
dans votre manifeste:la source
com.sec.feature.multiwindow.tablet dans le gestionnaire de packages est spécifique uniquement à la tablette et com.sec.feature.multiwindow.phone est spécifique au téléphone.
la source
La méthode ci-dessous calcule la longueur diagonale de l'écran de l'appareil pour décider que l'appareil est un téléphone ou une tablette. le seul souci de cette méthode est de savoir quelle est la valeur seuil pour décider si l'appareil est une tablette ou non. dans l'exemple ci-dessous, je l'ai défini sur 7 pouces et plus.
la source
la source
Il est de plus en plus difficile de faire la distinction entre le téléphone et la tablette. Par exemple (en août 2015), l'appareil Samsung Mega 6.3 extrait les ressources des dossiers sw600dp - donc en ce qui concerne Android, il s'agit d'une tablette.
La réponse de @Vyshnavi fonctionne dans tous les appareils que nous avons testés mais pas pour Mega 6.3.
La réponse @Helton Isac ci-dessus renvoie le Mega 6.3 en tant que téléphone - mais comme l'appareil saisit toujours des ressources de sw600dp, il peut causer d'autres problèmes - par exemple, si vous utilisez un viewpager pour les téléphones et non pour les tablettes, vous vous retrouverez avec des erreurs NPE .
En fin de compte, il semble juste qu'il y ait trop de conditions à vérifier et nous devrons peut-être accepter que certains téléphones soient en fait des tablettes :-P
la source
C'est la méthode que j'utilise:
En utilisant:
Configuration. SCREENLAYOUT_SIZE_MASK
Configuration. SCREENLAYOUT_SIZE_LARGE
C'est la méthode recommandée!
la source
pourquoi utiliser ça?
Je vois de nombreuses façons ci-dessus.
il suffit d'appeler :
c'est bon?
la source
J'avais besoin de détecter le smartphone / la tablette uniquement dans le fichier de mise en page, car j'utilise le code de navigation.
J'ai d'abord créé un répertoire layout-sw600dp mais cela ne fonctionnait pas bien car il s'activerait sur mon Nokia 8 en mode paysage, mais la hauteur de l'écran serait trop petite.
J'ai donc renommé le répertoire en layout-sw600dp-h400dp et j'ai obtenu l'effet souhaité. Le paramètre h-xxxdp doit dépendre de la quantité de contenu que vous souhaitez déposer sur votre mise en page et, en tant que tel, doit dépendre de l'application.
la source
Veuillez vérifier le code ci-dessous.
la source
Je pense qu'une tablette a une largeur et une hauteur minimale et maximale de 600 px,
il faut donc connaître la densité de l'écran et la hauteur / largeur en dp,
pour récupérer la valeur:
la source
Par exemple, avoir une différence importante (au moins pour mon programme) entre le téléphone et la tablette. Il s'agit de l'orientation par défaut de l'appareil. Le téléphone a une orientation portrait, la tablette - paysage. Et respectivement méthode pour déterminer l'appareil:
EDITED: Suite aux discussions avec Dan Hulme a changé le nom de la méthode.
la source
Je recommande la bibliothèque Android «caféine» qui contient un téléphone ou une tablette, et 10 pouces ~!
utilisation très simple.
la bibliothèque est ici.
https://github.com/ShakeJ/Android-Caffeine-library
et utilise
la source
Pour moi, la distinction entre téléphone et tablette n'est pas la taille de l'appareil et / ou la densité de pixels, qui changera avec la technologie et le goût, mais plutôt le rapport d'écran. Si j'affiche un écran de texte, j'ai besoin de savoir si, disons, 15 longues lignes sont nécessaires (téléphone) contre 20 lignes plus courtes (tablette). Pour mon jeu, j'utilise ce qui suit pour une estimation approximative du rectangle que mon logiciel traitera:
la source
Je pense que c'est la façon la plus simple d'être honnête. Cela vérifiera la taille de l'écran utilisée:
Bonne chance!
la source