แท็บเล็ตหรือโทรศัพท์ - Android


140

มีวิธีการตรวจสอบว่าผู้ใช้กำลังใช้แท็บเล็ตหรือโทรศัพท์หรือไม่? ฉันมีปัญหากับฟังก์ชั่นการเอียงและแท็บเล็ตใหม่ของฉัน (Transformer)


26
คุณกำลังถามคำถามผิด ไม่สำคัญว่าอุปกรณ์ดังกล่าวจะเป็นโทรศัพท์แท็บเล็ตโทรทัศน์เครื่องปิ้งขนมปังถ้วยน้ำชาหรือเครื่องวัดอุณหภูมิ สิ่งสำคัญคือความสามารถไม่ใช่ระดับที่กำหนดโดยทางการตลาดของอุปกรณ์ โปรดถามคำถาม Android ใหม่เกี่ยวกับความสามารถที่คุณค้นหาและวิธีการตรวจสอบว่าอุปกรณ์นั้นมีความสามารถดังกล่าวหรือวิธีการกรองตัวเองออกจาก Market สำหรับอุปกรณ์ที่ไม่มีความสามารถดังกล่าว
CommonsWare

7
@CommonsWare: บางครั้งคุณต้องการเพิ่มคุณสมบัติพิเศษสำหรับอุปกรณ์ที่มีหน้าจอขนาดใหญ่
Bobs

10
@breceivemail: ซึ่งหมายความว่าคุณต้องตรวจสอบว่าอุปกรณ์มีหน้าจอขนาดใหญ่ขึ้นหรือไม่ "หน้าจอขนาดใหญ่"! = "แท็บเล็ต"
CommonsWare

2
คำตอบที่ดีกว่าสามารถพบได้ที่นี่: stackoverflow.com/a/9308284/1750829 ง่ายเหมือนที่ :-)
หรือ Kazaz

3
ฉันต้องการลงคะแนนให้ทั้งหน้า! โทรศัพท์ทำโทรศัพท์แท็บเล็ตไม่ได้ คำแนะนำทั้งหมดนั้นค่อนข้างแฮ็กสกปรกที่ไม่มีใครควรใช้ โลกจะเป็นสถานที่ที่ดีกว่านี้หากไม่มีใครเคยเห็นหน้านี้อีกเลย!
Mark Gjøl

คำตอบ:


122

ตามที่ได้รับการกล่าวถึงก่อนหน้านี้คุณไม่ต้องการตรวจสอบว่าอุปกรณ์เป็นแท็บเล็ตหรือโทรศัพท์ แต่คุณต้องการทราบเกี่ยวกับคุณสมบัติของอุปกรณ์

ส่วนใหญ่แล้วความแตกต่างระหว่างแท็บเล็ตกับโทรศัพท์คือขนาดหน้าจอซึ่งเป็นสาเหตุที่คุณต้องการใช้ไฟล์เลย์เอาต์ที่แตกต่างกัน ไฟล์เหล่านี้ถูกเก็บไว้ในres/layout-<qualifiers>ไดเรกทอรี คุณสามารถสร้างไฟล์ XML ใน directoy res/values-<same qualifiers>สำหรับแต่ละเลย์เอาต์ของคุณและวาง int / bool / string ทรัพยากรลงในไฟล์เพื่อแยกแยะระหว่างเลย์เอาต์ที่คุณใช้

ตัวอย่าง:

ไฟล์res/values/screen.xml(สมมติว่าres/layout/มีไฟล์เลย์เอาต์ของคุณสำหรับมือถือ)

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


ไฟล์res/values-sw600dp/screen.xml(สมมติว่าres/layout-sw600dp/มีไฟล์เลย์เอาต์ของคุณสำหรับแท็บเล็ตขนาดเล็กเช่น Nexus 7)

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


ไฟล์res/values-sw720dp/screen.xml(สมมติว่าres/layout-sw720dp/มีไฟล์เลย์เอาต์ของคุณสำหรับแท็บเล็ตขนาดใหญ่เช่น Nexus 10):

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


ขณะนี้ประเภทหน้าจอสามารถเข้าถึงได้ผ่านR.string.screen_typeค่าคงที่


4
+1 คำตอบที่ยอดเยี่ยมเพราะให้ข้อมูลเชิงลึกมากขึ้นว่าทำไมคุณต้องการตรวจสอบแท็บเล็ต / โทรศัพท์ เรากำลังจะถึงช่วงเวลาที่โทรศัพท์จะกลายเป็นแท็บเล็ตขนาดเล็กต่อไป;)
andr

วิธีนี้ใช้กับโทรศัพท์ขนาดใหญ่เช่น Galaxy Note และ Nexus 6 ใหม่ได้อย่างไร ด้วยการใช้เทคนิคนี้อุปกรณ์ขนาดใหญ่เหล่านี้จะถูกตรวจจับเป็นโทรศัพท์หรือแท็บเล็ตหรือไม่
PerracoLabs

1
โชคไม่ดีที่ apporach นี้ใช้ไม่ได้กับอุปกรณ์ Samsung Mega 6.3 และส่งคืนเป็นแท็บเล็ต (sw600dp) - มีความคิดอื่นใดอีกหรือไม่ที่จะจับภาพนี้
bkurzius

แท็บเล็ตโทรออกอย่างไร
Mike

61

ในการตรวจสอบว่าอุปกรณ์เป็นแท็บเล็ตหรือไม่ให้ใช้รหัสต่อไปนี้:

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

LARGE และ XLARGE ขนาดหน้าจอถูกกำหนดโดยผู้ผลิตโดยอิงจากระยะห่างจากดวงตาที่พวกเขาจะใช้ที่ (ดังนั้นความคิดของแท็บเล็ต)

ข้อมูลเพิ่มเติม: http://groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f


ทั้ง - Kindle Fire และ Motorola Droid Bionic - SCREENLAYOUT_SIZE_MASK == 15. ดังนั้นทำไมโซลูชันของคุณถึงใช้งานได้?
IgorGanapolsky

ฉันเชื่อว่าผลลัพธ์นี้เป็นจริงใน Kindle Fire วันนี้ฉันไม่มีไบโอนิคกับฉัน แต่ฉันจะเช็คอินไม่กี่วันเมื่อเพื่อนของฉันกลับเข้ามาในเมือง อย่างไรก็ตาม ..... ฉันได้ทำการทดสอบคำตอบของ Helton Isac และมันทำงานได้อย่างสวยงาม โปรดตรวจสอบด้วย
petey

4
นอกจากนี้เพื่อให้คุณไม่ได้มีการใช้อย่างต่อเนื่องและคุณสามารถใช้Configuration.SCREENLAYOUT_SIZE_XLARGE >= LARGE
Triang3l

2
Galaxy Note ดูเหมือนว่าจะรายงาน SCREENLAYOUT_SIZE_LARGE ดังนั้นมันจึงถูกจัดประเภทเป็นแท็บเล็ตอย่างผิดพลาด
miguelSantirso

1
หากแบบอักษรของอุปกรณ์มีขนาดเล็กและขนาดการแสดงผลมีขนาดเล็กในการตั้งค่ากรณีนี้จะถูกส่งคืนเป็นจริง
arul

38

โพสต์นี้ช่วยฉันได้มาก

น่าเสียดายที่ฉันไม่มีชื่อเสียงที่จำเป็นในการประเมินคำตอบทั้งหมดที่ช่วยฉัน

ฉันต้องระบุว่าอุปกรณ์ของฉันเป็นแท็บเล็ตหรือโทรศัพท์โดยที่ฉันจะสามารถใช้ตรรกะของหน้าจอได้ และในการวิเคราะห์ของฉันแท็บเล็ตจะต้องมากกว่า 7 นิ้ว (Xlarge) เริ่มต้นที่ MDPI

นี่คือรหัสด้านล่างซึ่งสร้างขึ้นตามโพสต์นี้

/**
 * 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
ทางออกที่ดีที่สุดที่ฉันพบขอขอบคุณ Helton Isac! บางทีคุณสามารถเพิ่ม (เพื่อทางออกที่ดีกว่า) ตรวจสอบนิ้วของหน้าจอได้หรือไม่? อย่างไรก็ตาม, 10 สำหรับการแก้ปัญหานี้
Aracem

7
ฉันไม่เห็นด้วยจริงๆ นี่เป็นวิธีการค้นหาขนาดหน้าจอที่แน่นอน อีกครั้งที่ฉันตอบไม่มีความแตกต่างระหว่างแท็บเล็ตกับโทรศัพท์ นี่ไม่ใช่คำตอบสำหรับคำถาม ไม่สามารถแยกความแตกต่างได้เนื่องจากไม่มีความแตกต่าง 1 หากคุณต้องการรหัสสำหรับคุณสมบัติบางอย่าง (เช่นคุณดูเหมือนว่าจะทำเพื่อขนาดหน้าจอบางอย่าง) แล้วทำเช่นนั้น แต่อย่าเรียกว่าแท็บเล็ตกับโทรศัพท์ ผู้เริ่มต้นหัวข้อดูเหมือนจะใส่บรรทัด @ ฟังก์ชั่นการเอียงบางอย่าง อ่านความคิดเห็นของ @commonware เกี่ยวกับคำถามที่พบบ่อย
Nanne

1
ฉันเห็นด้วยกับ Nanne แต่อย่างที่บอกในแอปพลิเคชันของฉันฉันต้องแสดงสองแผงหากหน้าจอมีขนาดใหญ่พอที่จะทำ และฉันไม่สามารถใช้เลย์เอาต์ในกรณีนี้ได้เพราะตรรกะหน้าจออยู่ในฝั่ง Java
Helton Isac

3
Helton ขอบคุณสำหรับสิ่งนี้ คิดว่าฉันจะบอกว่าผลตอบแทนนี้: Kindle Fire: false, Moto Xoom (v1): จริง, Galaxy หมายเหตุ: false, Galaxy Tab 10.1 จำกัด : true
petey

นอกเหนือจากอาร์กิวเมนต์แล้ว Configuration.SCREENLAYOUT_SIZE_XLARGE = 4 ตามdeveloper.android.com/reference/android/content/res/…ซึ่งสามารถใช้แทนระดับ API ที่น้อยกว่า 9
trgraglia

12

ทำไมไม่คำนวณขนาดของเส้นทแยงมุมหน้าจอและใช้ในการตัดสินใจว่าอุปกรณ์นั้นเป็นโทรศัพท์หรือแท็บเล็ต

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

แน่นอนหนึ่งสามารถยืนยันว่าเกณฑ์ควรจะ 9 นิ้วหรือน้อยกว่า


นี้ไม่ได้ทำงาน ... เพียงแค่โทรศัพท์บางรายงานค่าความหนาแน่นที่ไม่ถูกต้องและการคำนวณในนิ้วล้มเหลว - เห็นมี: stackoverflow.com/questions/2193457/...
สเตน

ฉันชอบแท็บเล็ตขนาด 7 นิ้ว (ขนาดพกพา) และคำตอบนี้ดีที่สุดที่ฉันคิด แต่กลับ (screenDiagonal> = 9.0); ควรกลับมา (screenDiagonal> = 6.5) อย่างไรก็ตามขึ้นอยู่กับการใช้งานตามที่ได้แสดงความคิดเห็นไว้ในความคิดเห็นต่อคำถาม
Jan Bergström

11

ไม่มีความแตกต่าง คุณควรกำหนดสิ่งที่คุณคิดว่าแตกต่างและตรวจสอบสิ่งนั้น กาแล็กซี่แท็บโทรศัพท์หรือไม่ หรือแท็บเล็ต และทำไม?

คุณควรกำหนดคุณสมบัติเฉพาะที่คุณต้องการและรหัสสำหรับสิ่งนั้น

ดูเหมือนว่าคุณกำลังมองหา 'เอียง' ฉันคิดว่านี่เหมือนกับ accelerometer (นั่นคือคำ?) คุณสามารถตรวจสอบว่าอุปกรณ์รองรับหรือไม่โดยใช้:

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

(จากhttp://stuffthathappens.com/blog/2009/03/15/android-accelerometer/ . ฉันยังไม่ได้ทดสอบ)


ฉันมีปัญหากับฟังก์ชั่นการเอียงของฉันและแท็บเล็ตใหม่ของฉัน (Transformer)
เบนนี่

ชนิดของคำตอบที่โง่ ๆ แน่นอนว่ามีความแตกต่าง Galaxy = โทรศัพท์ ทำไม? เพราะมันเป็น "สมาร์ทโฟน" ตามที่ผู้ผลิตได้กำหนดไว้ หากคุณกำลังบอกใบ้ว่าเขาต้องการตรวจสอบขนาดหรือความสามารถในการโทรหรือ ... อะไร - แค่พูดอย่างนั้น
เดฟ

3
ฉันไม่เห็นด้วยอาจไม่เหมาะกับโทรศัพท์มือถือทุกรุ่นในขณะที่แท็บเล็ตบางรุ่นมีเซ็นเซอร์เหล่านี้ นั่นเป็นเหตุผลที่คำตอบแรกของฉันเกี่ยวกับไม่แตกต่าง อย่างไรก็ตามฉันได้เพิ่มรหัสที่คุณควรลองแล้ว
Nanne

2
ปัญหาคือเนื่องจากแท็บเล็ต "สร้าง" ในโหมดแนวนอนแกน x และ y ของ accelerometer จะพลิกเมื่อคุณคาดว่าแอปของคุณจะทำงานในโหมดแนวตั้ง สิ่งนี้อาจเลอะสิ่งต่าง ๆ ได้ไม่น้อย :) ดังนั้นจึงเป็นเรื่องสำคัญที่คุณจะต้องตรวจสอบสภาพอากาศที่คุณใช้บนแท็บเล็ตหรือไม่
pumpkee

1
แต่มันก็เป็นอีกวิธี => ถ้านั่นเป็นสิ่งเดียวที่ทำให้อุปกรณ์แท็บเล็ตคุณควรค้นหาว่าแกน x / y ทำงานอย่างไรไม่ใช่วิธีอื่น ๆ ฉันสงสัยด้วยวิธีนี้เป็นจริงสำหรับแท็บเล็ตและ / หรือโทรศัพท์ทั้งหมดหรือไม่
Nanne

10

สมมติฐานของฉันคือเมื่อคุณกำหนด 'มือถือ / โทรศัพท์' คุณต้องการที่จะรู้ว่าคุณสามารถโทรออกบนอุปกรณ์ที่ไม่สามารถทำสิ่งที่จะกำหนดเป็นแท็บเล็ต วิธีการตรวจสอบนี้อยู่ด้านล่าง หากคุณต้องการรู้อะไรบางอย่างจากเซ็นเซอร์ขนาดหน้าจอ ฯลฯ นี่เป็นคำถามที่แตกต่าง

นอกจากนี้ในขณะที่ใช้ความละเอียดหน้าจอหรือการจัดการทรัพยากรขนาดใหญ่เทียบกับ xlarge อาจเป็นวิธีการที่ถูกต้องในอุปกรณ์ 'มือถือ' ที่ผ่านมาใหม่กำลังมาพร้อมกับหน้าจอขนาดใหญ่และความละเอียดสูงที่พวกเขาเบลอบรรทัดนี้ หากต้องการทราบว่าการโทรศัพท์ไม่มีความสามารถในการโทรด้านล่างคือ 'ดีที่สุด'

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

9
แท็บเล็ตบางรุ่นสามารถโทรศัพท์และมีประเภท GSM หรือ CDMA ... ดังนั้นโซลูชันของคุณก็ไม่สมบูรณ์แบบเช่นกัน
arnouf

6

จาก Robert Dale Johnson III และ Helton Isac ฉันใช้รหัสนี้หวังว่านี่จะเป็นประโยชน์

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

ดังนั้นในรหัสของคุณทำให้ตัวกรองเหมือน

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


3

สำหรับผู้ที่ต้องการอ้างถึงรหัสของ Google ในการตัดสินใจว่าอุปกรณ์ใดจะใช้ Tablet UI สามารถดูได้จากด้านล่าง:

  // 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
ค่าของshortSizeคืออะไร?
kc ochibili

3

วิธีนี้เป็นวิธีที่ Google แนะนำ ฉันเห็นรหัสนี้ในแอปอย่างเป็นทางการของ Google Androidiosched

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

โซลูชันนี้ไม่ทำงานบน Emulator ด้วย API 18 และ Nexus 7 1200 x 1920 xhdpi!
Ingo

1
คุณควรทดสอบบนอุปกรณ์จริง :)
hqt

ฉันทดสอบกับ Emulator แล้วและผลลัพธ์ของ "isTablet (บริบทบริบท) เป็นเท็จลองใช้ตัวเองกับ Emulator
Ingo

1
ขอบคุณสำหรับ @hqt นี้ฉันเพิ่งแปลงรหัสนี้เป็น C # ที่จำเป็นสำหรับ 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

ไม่จำเป็นต้องใช้รหัส

คำตอบอื่น ๆ แสดงรายการหลายวิธีในการกำหนดทางโปรแกรมว่าอุปกรณ์นั้นเป็นโทรศัพท์หรือแท็บเล็ต อย่างไรก็ตามหากคุณอ่านเอกสารนั่นไม่ใช่วิธีที่แนะนำในการรองรับขนาดหน้าจอที่หลากหลาย

ให้ประกาศทรัพยากรอื่น ๆ สำหรับแท็บเล็ตหรือโทรศัพท์แทน คุณทำเช่นนี้เพิ่มโฟลเดอร์ทรัพยากรของฉันเพิ่มเติมสำหรับlayout, valuesฯลฯ

  • สำหรับ Android 3.2 (API ระดับ 13) เปิดให้เพิ่มsw600dpโฟลเดอร์ ซึ่งหมายความว่าs id ที่w mallest อย่างน้อย 600dp ซึ่งประมาณโทรศัพท์ / แท็บเล็ตแบ่ง อย่างไรก็ตามคุณสามารถเพิ่มขนาดอื่นได้เช่นกัน ลองดูคำตอบนี้เพื่อดูตัวอย่างวิธีเพิ่มไฟล์ทรัพยากรเลย์เอาต์เพิ่มเติม

  • หากคุณรองรับอุปกรณ์ Android 3.2 ล่วงหน้าคุณจะต้องเพิ่มlargeหรือxlargeโฟลเดอร์เพื่อรองรับแท็บเล็ต (โทรศัพท์ทั่วไปsmallและnormal.)

นี่คือภาพที่ทรัพยากรของคุณอาจชอบหลังจากเพิ่มไฟล์ xml พิเศษสำหรับขนาดหน้าจอที่แตกต่างกัน

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อใช้วิธีนี้ระบบจะกำหนดทุกอย่างให้คุณ คุณไม่ต้องกังวลกับการใช้อุปกรณ์ใดในขณะใช้งาน คุณเพียงแค่ให้ทรัพยากรที่เหมาะสมและให้ Android ทำทุกอย่างให้สำเร็จ

หมายเหตุ

  • คุณสามารถใช้นามแฝงเพื่อหลีกเลี่ยงการทำซ้ำไฟล์ทรัพยากรที่เหมือนกัน

เอกสาร Android มูลค่าการอ่าน


2

หากคุณกำหนดเป้าหมายเฉพาะระดับ API> = 13 ให้ลอง

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

ไชโย :-)


1

กำลังคิดเกี่ยวกับไดเรกทอรีที่ "ใหม่" (ตัวอย่างเช่น values-sw600dp) ฉันสร้างวิธีนี้โดยอิงจากความกว้างหน้าจอ DP:

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

และในรายการนี้คุณสามารถค้นหา DP ของอุปกรณ์และขนาดแท็บเล็ตยอดนิยมบางส่วน:

Wdp / Hdp

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

Wdp = ความกว้าง dp
Hdp = ความสูง dp


1

ทางออกที่ดีที่สุดที่ใช้งานได้สำหรับฉันนั้นง่ายมาก:

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

ใช้แบบนี้:

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

ฉันไม่ต้องการดูขนาดพิกเซล แต่พึ่งขนาดหน้าจอเท่านั้น

ทำงานได้ดีเช่นเดียวกับ Nexus 7 (LARGE) ที่ตรวจพบว่าเป็นแท็บเล็ต แต่ไม่ใช่ Galaxy S3 (ปกติ)


1

ใช้วิธีนี้ซึ่งจะคืนค่าจริงเมื่ออุปกรณ์เป็นแท็บเล็ต

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

โซลูชันนี้ไม่ทำงานบน Emulator ด้วย API 18 และ Nexus 7 1200 x 1920 xhdpi!
Ingo

สิ่งนี้ใช้ไม่ได้กับอุปกรณ์บางชนิด ตัวอย่างเช่นจะส่งคืนค่าเท็จสำหรับอุปกรณ์ Samsung Mega
bkurzius

ใช่ .. มันใช้ไม่ได้อีกต่อไป ... ฉันใช้เพื่อเพิ่มบูลีนในไฟล์สตริงทั้งหมดสำหรับแต่ละค่าของโฟลเดอร์ค่า values_large ฯลฯ <bool name = "isTablet"> false </bool> <bool name = "isLargeTablet"> false </bool> จากนั้นตรวจสอบว่า R.bool.isTablet นั้นเป็นจริงหรือไม่หากอุปกรณ์เป็นแท็บเล็ต
Vyshnavi

1

หากการตรวจจับขนาดหน้าจอไม่ส่งคืนค่าที่ถูกต้องสำหรับอุปกรณ์ใหม่ให้ลองทำดังนี้

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

ผ่านการทดสอบบน Android 4.2.2 (ขออภัยสำหรับภาษาอังกฤษของฉัน)


0

ฉันรู้ว่านี่ไม่ใช่คำตอบสำหรับคำถามของคุณโดยตรง แต่คำตอบอื่น ๆ ที่นี่ให้ความคิดที่ดีเกี่ยวกับวิธีระบุขนาดหน้าจอ คุณเขียนในคำถามของคุณว่าคุณมีปัญหากับการเอียงและสิ่งนี้ก็เกิดขึ้นกับฉันเช่นกัน

หากคุณเรียกใช้ไจโรสโคป (หรือเซ็นเซอร์หมุน) บนสมาร์ทโฟนคุณสามารถกำหนดแกน x และแกน y ได้แตกต่างจากบนแท็บเล็ตตามการวางแนวเริ่มต้นของอุปกรณ์นั้น (เช่น Samsung GS2 เป็นแนวตั้งมาตรฐาน Samsung GT-7310 คือ แนวนอนเริ่มต้น Google Nexus 7 ใหม่เป็นแนวตั้งแม้ว่าจะเป็นแท็บเล็ต!)

ตอนนี้ถ้าคุณต้องการใช้ Gyroscope คุณอาจต้องใช้วิธีแก้ปัญหาที่ใช้งานได้กับสมาร์ทโฟน แต่ความสับสนของแกนในแท็บเล็ตบางตัวหรือในทางกลับกัน

หากคุณใช้วิธีแก้ปัญหาข้อใดข้อหนึ่งจากด้านบนเพื่อใช้กับขนาดหน้าจอจากนั้นใช้เท่านั้น

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

เพื่อพลิกแกนถ้ามันมีขนาดใหญ่หรือขนาดหน้าจอที่ใหญ่ขนาดนี้อาจทำงานได้ใน 90% ของเคส แต่ตัวอย่างเช่นใน Nexus 7 มันจะทำให้เกิดปัญหา (เพราะมันมีการวางแนวแนวตั้งเริ่มต้นและหน้าจอขนาดใหญ่)

วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้มีให้ใน RotationVectorSample ที่มาพร้อมกับการสาธิต API โดยการตั้งค่า sceenOrientation nosensorในรายการของคุณ:

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

0

com.sec.feature.multiwindow.tablet ในตัวจัดการแพ็กเกจเฉพาะกับแท็บเล็ตและ com.sec.feature.multiwindow.phone เฉพาะสำหรับโทรศัพท์


0

วิธีการด้านล่างกำลังคำนวณความยาวแนวทแยงของหน้าจอของอุปกรณ์เพื่อตัดสินว่าอุปกรณ์นั้นเป็นโทรศัพท์หรือแท็บเล็ต ข้อกังวลเพียงอย่างเดียวสำหรับวิธีนี้คือสิ่งที่เป็นค่าเกณฑ์ในการตัดสินใจสภาพอากาศอุปกรณ์แท็บเล็ตหรือไม่ ในตัวอย่างด้านล่างฉันตั้งเป็น 7 นิ้วขึ้นไป

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

การวาดเส้นแบ่งระหว่างโทรศัพท์และแท็บเล็ตทำได้ยากขึ้น ตัวอย่างเช่น (ณ เดือนสิงหาคม 2015) อุปกรณ์Samsung Mega 6.3ดึงทรัพยากรจากโฟลเดอร์ sw600dp - ตราบใดที่ Android ยังเกี่ยวข้องกับแท็บเล็ต

คำตอบจาก@Vyshnavi สามารถใช้ได้กับอุปกรณ์ทั้งหมดที่เราทดสอบ แต่ไม่ได้ใช้กับ Mega 6.3

@Helton Isacคำตอบข้างต้นจะส่งคืน Mega 6.3 เป็นโทรศัพท์ - แต่เนื่องจากอุปกรณ์ยังคงคว้าทรัพยากรจาก sw600dp มันอาจทำให้เกิดปัญหาอื่น ๆ - ตัวอย่างเช่นถ้าคุณใช้ viewpager สำหรับโทรศัพท์และไม่ใช่แท็บเล็ตคุณจะปิดท้ายด้วยข้อผิดพลาด NPE .

ในที่สุดดูเหมือนว่ามีเงื่อนไขมากเกินไปที่จะตรวจสอบและเราอาจต้องยอมรับว่าโทรศัพท์บางรุ่นเป็นแท็บเล็ตจริง :-P


0

นี่คือวิธีการที่ฉันใช้:

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

โดยใช้:

องค์ประกอบ SCREENLAYOUT_SIZE_MASK

องค์ประกอบ SCREENLAYOUT_SIZE_LARGE

นี่เป็นวิธีที่แนะนำ!


คำอธิบายสำหรับ -1? นี่เป็นวิธีที่แนะนำโดย google
Jorgesys

0

ทำไมต้องใช้สิ่งนี้

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

ฉันเห็นหลายวิธีข้างต้นคลาสการกำหนดค่าได้รับคำตอบที่ถูกต้องด้านล่าง:

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

เพียงแค่โทร:

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

ไม่เป็นไร?


0

ฉันต้องการตรวจสอบสมาร์ทโฟน / แท็บเล็ตในไฟล์เลย์เอาต์เท่านั้นเพราะฉันใช้รหัสนำทาง

สิ่งที่ฉันทำครั้งแรกคือการสร้างไดเรกทอรี layout-sw600dp แต่มันใช้งานไม่ได้เพราะมันจะเปิดใช้งานบน Nokia 8 ของฉันในโหมดแนวนอน แต่ความสูงของหน้าจอจะเล็กเกินไป

ดังนั้นฉันเปลี่ยนชื่อไดเรกทอรีเป็น layout-sw600dp-h400dp จากนั้นฉันได้รับผลที่ต้องการ พารามิเตอร์ h-xxxdp ควรขึ้นอยู่กับจำนวนเนื้อหาที่คุณต้องการวางในเลย์เอาต์ของคุณและขึ้นอยู่กับแอปพลิเคชัน


-1

กรุณาตรวจสอบรหัสด้านล่าง

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
ไม่สามารถใช้งานกับ ICS ได้อีกต่อไป แท้จริงแล้วมีแท็บเล็ตที่มีรุ่น Android ต่ำกว่า 11
mdelolmo

1
สิ่งนี้ไม่น่าเชื่อถือ โทรศัพท์ ICS รุ่นใหม่มีระดับ API> 11
Jason Robinson

-1

ฉันคิดว่าแท็บเล็ตมีความกว้างและความสูงขั้นต่ำสูงสุด 600 px
ดังนั้นต้องทราบความหนาแน่นของหน้าจอและความสูง / ความกว้างในหน่วย dp
เพื่อดึงค่า:

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;


สิ่งนี้ไม่ถูกต้องเนื่องจาก Samsung galaxy s3 ผลลัพธ์ 720 x 1280
Nikhil

-1

เช่นมีความแตกต่างที่สำคัญอย่างหนึ่ง (อย่างน้อยสำหรับโปรแกรมของฉัน) ระหว่างโทรศัพท์และแท็บเล็ต มันคือการวางแนวเริ่มต้นของอุปกรณ์ โทรศัพท์มีการวางแนวแนวตั้งแท็บเล็ต - แนวนอน และวิธีการตามลำดับเพื่อตรวจสอบอุปกรณ์:

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

แก้ไข: หลังจากการหารือกับ Dan Hulme เปลี่ยนชื่อของวิธีการ


1
แท็บเล็ตบางรุ่นเท่านั้นที่มีการวางแนวนอนเป็นค่าเริ่มต้น และหากการวางแนว "ค่าเริ่มต้น" มีความสำคัญต่อโปรแกรมของคุณอาจเป็นไปได้ว่าวิธีอื่น เห็นนี้พัฒนา Android บล็อกโพสต์เช่น
Dan Hulme

ได้โปรดคุณช่วยยกตัวอย่างแท็บเล็ตที่เฉพาะเจาะจงซึ่งความกว้างน้อยกว่าความสูงได้หรือไม่? และแน่นอนคุณรู้ดีกว่าสิ่งที่ควรเป็นแอพของฉัน: D
เงิน

Nexus 7 จะเป็นตัวอย่างหนึ่ง แต่คุณไม่ต้องใช้คำพูดของฉัน: อ่านบทความที่ฉันเชื่อมโยงซึ่งอธิบายทุกอย่าง
Dan Hulme

ฉันคิดว่าควรเปลี่ยนชื่อวิธีการของฉัน ที่จริงแล้วที่สำคัญกว่านั้น (อย่างน้อยสำหรับแอพของฉัน;)) การวางแนวอุปกรณ์เริ่มต้นและวิธีการของฉันก็เพียงพอสำหรับงานนี้ ระบุปัญหาได้อย่างแม่นยำมาก @Nanne คำตอบโปรดดูด้านบน
ซิลเวอร์

-1

ฉันขอแนะนำหุ่นยนต์ไลบรารี 'คาเฟอีน' ที่มีโทรศัพท์หรือแท็บเล็ตและ 10 นิ้ว ~!

ใช้งานง่ายมาก

ห้องสมุดอยู่ที่นี่

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

และการใช้งาน

DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);

-1

สำหรับฉันความแตกต่างระหว่างโทรศัพท์และแท็บเล็ตไม่ได้เป็นขนาดของอุปกรณ์และ / หรือความหนาแน่นของพิกเซลซึ่งจะเปลี่ยนไปด้วยเทคโนโลยีและรสนิยม แต่ค่อนข้างอัตราส่วนหน้าจอ หากฉันกำลังแสดงหน้าจอข้อความฉันต้องรู้ว่าพูดว่าต้องใช้สายยาว 15 บรรทัด (โทรศัพท์) และ 20 บรรทัดที่สั้นกว่า (แท็บเล็ต) สำหรับเกมของฉันฉันใช้สิ่งต่อไปนี้เพื่อประเมินเบสบอลของซอฟต์แวร์ของฉันที่จะจัดการกับ:

    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

ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดที่จะซื่อสัตย์ นี่จะตรวจสอบขนาดหน้าจอที่ใช้:

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

ขอให้โชคดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.