Tablet or Phone - Android

后端 未结 30 2128
难免孤独
难免孤独 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:20

    I know this is not directly an answer to your question, but other answers here give a good idea of how to identify screen size. You wrote in your question that you got problems with the tilting and this just happened to me as well.

    If you run the gyroscope (or rotation sensor) on a smartphone the x- and y-axis can be differently defined than on a tablet, according to the default orientation of that device (e.g. Samsung GS2 is default portrait, Samsung GT-7310 is default landscape, new Google Nexus 7 is default portrait, although it is a tablet!).

    Now if you want to use Gyroscope you might end up with a working solution for smartphones, but axis-confusion on some tablets or the other way round.

    If you use one of the solutions from above to only go for screen-size and then apply

    SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X, 
        SensorManager.AXIS_Y, outputRotationMatrix);
    

    to flip the axis if it has a large or xlarge screen-size this might work in 90% of the cases but for example on the Nexus 7 it will cause troubles (because it has default portrait orientation and a large screen-size).

    The simplest way to fix this is provided in the RotationVectorSample that ships with the API demos by setting the sceenOrientation to nosensor in your manifest:

    <activity
        ...
        android:screenOrientation="nosensor">
    ...
    </activity>
    
    0 讨论(0)
  • 2020-11-22 09:20

    E.g. have one important difference (at least for my program) between the phone and tablet. It is the default orientation of the device. Phone has a portrait orientation, the tablet - landscape. And respectively method to determine the device:

    private static boolean isLandscapeDefault(Display display) {
        Log.d(TAG, "isTablet()");
        final int width = display.getWidth();
        final int height = display.getHeight();
    
        switch (display.getOrientation()) {
        case 0: case 2:
            if(width > height) return true;
            break;
        case 1: case 3:
            if(width < height) return true;
            break;
        }
        return false;
    }
    

    EDITED: Following the discussions with Dan Hulme changed the name of the method.

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

    This is the method that i use :

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

    Using:

    Configuration.SCREENLAYOUT_SIZE_MASK

    Configuration.SCREENLAYOUT_SIZE_LARGE

    This is the recommended method!

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

    Based on Robert Dale Johnson III and Helton Isac I came up with this code Hope this is useful

    public static boolean isTablet(Context context) {
        TelephonyManager manager = 
            (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        if (manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) {
            //Tablet
            return true;
        } else {
            //Mobile
            return false; 
        }
    }
    
    public static boolean isTabletDevice(Context activityContext) {
        // Verifies if the Generalized Size of the device is XLARGE to be
        // considered a Tablet
        boolean 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 = new DisplayMetrics();
            Activity activity = (Activity) activityContext;
            activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160,
            // DENSITY_TV=213, DENSITY_XHIGH=320
            if (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!
                 return true;
            }
        }
    
        // No, this is not a tablet!
        return false;
    }
    

    So in your code make a filter like

    if(isTabletDevice(Utilities.this) && isTablet(Utilities.this)){
        //Tablet
    } else {
        //Phone
    }
    
    0 讨论(0)
  • 2020-11-22 09:23

    I think a tablet has a min and max 600 px width and height,
    so need to know the screen density and the height/width in dp,
    to retrieve the value :

    DisplayMetrics metrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int width = display.getWidth(); 
    int height = display.getHeight(); 
    float density = metrics.density;  
    if((width/density>=600 && height/density>=600))
     isTablette = true;
    else
     isTablette = false;
    

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

    I'm recommend android library 'caffeine' That's contain get Phone or tablet, and 10inch~!

    very easy use.

    the library is here.

    https://github.com/ShakeJ/Android-Caffeine-library

    and use

    DisplayUtil.isTablet(this);
    DisplayUtil.isTenInch(this);
    
    0 讨论(0)
提交回复
热议问题