301 votes

Déterminer si l’appareil est un smartphone ou tablette ?

Je voudrais obtenir des informations sur un appareil pour voir 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:

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

Cependant, cela semble inutile pour mon cas.


Cette solution fonctionne pour moi maintenant:

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

828voto

ol_v_er Points 8532

Ce sujet est discuté dans l'Android de Formation:

http://developer.android.com/training/multiscreen/screensizes.html#TaskUseSWQuali

Si vous lisez la totalité du sujet, ils expliquent comment définir une valeur booléenne dans un fichier de valeur (comme res/values-sw600dp/):

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

Parce que le sw600dp qualificatif n'est valable que pour les plates-formes au-dessus de android 3.2. Si vous voulez vous assurer que cette technique fonctionne sur toutes les plateformes (3.2), de créer le même fichier dans res/values-xlarge dossier:

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

Puis, dans la "norme" de la valeur de fichiers (comme res/values/), vous définissez le booléen à false:

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

Ensuite, à vous de l'activité, vous pouvez obtenir cette valeur et de vérifier si vous êtes en cours d'exécution dans une tablette de la taille de l'appareil:

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

97voto

gtsouk Points 1172

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

 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>=5){
    // 5inch device or bigger
}else{
    // smaller device
}
 

40voto

Mon hypothèse, c'est que lorsque vous définissez Mobile/Téléphone "vous voulez savoir si vous pouvez faire un appel téléphonique sur l'appareil qui ne peut pas être fait sur quelque chose qui pourrait être défini comme une" Tablette. La façon de vérifier cela est ci-dessous. Si vous voulez savoir quelque chose basé sur des capteurs, la taille de l'écran, etc alors c'est vraiment une question différente.

Aussi, tout en utilisant la résolution de l'écran, ou la gestions des ressources de grandes vs xlarge, peut avoir été une approche valable dans le passé, de nouveaux 'Mobile' appareils sont maintenant venir avec de tels écrans de grande taille et de haute résolutions qu'ils sont flous cette ligne si vous voulez vraiment en savoir appel téléphonique vs aucun appel téléphonique de la capacité de la ci-dessous est "meilleur".

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

32voto

Jason Points 566

J'aime Ol_v_er de la solution et de sa simplicité d'utilisation cependant, j'ai trouvé qu'il n'est pas toujours aussi simple que cela, ce qui avec les nouveaux appareils et affiche constamment à venir, et je veux être un peu plus "granuleux" en essayant de comprendre la taille réelle de l'écran. Une autre solution que j'ai trouvé ici par John utilise une ressource de Chaîne, au lieu d'un booléen, pour spécifier la taille de la tablette. Donc, au lieu de simplement mettre de vrai dans un /res/values-sw600dp/screen.xml fichier (en supposant que c'est là que vos plans sont pour les petits comprimés) vous pouvez mettre:

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

De référence comme suit et ensuite faire ce dont vous avez besoin sur la base du résultat:

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

Sean O'Toole de réponse pour Détecter de 7 pouces et 10 pouces de la tablette par programme était aussi ce que je cherchais. Vous pourriez vouloir vérifier si les réponses données ici ne permettent pas d'être aussi précis que vous le souhaitez. Il a fait du bon travail en expliquant comment calculer différents indicateurs de comprendre ce que vous êtes vraiment affaire avec.

Mise à JOUR

Dans la recherche à la Google I/O 2013 app code source, j'ai couru à travers la suite qu'ils utilisent pour déterminer si l'appareil est d'un comprimé ou pas, alors j'ai pensé que je voudrais ajouter. Ci-dessus vous donne un peu plus de "contrôle" sur elle, mais si vous voulez juste pour savoir si c'est une tablette, la suite est assez simple:

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

7voto

Nolf Points 51

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:

     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 
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X