Tablet or Phone - Android

后端 未结 30 2130
难免孤独
难免孤独 2020-11-22 08:33

Is there a way to check if the user is using a tablet or a phone? I\'ve got problems with my tilt function and my new tablet (Transformer)

相关标签:
30条回答
  • 2020-11-22 09:18

    For those who want to refer to Google's code of deciding which devices will use a Tablet UI can refer to below:

      // SystemUI (status bar) layout policy
            int 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;
            } else if (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;
            }
            }
    
    0 讨论(0)
  • 2020-11-22 09:18

    If you are only targeting API level >= 13 then try

    public static boolean isTablet(Context context) {
        return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
    }
    

    cheers :-)

    0 讨论(0)
  • 2020-11-22 09:18

    below method is calculating the device screen's diagonal length to decide the device is a phone or tablet. the only concern for this method is what is the threshold value to decide weather the device is tablet or not. in below example i set it as 7 inch and above.

    public static boolean isTablet(Activity act)
    {
        Display display = act.getWindow().getWindowManager().getDefaultDisplay();
        DisplayMetrics displayMetrics = new DisplayMetrics();
        display.getMetrics(displayMetrics);
    
        float width = displayMetrics.widthPixels / displayMetrics.xdpi;
        float height = displayMetrics.heightPixels / displayMetrics.ydpi;
    
        double screenDiagonal = Math.sqrt( width * width + height * height );
        int inch = (int) (screenDiagonal + 0.5);
        Toast.makeText(act, "inch : "+ inch, Toast.LENGTH_LONG).show();
        return (inch >= 7 );
    }
    
    0 讨论(0)
  • 2020-11-22 09:18
    public boolean isTablet() {
            int screenLayout = getResources().getConfiguration().screenLayout;
            return (Build.VERSION.SDK_INT >= 11 &&
                    (((screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) || 
                     ((screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE)));
        }
    
    0 讨论(0)
  • 2020-11-22 09:19

    If screen size detection doesn't return correct value on newer devices, give a try:

    /*
     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.
     */
    public static int isTablet()
    {
        try
        {
            InputStream ism = Runtime.getRuntime().exec("getprop ro.build.characteristics").getInputStream();
            byte[] bts = new byte[1024];
            ism.read(bts);
            ism.close();
    
            boolean isTablet = new String(bts).toLowerCase().contains("tablet");
            return isTablet ? 1 : 0;
        }
        catch (Throwable t)
        {t.printStackTrace(); return -1;}
    }
    

    Tested on Android 4.2.2 (sorry for my English.)

    0 讨论(0)
  • 2020-11-22 09:20

    As it has been mentioned before, you do not want to check whether the device is a tablet or a phone but you want to know about the features of the device,

    Most of the time, the difference between a tablet and a phone is the screen size which is why you want to use different layout files. These files are stored in the res/layout-<qualifiers> directories. You can create an XML file in the directoy res/values-<same qualifiers> for each of your layouts and put an int/bool/string resource into it to distinguish between the layouts you use.

    Example:

    File res/values/screen.xml (assuming res/layout/ contains your layout files for handsets)

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


    File res/values-sw600dp/screen.xml (assuming res/layout-sw600dp/ contains your layout files for small tablets like the Nexus 7)

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


    File res/values-sw720dp/screen.xml (assuming res/layout-sw720dp/ contains your layout files for large tablets like the Nexus 10):

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


    Now the screen type is accessible via the R.string.screen_type constant.

    0 讨论(0)
提交回复
热议问题