Máy tính bảng hoặc điện thoại - Android


140

Có cách nào để kiểm tra xem người dùng đang sử dụng máy tính bảng hay điện thoại không? Tôi đã gặp sự cố với chức năng nghiêng của mình và máy tính bảng mới (Transformer)


26
Bạn đang hỏi sai câu hỏi. Không quan trọng thiết bị là điện thoại, máy tính bảng, tivi, máy nướng bánh mì, tách trà hay nhiệt kế. Vấn đề là khả năng, không phải là lớp xác định tiếp thị của thiết bị. Vui lòng đặt câu hỏi mới cho Android mô tả những khả năng bạn đang tìm kiếm và cách phát hiện xem thiết bị có khả năng đó hay không hoặc tự lọc ra khỏi Thị trường cho các thiết bị thiếu khả năng đó.
CommonsWare

7
@CommonsWare: đôi khi bạn muốn thêm các tính năng bổ sung cho các thiết bị có màn hình lớn hơn.
Bobs

10
@breceivemail: Có nghĩa là bạn cần kiểm tra xem thiết bị có màn hình lớn hơn không. "Màn hình lớn hơn"! = "Máy tính bảng".
CommonsWare

2
Một câu trả lời tốt hơn có thể được tìm thấy ở đây: stackoverflow.com/a/9308284/1750829 Đơn giản như vậy :-)
Hoặc Kazaz

3
Tôi muốn downvote toàn bộ trang này! Một điện thoại không điện thoại, một máy tính bảng không. Khá nhiều lời đề nghị là những bản hack bẩn mà không ai nên sử dụng. Thế giới sẽ là một nơi tốt đẹp hơn nếu không ai nhìn thấy trang này một lần nữa!
Đánh dấu Gjøl

Câu trả lời:


122

Như đã được đề cập trước đây, bạn không muốn kiểm tra xem thiết bị là máy tính bảng hay điện thoại nhưng bạn muốn biết về các tính năng của thiết bị,

Hầu hết thời gian, sự khác biệt giữa máy tính bảng và điện thoại là kích thước màn hình, đó là lý do tại sao bạn muốn sử dụng các tệp bố cục khác nhau. Những tập tin này được lưu trữ trong các res/layout-<qualifiers>thư mục. Bạn có thể tạo một tệp XML trong directoy res/values-<same qualifiers>cho từng bố cục của mình và đặt tài nguyên int / bool / chuỗi vào đó để phân biệt giữa các bố cục bạn sử dụng.

Thí dụ:

Tệp res/values/screen.xml(giả sử res/layout/chứa tệp bố cục của bạn cho thiết bị cầm tay)

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


Tệp res/values-sw600dp/screen.xml(giả sử res/layout-sw600dp/chứa tệp bố cục của bạn cho máy tính bảng nhỏ như Nexus 7)

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


Tệp res/values-sw720dp/screen.xml(giả sử res/layout-sw720dp/chứa tệp bố cục của bạn cho máy tính bảng lớn như Nexus 10):

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


Bây giờ loại màn hình có thể truy cập thông qua R.string.screen_typehằng số.


4
+1, câu trả lời tuyệt vời vì nó cung cấp cái nhìn sâu sắc hơn về lý do tại sao bạn thực sự muốn kiểm tra máy tính bảng / điện thoại. Chúng tôi sắp sửa bước sang một thời điểm, trong đó điện thoại sẽ trở thành tablet nhỏ anyway;)
Andr

Làm thế nào điều này áp dụng cho điện thoại lớn, chẳng hạn như Galaxy Note và Nexus 6 mới? Bằng cách sử dụng kỹ thuật này, những thiết bị lớn này sẽ được phát hiện là điện thoại hay máy tính bảng?
PerracoLabs

1
Thật không may, apporach này không hoạt động cho thiết bị Samsung Mega 6.3 và trả lại dưới dạng máy tính bảng (sw600dp) - có ý tưởng nào khác để nắm bắt điều này không?
bkurzius

máy tính bảng có gọi điện thoại không?
Mike

61

Để phát hiện thiết bị có phải là máy tính bảng hay không, hãy sử dụng mã sau:

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

Kích thước màn hình LARGE và XLARGE được xác định bởi nhà sản xuất dựa trên khoảng cách từ mắt mà chúng sẽ được sử dụng (do đó là ý tưởng của một chiếc máy tính bảng).

Thông tin thêm: http://groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f


Trên cả hai - Kindle Fire và Motorola Droid Bionic - SCREENLAYOUT_SIZE_MASK == 15. Vậy tại sao giải pháp của bạn sẽ hoạt động?
IgorGanapolsky

Tôi tin rằng, kết quả này đúng trên Kindle Fire. Hôm nay tôi không có bionic cho tôi ... nhưng tôi sẽ kiểm tra sau vài ngày khi bạn tôi quay lại thị trấn. Tuy nhiên ..... Tôi đã thử nghiệm câu trả lời của Helton Isac và nó hoạt động rất tuyệt. Vui lòng kiểm tra điều đó quá.
petey

4
Configuration.SCREENLAYOUT_SIZE_XLARGE, vì vậy bạn không phải sử dụng hằng số, và bạn có thể sử dụng >= LARGE.
Triang3l

2
Galaxy Note dường như báo cáo SCREENLAYOUT_SIZE_LARGE vì vậy nó sẽ bị phân loại sai thành máy tính bảng
MiguelSantirso

1
Nếu phông chữ của thiết bị nhỏ và kích thước hiển thị nhỏ trong cài đặt, trường hợp này được trả về đúng.
arul

38

Bài đăng này đã giúp tôi rất nhiều,

Thật không may, tôi không có danh tiếng cần thiết để đánh giá tất cả các câu trả lời đã giúp tôi.

Tôi cần xác định xem thiết bị của mình là máy tính bảng hay điện thoại, với điều đó tôi sẽ có thể thực hiện logic của màn hình. Và trong phân tích của tôi, máy tính bảng phải lớn hơn 7 inch (Xlarge) bắt đầu từ MDPI.

Đây là đoạn mã dưới đây, được tạo ra dựa trên bài đăng này.

/**
 * Checks if the device is a tablet or a phone
 * 
 * @param activityContext
 *            The Activity Context.
 * @return Returns true if the device is a Tablet
 */
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_TV
                || metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {

            // Yes, this is a tablet!
            return true;
        }
    }

    // No, this is not a tablet!
    return false;
}

2
Giải pháp tốt nhất mà tôi tìm thấy, cảm ơn bạn Helton Isac! Có lẽ bạn có thể thêm (cho một giải pháp tốt hơn) kiểm tra các inch của màn hình? dù sao, 10 cho giải pháp này
Aracem

7
Tôi thực sự không đồng ý. Đây là một phương pháp để tìm một kích thước màn hình nhất định. Một lần nữa, như tôi đã trả lời, KHÔNG có sự khác biệt giữa máy tính bảng và điện thoại. Đây không phải là một câu trả lời cho câu hỏi. Không thể phân biệt vì không có 1 khác biệt. Nếu bạn cần mã cho một số tính năng nhất định (như bạn dường như làm với một số kích thước màn hình nhất định), thì hãy làm như vậy, nhưng đừng gọi nó là máy tính bảng với điện thoại. Chủ đề bắt đầu dường như đặt dòng @ chức năng nghiêng nhất định. Đọc bình luận của @commonware về câu hỏi này.
Nanne

1
Tôi đồng ý với Nanne, nhưng như tôi đã nói, trong Ứng dụng của mình, tôi cần hiển thị hai bảng nếu màn hình đủ lớn để làm điều đó. Và tôi không thể sử dụng bố cục trong trường hợp này, vì logic màn hình nằm ở phía Java.
Helton Isac

3
Helton, thx cho điều này. Tôi nghĩ rằng điều này sẽ trả về: Kindle Fire: false, Moto Xoom (v1): true, Galaxy Note: false, Galaxy Tab 10.1 giới hạn: true
petey

Ngoài đối số, Cấu
hình.SCREENLAYOUT_SIZE_XLARGE

12

Tại sao không tính toán kích thước của đường chéo màn hình và sử dụng nó để đưa ra quyết định xem thiết bị là điện thoại hay máy tính bảng?

private boolean isTablet()
{
    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    int width = displayMetrics.widthPixels / displayMetrics.densityDpi;
    int height = displayMetrics.heightPixels / displayMetrics.densityDpi;

    double screenDiagonal = Math.sqrt( width * width + height * height );
    return (screenDiagonal >= 9.0 );
}

Tất nhiên người ta có thể tranh luận liệu ngưỡng nên là 9 inch hay ít hơn.


Điều này không hoạt động ... chỉ đơn giản là một số điện thoại báo cáo các giá trị mật độ sai và tính toán theo inch không thành công - xem tại đây: stackoverflow.com/questions/2193457/
Lỗi

Chà, tôi thích máy tính bảng 7 '(cỡ túi) và câu trả lời này là tốt nhất tôi nghĩ. Nhưng trả về (screenDia chéo> = 9.0); nên được trả về (screenDia chéo> = 6.5). Tuy nhiên phụ thuộc vào việc sử dụng như trong nhận xét trong các ý kiến ​​cho câu hỏi.
Jan Bergström

11

không có sự khác biệt Bạn nên xác định những gì bạn nghĩ là sự khác biệt, và kiểm tra xem điều đó. Là một tab thiên hà một điện thoại? hay một chiếc máy tính bảng? và tại sao?

Bạn nên xác định những tính năng cụ thể mà bạn đang tìm kiếm và mã cho điều đó.

Có vẻ như bạn đang tìm kiếm "độ nghiêng". Tôi nghĩ rằng đây là giống như gia tốc kế (đó có phải là một từ?). Bạn chỉ có thể kiểm tra xem thiết bị có hỗ trợ hay không, sử dụng:

public class Accel extends Activity implements SensorListener {
...
  SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
  boolean accelSupported = sensorMgr.registerListener(this,
        SENSOR_ACCELEROMETER,
        SENSOR_DELAY_UI);
...
}

(từ http: // warethathappens.com/blog/2009/03/15/android-accelerometer/ . Tôi chưa thử nghiệm nó)


Tôi đã gặp sự cố với chức năng nghiêng của mình và máy tính bảng mới (Biến áp)
Benny

Một loại câu trả lời ngớ ngẩn imo - tất nhiên có một sự khác biệt. Thiên hà = điện thoại. Tại sao? Bởi vì đó là một "điện thoại thông minh" theo nhà sản xuất cho một. Nếu bạn gợi ý rằng anh ấy cần kiểm tra kích thước, hoặc khả năng gọi điện, hoặc ... bất cứ điều gì - chỉ cần nói điều đó.
Dave

3
Tôi không đồng ý, nó có thể không hoạt động cho tất cả các điện thoại di động, trong khi một số máy tính bảng có các cảm biến này. Đó là lý do tại sao câu trả lời ban đầu của tôi về không có sự khác biệt. Dù sao, tôi đã thêm một số mã bạn nên thử.
Nanne

2
Vấn đề là, bởi vì máy tính bảng đang "xây dựng" ở chế độ nằm ngang, trục x và y của gia tốc kế bị lật khi bạn mong muốn ứng dụng của mình chạy ở chế độ dọc. Điều này có thể làm mọi thứ rối tung lên một chút :) Vì vậy, điều quan trọng là bạn có kiểm tra thời tiết bạn đang chạy trên máy tính bảng hay không.
pumpkee

1
Nhưng sau đó là cách khác => nếu đó là điều duy nhất làm cho thiết bị trở thành máy tính bảng, bạn nên tìm hiểu cách trục x / y hoạt động, chứ không phải cách khác. Tôi nghi ngờ bằng cách này là đúng cho tất cả máy tính bảng và / hoặc điện thoại?
Nanne

10

Giả định của tôi là khi bạn xác định 'Điện thoại di động / Điện thoại', bạn muốn biết liệu bạn có thể thực hiện cuộc gọi điện thoại trên thiết bị không thể thực hiện trên một thứ được xác định là 'Máy tính bảng' hay không. Cách để xác minh điều này là dưới đây. Nếu bạn muốn biết một cái gì đó dựa trên cảm biến, kích thước màn hình, vv thì đây thực sự là một câu hỏi khác.

Ngoài ra, trong khi sử dụng độ phân giải màn hình hoặc quản lý tài nguyên lớn so với xlarge, có thể là một cách tiếp cận hợp lệ trong các thiết bị 'Mobile' mới trước đây hiện đang có màn hình lớn và độ phân giải cao đến mức chúng làm mờ dòng này trong khi bạn thực sự muốn để biết cuộc gọi điện thoại và không có khả năng gọi điện thoại dưới đây là 'tốt nhất'.

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

9
Một số máy tính bảng có thể điện thoại và có loại GSM hoặc CDMA ... Vì vậy, giải pháp của bạn cũng không hoàn hảo.
arnouf

6

Dựa trên Robert Dale Johnson III và Helton Isac, tôi đã đưa ra mã này Hy vọng điều này hữu ích

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

Vì vậy, trong mã của bạn tạo một bộ lọc như

if(isTabletDevice(Utilities.this) && isTablet(Utilities.this)){
    //Tablet
} else {
    //Phone
}

5

Trong mã nguồn ứng dụng Google IOSched 2017 , phương pháp sau được sử dụng:

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

3

Đối với những người muốn tham khảo mã của Google về việc quyết định thiết bị nào sẽ sử dụng UI UI có thể tham khảo bên dưới:

  // 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;
        }
        }

2
giá trị của là shortSizegì?
kc ochibili

3

Phương pháp này được Google khuyên dùng. Tôi thấy mã này trong Ứng dụng Android chính thức của Googleiosched

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

Giải pháp này chẳng hạn như không hoạt động trên Trình giả lập với API 18 và Nexus 7 1200 x 1920 xhdpi!
Ingo

1
bạn nên thử nghiệm trên thiết bị thực :)
hqt

Tôi đã thử nghiệm trên Trình mô phỏng và kết quả của "isTablet (Ngữ cảnh ngữ cảnh) là sai. Hãy tự thử trên Trình giả lập.
Ingo

1
Cảm ơn vì @hqt này, tôi vừa chuyển mã này sang C # cần thiết cho 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

Không cần mã

Các câu trả lời khác liệt kê nhiều cách xác định theo chương trình cho dù thiết bị là điện thoại hay máy tính bảng. Tuy nhiên, nếu bạn đọc tài liệu , đó không phải là cách được khuyến nghị để hỗ trợ các kích cỡ màn hình khác nhau.

Thay vào đó, khai báo các tài nguyên khác nhau cho máy tính bảng hoặc điện thoại. Bạn làm điều này thêm tôi thư mục tài nguyên bổ sung cho layout, valuesvv

  • Đối với Android 3.2 (API cấp 13), hãy thêm sw600dpthư mục. Điều này có nghĩa là s mallest w idth ít nhất là 600dp, xấp xỉ khoảng cách giữa điện thoại / máy tính bảng. Tuy nhiên, bạn cũng có thể thêm các kích thước khác. Kiểm tra câu trả lời này để biết ví dụ về cách thêm tệp tài nguyên bố cục bổ sung.

  • Nếu bạn cũng đang hỗ trợ các thiết bị Android 3.2 trước, thì bạn sẽ cần thêm largehoặc xlargethư mục để hỗ trợ máy tính bảng. (Điện thoại nói chung smallnormal.)

Dưới đây là hình ảnh về những gì tài nguyên của bạn có thể thích sau khi thêm tệp xml bổ sung cho các kích thước màn hình khác nhau.

nhập mô tả hình ảnh ở đây

Khi sử dụng phương pháp này, hệ thống sẽ xác định mọi thứ cho bạn. Bạn không phải lo lắng về việc thiết bị nào đang được sử dụng trong thời gian chạy. Bạn chỉ cần cung cấp các tài nguyên phù hợp và để Android thực hiện tất cả công việc.

Ghi chú

  • Bạn có thể sử dụng các bí danh để tránh trùng lặp các tệp tài nguyên giống hệt nhau.

Tài liệu Android đáng đọc


2

Nếu bạn chỉ nhắm mục tiêu cấp API> = 13 thì hãy thử

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

chúc mừng :-)


1

Suy nghĩ về các thư mục được nhận "mới" (ví dụ giá trị-sw600dp) tôi đã tạo phương pháp này dựa trên chiều rộng DP của màn hình:

 public static final int TABLET_MIN_DP_WEIGHT = 450;
 protected static boolean isSmartphoneOrTablet(Activity act){
    DisplayMetrics metrics = new DisplayMetrics();
    act.getWindowManager().getDefaultDisplay().getMetrics(metrics);

    int dpi = 0;
    if (metrics.widthPixels < metrics.heightPixels){
        dpi = (int) (metrics.widthPixels / metrics.density);
    }
    else{
        dpi = (int) (metrics.heightPixels / metrics.density);
    }

    if (dpi < TABLET_MIN_DP_WEIGHT)         return true;
    else                                    return false;
}

Và trong danh sách này, bạn có thể tìm thấy một số DP của các thiết bị và kích thước máy tính bảng phổ biến:

Wdp / Hdp

GALAXY Nexus:
360/567 XOOM: 1280/752
GALAXY LƯU Ý: 400/615
NEXUS 7: 961/528
GALAXY TAB (> 7 && <10): 1280/752
GALAXY S3: 360/615

Wdp = Chiều rộng dp
Hdp = Chiều cao dp


1

Chà, giải pháp tốt nhất phù hợp với tôi khá đơn giản:

private boolean isTabletDevice(Resources resources) {   
    int screenLayout = resources.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
    boolean isScreenLarge = (screenLayout == Configuration.SCREENLAYOUT_SIZE_LARGE);
    boolean isScreenXlarge = (screenLayout == Configuration.SCREENLAYOUT_SIZE_XLARGE);
    return (isScreenLarge || isScreenXlarge);
}

Được sử dụng như thế này:

public void onCreate(Bundle savedInstanceState) {
    [...]
    if (this.isTabletDevice(this.getResources()) == true) {
        [...]
    }
}

Tôi thực sự không muốn nhìn vào kích thước pixel mà chỉ dựa vào kích thước màn hình.

Hoạt động tốt như Nexus 7 (LARGE) được phát hiện dưới dạng máy tính bảng, nhưng không phải Galaxy S3 (BÌNH THƯỜNG).


1

Sử dụng phương pháp này trả về giá trị true khi thiết bị là máy tính bảng

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

Giải pháp này chẳng hạn như không hoạt động trên Trình giả lập với API 18 và Nexus 7 1200 x 1920 xhdpi!
Ingo

Điều này không còn hoạt động trên một số thiết bị. Chẳng hạn, nó trả về false cho thiết bị Samsung Mega
bkurzius

Vâng .. Điều này không còn hoạt động nữa ... Tôi thực sự đã sử dụng để thêm boolean trong tất cả các tệp chuỗi cho từng giá trị thư mục, value_large, v.v <bool name = "isTablet"> false </ bool> <bool name = "isLargeTablet"> false </ bool> và sau đó kiểm tra xem R.bool.isTablet có đúng không để tìm xem thiết bị có phải là máy tính bảng không
Vyshnavi

1

Nếu phát hiện kích thước màn hình không trả về giá trị chính xác trên các thiết bị mới hơn, hãy thử:

/*
 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;}
}

Đã thử nghiệm trên Android 4.2.2 (xin lỗi vì tiếng Anh của tôi.)


0

Tôi biết đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng những câu trả lời khác ở đây cho bạn ý tưởng tốt về cách xác định kích thước màn hình. Bạn đã viết trong câu hỏi của bạn rằng bạn có vấn đề với độ nghiêng và điều này cũng xảy ra với tôi.

Nếu bạn chạy con quay hồi chuyển (hoặc cảm biến xoay) trên điện thoại thông minh, trục x và y có thể được xác định khác so với trên máy tính bảng, theo hướng mặc định của thiết bị đó (ví dụ: Samsung GS2 là chân dung mặc định, Samsung GT-7310 là phong cảnh mặc định, Google Nexus 7 mới là chân dung mặc định, mặc dù nó là máy tính bảng!).

Bây giờ nếu bạn muốn sử dụng Con quay hồi chuyển, bạn có thể kết thúc với một giải pháp hoạt động cho điện thoại thông minh, nhưng nhầm lẫn trục trên một số máy tính bảng hoặc ngược lại.

Nếu bạn sử dụng một trong các giải pháp từ phía trên để chỉ sử dụng kích thước màn hình và sau đó áp dụng

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

để lật trục nếu nó có kích thước màn hình lớn hoặc xlộng, điều này có thể hoạt động trong 90% các trường hợp, nhưng ví dụ trên Nexus 7, nó sẽ gây ra sự cố (vì nó có hướng dọc mặc định và kích thước màn hình lớn).

Cách đơn giản nhất để khắc phục điều này được cung cấp trong RotationVectorSample đi kèm với các bản trình diễn API bằng cách đặt sceenOrientation thành nosensortrong bảng kê khai của bạn:

<activity
    ...
    android:screenOrientation="nosensor">
...
</activity>

0

com.sec.feature.multiwindow.tablet trong trình quản lý gói chỉ dành riêng cho máy tính bảng và com.sec.feature.multiwindow.phone dành riêng cho điện thoại.


0

Phương pháp bên dưới là tính chiều dài đường chéo của màn hình thiết bị để quyết định thiết bị là điện thoại hoặc máy tính bảng. mối quan tâm duy nhất cho phương pháp này là giá trị ngưỡng nào để quyết định thời tiết thiết bị có phải là máy tính bảng hay không. trong ví dụ dưới đây tôi đặt nó là 7 inch trở lên.

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

Ngày càng khó khăn hơn để vẽ ranh giới giữa điện thoại và máy tính bảng. Chẳng hạn (kể từ tháng 8 năm 2015), thiết bị Samsung Mega 6.3 lấy tài nguyên từ các thư mục sw600dp - theo như Android có liên quan thì đó là một chiếc máy tính bảng.

Câu trả lời từ @Vyshnavi hoạt động trong tất cả các thiết bị chúng tôi đã thử nghiệm nhưng không dành cho Mega 6.3.

Câu trả lời @Helton Isac ở trên trả về Mega 6.3 dưới dạng điện thoại - nhưng vì thiết bị vẫn lấy tài nguyên từ sw600dp nên nó có thể gây ra các sự cố khác - ví dụ: nếu bạn sử dụng trình xem cho điện thoại chứ không phải cho máy tính bảng, bạn sẽ gặp phải lỗi NPE .

Cuối cùng, dường như có quá nhiều điều kiện để kiểm tra và chúng ta có thể phải chấp nhận rằng một số điện thoại thực sự là máy tính bảng :-P


0

Đây là phương pháp mà tôi sử dụng:

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

Sử dụng:

Cấu hình. SCREENLAYOUT_SIZE_MASK

Cấu hình. SCREENLAYOUT_SIZE_LARGE

Đây là phương pháp được khuyến khích!


Giải thích cho -1? , đây là một phương pháp được google giới thiệu.
Jorgesys

0

Tại sao lại dùng cái này?

Use this method which returns true when the device is a tablet

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

tôi thấy nhiều cách ở trên. Lớp cấu hình đã có câu trả lời đúng ngay bên dưới:

    /**
 * 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.
 */
public boolean isLayoutSizeAtLeast(int size) {
    int cur = screenLayout&SCREENLAYOUT_SIZE_MASK;
    if (cur == SCREENLAYOUT_SIZE_UNDEFINED) return false;
    return cur >= size;
}

chỉ cần gọi:

 getResources().getConfiguration().
 isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);

được rồi?


0

Tôi chỉ cần phát hiện điện thoại thông minh / máy tính bảng trong tệp bố cục vì tôi đang sử dụng mã điều hướng.

Điều tôi đã làm trước tiên là tạo thư mục layout-sw600dp nhưng nó không hoạt động tốt vì nó sẽ kích hoạt trên Nokia 8 của tôi ở chế độ ngang, nhưng chiều cao màn hình sẽ quá nhỏ.

Vì vậy, tôi đã đổi tên thư mục là layout-sw600dp-h400dp và sau đó tôi nhận được hiệu ứng mong muốn. Tham số h-xxxdp nên phụ thuộc vào số lượng nội dung bạn muốn thả trên bố cục của bạn và do đó nên phụ thuộc vào ứng dụng.


-1

Vui lòng kiểm tra mã dưới đây.

private boolean isTabletDevice() {
  if (android.os.Build.VERSION.SDK_INT >= 11) { // honeycomb
    // test screen size, use reflection because isLayoutSizeAtLeast is
    // only available since 11
    Configuration con = getResources().getConfiguration();
    try {
      Method mIsLayoutSizeAtLeast = con.getClass().getMethod(
      "isLayoutSizeAtLeast", int.class);
      boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con,
      0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE
      return r;
    } catch (Exception x) {
      x.printStackTrace();
      return false;
    }
  }
  return false;
}

1
Không còn hiệu lực với ICS. Thật vậy, có những máy tính bảng có phiên bản Android dưới 11
mdelolmo

1
Điều này KHÔNG đáng tin cậy. Các điện thoại ICS mới có cấp API> 11.
Jason Robinson

-1

Tôi nghĩ rằng một máy tính bảng có chiều rộng và chiều cao tối thiểu 600 px,
vì vậy cần biết mật độ màn hình và chiều cao / chiều rộng tính bằng dp,
để lấy giá trị:

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;


Điều này không đúng vì Samsung galaxy s3 đã hủy bỏ 720 x 1280.
Nikhil

-1

Ví dụ: có một sự khác biệt quan trọng (ít nhất là đối với chương trình của tôi) giữa điện thoại và máy tính bảng. Đây là định hướng mặc định của thiết bị. Điện thoại có hướng dọc, máy tính bảng - phong cảnh. Và phương pháp tương ứng để xác định thiết bị:

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: Sau các cuộc thảo luận với Dan Hulme đã thay đổi tên của phương pháp.


1
Không phải tất cả các máy tính bảng đều có hướng cảnh quan mặc định. Và nếu định hướng "mặc định" quan trọng với chương trình của bạn, thì có lẽ nó sai theo những cách khác. Xem bài đăng trên Blog của Nhà phát triển Android này để biết ví dụ.
Dan Hulme

Xin vui lòng, bạn có thể đưa ra ví dụ cụ thể của máy tính bảng, trong định hướng mặc định chiều rộng nhỏ hơn chiều cao không? Và tất nhiên bạn biết rõ hơn ứng dụng của tôi là gì: D.
Bạc

Nexus 7 sẽ là một ví dụ. Nhưng bạn không cần phải tin lời tôi: đọc bài viết tôi liên kết, nó giải thích tất cả.
Dan Hulme

Tôi nghĩ nên thay đổi tên phương pháp của tôi. Trong thực tế, quan trọng hơn (ít nhất là đối với ứng dụng của tôi;)) định hướng thiết bị mặc định và phương pháp của tôi là phù hợp cho nhiệm vụ này. Cũng xác định rất chính xác vấn đề @Nanne trả lời, xem ở trên.
Bạc


-1

Đối với tôi, sự khác biệt giữa điện thoại và máy tính bảng không phải là kích thước của thiết bị và / hoặc mật độ pixel, mà sẽ thay đổi theo công nghệ và hương vị, mà là tỷ lệ màn hình. Nếu tôi đang hiển thị màn hình văn bản, tôi cần biết nếu cần, 15 dòng dài là cần thiết (điện thoại) so với 20 dòng ngắn hơn (máy tính bảng). Đối với trò chơi của tôi, tôi sử dụng cách sau đây để ước tính sân bóng của hình chữ nhật mà phần mềm của tôi sẽ xử lý:

    Rect surfaceRect = getHolder().getSurfaceFrame();
    screenWidth = surfaceRect.width();
    screenHeight = surfaceRect.height();
    screenWidthF = (float) screenWidth;
    screenHeightF = (float) screenHeight;
    widthheightratio = screenWidthF/screenHeightF;
    if(widthheightratio>=1.5) {
        isTablet=false;
    }else {
        isTablet=true;
    }

-3

Tôi nghĩ rằng đây là cách dễ nhất để thành thật. Điều này sẽ kiểm tra kích thước màn hình đang được sử dụng:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

May mắn nhất!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.