Як знайсці тэлефон або планшэтны ПК у Android, Праграмным?

Мой выпадак, што логіка аднолькавая для абодвух тэлефонаў і планшэтаў. Але ёсць невялікая розніца ў макеце. І я паспрабаваў з дапамогай наступнага кода

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

Samsung Tab 10" has the resolution of 1280 * 800 and S3 has the resolution of 1270 * 720. And this code returns the Size as XLarge for both the Tab and Phone as its criteria for checking is > 960 * 720.

Я адчуў ўстаўкі адпаведнага карыстацкага інтэрфейсу ў тэчцы макета ў Res як Layout, Layout-Large і Layout-XLarge. Але гэта не паўплывала на так ці інакш. Пры праверцы ён узяў UI з папкі Layout.

Ва ўсякім выпадку, нават калі я змяшчаю карыстацкі інтэрфейс у розных папках макета, я павінен праверыць іх у файле клас, каб усталяваць адпаведны ContentView.

Ці ёсць іншы спосаб, каб знайсці яго?

20
Праверце: гэта , гэта , this , гэта
дададзена аўтар Paresh Mayani, крыніца

7 адказы

Гэтая тэма абмяркоўваецца ў падрыхтоўцы Android:

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

Калі вы чыталі ўсю тэму, яны тлумачаць, як усталяваць лагічнае значэнне ў пэўным файле значэння (як Рэз/значэнні-sw600dp/):


    true

Паколькі sw600dp класіфікатар дзейнічае толькі для платформаў Android 3.2 вышэй. Калі вы хочаце, каб пераканацца, што гэты метад працуе на ўсе платформы (да 3.2), стварыць адзін і той жа файл у Рэз/значэнне-XLarge тэчкі:


    true

Затым, у «стандартным» файл значэння (як Рэз/значэння/), усталяваць лагічнае значэнне мана:


    false

Тады ў вас дзейнасці, вы можаце атрымаць гэта значэнне і праверыць, калі вы працуеце ў прыладзе памерам таблеткі:

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);

Гэта не мая логіка, Заслуга ol_v_er для гэтай простай і лёгкі approach.i проста скапіяваў яго.

You can check the orginal answer here

<�Моцны> Некаторыя дадатковыя звесткі

Вы зараз сцяг пазначыць, ці працуе прыкладанне на тэлефоне або планшэце.

Я стварыў два пакеты для апрацоўкі карыстацкага інтэрфейсу і яго функцыянальнасць,

com.phone
com.tablet

І вы памяняеце кіраванне вашага неабходнага пакета

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
   //do something
    //Start activity for tablet
} else {
   //do something else
    //Start activity for phone     
}

<�моцны> Глядзі </моцны >

Note :I think for both 10 inch and 7 inch screen app take resources from res/values-sw600dp/ . But To be more specific I think for 10 inch tablet screen we can use res/values-sw720dp/


    true

38
дададзена
@Patrick Я прымаю гэта скапіяваны падыход
дададзена аўтар edwin, крыніца
Вы павінны спасылацца на сваю крыніцу пры капіяванні ўстаўкі: stackoverflow.com/a/9308284
дададзена аўтар Patrick, крыніца

паспрабуйце гэта

    public boolean isTablet(Context context) {
        boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
        boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
        return (xlarge || large);
    }

Яна вяртае ісціну, калі вы выкарыстоўваеце планшэт. Гэта было праверана на Samsung Galaxy Tab 7 "і Samsung Galaxy S3.

14
дададзена
праверка на двух прыладах <�я> не </я> добры досыць праверыць. Будзьце вельмі асцярожныя гэты метад, паколькі гэта не з'яўляецца надзейным.
дададзена аўтар stevebot, крыніца
засноўваючы сябе на вымярэнні прылады з'яўляецца найгоршай ідэяй можна вызначыць прыладу. Я не ведаю, чаму гэта правільны адказ.
дададзена аўтар Jorel Amthor, крыніца

Паспрабуйце гэты код прыкладанне працуе тэлефон прылада або планшэт лёгка аштрафаваць выклікаць метад OnCreate() усярэдзіне

isTabletDevice (актыўнасць)

private static boolean isTabletDevice(Context activityContext) {

    boolean device_large = ((activityContext.getResources().getConfiguration().screenLayout &
          Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE)
    DisplayMetrics metrics = new DisplayMetrics();
    Activity activity = (Activity) activityContext;
    activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    if (device_large) {
        //Tablet
        if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT){              
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_TV){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_280){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_400) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_XXHIGH) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_560) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_XXXHIGH) {
            return true;
        }            
    }else{
        //Mobile
         } 
    return false;
}
3
дададзена

Напрыклад, вы маглі б ўсталяваць некаторыя тэчкі Рэс-значэння:

RES/значэнні-XLarge RES/значэнне-вялікае RES/значэнні-sw600dp

і г.д. Тады вы можаце абвясціць булева для кожнага з іх:

    
true
    

або

    
true
    

Вы можаце атрымаць значэнне па

   boolean xlargeValue = getResources().getBoolean(R.bool.isXlarge);
   boolean largevalue = getResources().getBoolean(R.bool.isLarge);
   boolean tabletValue = getResources().getBoolean(R.bool.sw620dp):
2
дададзена

Выкарыстанне розных файлаў рэсурсаў, а не спрабаваць вызначыць яго праграмна. Гэтага будзе дастаткова для большасці выпадкаў і з'яўляецца тое, што дакументацыі рэкамендую.

enter image description here

Глядзіце мой адказ больш поўнае .

1
дададзена

Паспрабуйце гэты код. Вы можаце атрымаць на экране цалі, на аснове памеру вы можаце атрымаць таблеткі ці АНДРОІД прылады

 String inputSystem;
    inputSystem = android.os.Build.ID;
    Log.d("hai",inputSystem);
    Display display = getWindowManager().getDefaultDisplay(); 
    int width = display.getWidth(); //deprecated
    int height = display.getHeight(); //deprecated
    Log.d("hai",width+"");
    Log.d("hai",height+"");
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(width/dm.xdpi,2);
    double y = Math.pow(height/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("hai","Screen inches : " + screenInches+"");
1
дададзена
Так, але калі ёсць толькі гэтыя два прылады (Say Samsung S3 і Samsung 10 "Tablet) мы можам параўноўваць, але як я зрабіць для іншага прылады таксама ....... ёсць розныя памеры дазволу для розных прылад. Прылада S4 экран яшчэ больш.
дададзена аўтар VIGNESH, крыніца
але АНДРОІД памер прылады не як памер таблеткі, так што вы можаце атрымаць толькі гэта адно мабільнае прылада Android або планшэт.
дададзена аўтар sunil kumar, крыніца

Гэта працуе выдатна ў маім дадатку:

private boolean isPhoneDevice(){

    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);

}
0
дададзена
Гэта толькі правярае, ці з'яўляецца прылада можа працаваць у якасці тэлефона. Вызначэнне: «Прылада мае радиотелефонирование з падтрымкай перадачы дадзеных.». Некаторыя таблеткі і тэлефоны з сапраўды большай screns вяртаюць ісціну пра гэта.
дададзена аўтар Andreas Evjenth, крыніца