Tablet veya Telefon - Android


140

Kullanıcının tablet mi yoksa telefon mu kullandığını kontrol etmenin bir yolu var mı? Eğim işlevim ve yeni tabletim (Transformer) ile ilgili sorun yaşıyorum


26
Yanlış soruyu soruyorsun. Cihazın bir telefon, tablet, televizyon, ekmek kızartma makinesi, çay fincanı veya termometre olması önemli değildir. Önemli olan, cihazın pazarlama tanımlı sınıfı değil, yeteneklerdir. Lütfen hangi yetenekleri aradığınızı ve cihazın bu tür özelliklere sahip olup olmadığını nasıl belirleyeceğinizi veya bu tür yeteneklere sahip olmayan cihazlar için kendinizi Market'ten nasıl filtreleyeceğinizi açıklayan yeni bir Android sorusu sorun.
CommonsWare

7
@CommonsWare: bazı durumlarda daha büyük ekrana sahip cihazlar için ekstra özellikler eklemek istersiniz.
Bobs

10
@breceivemail: Bu, cihazın daha büyük bir ekrana sahip olup olmadığını kontrol etmeniz gerektiği anlamına gelir. "Daha büyük ekran"! = "Tablet".
CommonsWare

2
Daha iyi bir yanıt burada bulunabilir: stackoverflow.com/a/9308284/1750829 Bu kadar basit :-)
Veya Kazaz

3
Bu sayfanın tamamını küçümsemek istiyorum! Telefon telefon yapar, tablet yapmaz. Hemen hemen tüm öneriler, kimsenin kullanmaması gereken kirli hack'lerdir. Kimse bu sayfayı bir daha görmezse dünya daha iyi bir yer olurdu!
Mark Gjøl

Yanıtlar:


122

Daha önce de belirtildiği gibi, cihazın bir tablet mi yoksa bir telefon mu olduğunu kontrol etmek istemiyorsunuz, ancak cihazın özelliklerini öğrenmek istiyorsunuz,

Çoğu zaman, bir tablet ve telefon arasındaki fark ekran boyutudur, bu nedenle farklı düzen dosyaları kullanmak istersiniz. Bu dosyalar res/layout-<qualifiers>dizinlerde saklanır . Her düzeniniz res/values-<same qualifiers>için dizinde bir XML dosyası oluşturabilir ve kullandığınız düzenleri ayırt etmek için bir int / bool / string kaynağı koyabilirsiniz.

Misal:

Dosya res/values/screen.xml( res/layout/el cihazları için düzen dosyalarınızı içerdiği varsayılarak )

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


Dosya res/values-sw600dp/screen.xml( res/layout-sw600dp/Nexus 7 gibi küçük tabletler için düzen dosyalarınızı içerdiği varsayılarak )

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


Dosya res/values-sw720dp/screen.xml( res/layout-sw720dp/Nexus 10 gibi büyük tabletler için düzen dosyalarınızı içerdiği varsayılarak ):

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


Artık ekran tipine R.string.screen_typesabit üzerinden erişilebilir .


4
+1, harika bir yanıt, çünkü aslında tablet / telefonu neden kontrol etmek istediğinize dair daha fazla bilgi sağlar . Telefonların yine de küçük tabletler olacağı bir an yaklaşıyoruz;)
andr

Bu Galaxy Note ve yeni Nexus 6 gibi büyük telefonlar için nasıl geçerlidir? Bu tekniği kullanarak, bu büyük cihazlar telefon veya tablet olarak algılanacak mı?
PerracoLabs

1
Ne yazık ki, bu cihaz Samsung Mega 6.3 cihazı için çalışmıyor ve bir tablet (sw600dp) olarak döndürüyor - bunu yakalamak için başka herhangi bir fikir?
bkurzius

tabletler telefon görüşmesi yapar mı?
Mike

61

Cihazın tablet olup olmadığını tespit etmek için aşağıdaki kodu kullanın:

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

BÜYÜK ve XLARGE Ekran Boyutları, kullanılacakları gözden olan mesafeye (dolayısıyla bir tablet fikri) göre üretici tarafından belirlenir.

Daha fazla bilgi: http://groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f


Hem Kindle Fire hem de Motorola Droid Bionic - SCREENLAYOUT_SIZE_MASK == 15. Peki çözümünüz neden işe yarar?
IgorGanapolsky

Bunun Kindle Fire için geçerli olduğuna inanıyorum. Bugün üzerimde biyonik yok ... ama birkaç gün sonra arkadaşım kasabaya geri döndüğünde kontrol edeceğim. Ancak ..... Helton Isac'ın cevabını test ediyorum ve güzel çalışıyor. Lütfen bunu da kontrol edin.
petey

4
Var Configuration.SCREENLAYOUT_SIZE_XLARGE, bu yüzden bir sabit kullanmak zorunda değilsiniz ve kullanabilirsiniz >= LARGE.
Triang3l

2
Galaxy Note, SCREENLAYOUT_SIZE_LARGE rapor ediyor gibi görünüyor, bu yüzden yanlış tablet olarak sınıflandırılacak
miguelSantirso

1
Cihaz yazı tipi küçükse ve ayarlarda ekran boyutu küçükse, bu durum true olarak döndürülür.
arul

38

Bu yazı bana çok yardımcı oldu,

Ne yazık ki bana yardımcı olan tüm cevapları değerlendirmek için gerekli itibara sahip değilim.

Cihazımın bir tablet mi yoksa bir telefon mu olduğunu belirlemem gerekiyordu, bununla birlikte ekran mantığını uygulayabiliyordum. Ve analizimde, tablet MDPI'den başlayarak 7 inçten (Xlarge) fazla olmalıdır.

İşte bu yazıyı temel alarak oluşturulan aşağıdaki kod.

/**
 * 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
Bulduğum en iyi çözüm, teşekkürler Helton Isac! Belki de (daha iyi bir çözüm için) ekranın inçlerini kontrol edebilir misiniz? neyse, bu çözüm için 10
Aracem

7
Ben gerçekten katılmıyorum. Bu, belirli bir ekran boyutunu bulmak için bir yöntemdir. Yine, cevapladığım gibi, bir tablet ve telefon arasında hiçbir fark yoktur. Bu sorunun cevabı değil. Farklılık mümkün değildir çünkü 1 fark yoktur. Belirli özellikleri (bazı ekran boyutları için yaptığınız gibi) kodlamanız gerekiyorsa, bunu yapın, ancak tablete telefon olarak adlandırmayın. Konu başlatıcısı satır @ belirli eğim işlevselliği koymak gibi görünüyordu. @Commonware'in soru hakkındaki yorumunu okuyun.
Nanne

1
Nanne ile hemfikirim, ama dediğim gibi, Uygulamamda ekran bunu yapmak için yeterince büyükse iki panel göstermem gerekiyor. Ve bu durumda mizanpajları kullanamıyorum, çünkü ekran mantığı Java tarafındaydı.
Helton Isac

3
Helton, bunun için teşekkürler. Bunun geri döndüğünü söyleyebilirim: Kindle Fire: yanlış, Moto Xoom (v1): doğru, Galaxy Not: yanlış, Galaxy Tab 10.1 sınırlı: doğru
petey


12

Neden ekranın boyutunu köşegen olarak hesaplamıyorsunuz ve bunu cihazın bir telefon veya tablet olup olmadığına karar vermek için kullanmıyorsunuz?

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

Tabii ki eşiğin 9 inç veya daha az olması gerektiği iddia edilebilir.


Bu çalışmıyor ... sadece bazı telefonlar yanlış yoğunluk değerlerini bildiriyor ve inç
cinsinden

7 tableti (cep boyutu) seviyorum ve bu cevap bence en iyisi. Ancak return (screenDiagonal> = 9.0); döndürülmelidir (screenDiagonal> = 6.5). Ancak soruya yapılan yorumlarda belirtildiği gibi kullanıma bağlıdır.
Jan Bergström

11

hiçbir fark yok. Farkı düşündüğünüzü tanımlamalı ve kontrol etmelisiniz. Bir galaksi sekmesi bir telefon mu? ya da bir tablet? ve neden?

Aradığınız belirli özellikleri ve kodunu tanımlamalısınız.

Görünüşe göre 'eğim' arıyorsunuz. Bu ivmeölçer ile aynı olduğunu düşünüyorum (bu bir kelime mi?). Sadece aşağıdakileri kullanarak cihazın destekleyip desteklemediğini kontrol edebilirsiniz:

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/ adresinden . test etmedim)


Eğim fonksiyonum ve yeni tabletim (Transformer) ile ilgili problemlerim var
Benny

Aptalca bir cevap imo - tabii ki bir fark var. Galaxy = telefon. Neden? Çünkü biri için üreticiye göre bir "akıllı telefon". Boyutunu, arama yeteneğini veya herhangi bir şeyi kontrol etmesi gerektiğini ima ediyorsanız - sadece söyleyin.
Dave

3
Kabul etmiyorum, bazı cep telefonlarında bu sensörler bulunurken, tüm cep telefonlarında çalışmayabilir. Bu yüzden hiçbir fark hakkında ilk cevabım. Her neyse, denemeniz gereken bazı kodlar ekledim.
Nanne

2
Sorun şu ki, tabletler yatay modda "inşa edildiğinden" uygulamanızın dikey modda çalışmasını beklediğinizde ivmeölçerin x ve y eksenleri çevrilir. Bu işleri biraz karıştırabilir :) Bu nedenle, bir tablet üzerinde çalıştırdığınız hava durumunu kontrol etmeniz hayati önem taşır.
pumpkee

1
Ama o zaman başka bir yoldur => bir cihazı tablet yapan tek şey buysa, x / y ekseninin nasıl çalıştığını öğrenmelisiniz, tersi değil. Bunun tüm tabletler ve / veya telefonlar için geçerli olduğundan şüpheliyim?
Nanne

10

Benim varsayımım, 'Mobil / Telefon' tanımladığınızda, cihazda 'Tablet' olarak tanımlanacak bir şey üzerinde yapılamayan bir telefon görüşmesi yapıp yapamayacağınızı bilmek istemenizdir. Bunu doğrulamanın yolu aşağıdadır. Sensörlere, ekran boyutuna vb. Dayalı bir şey bilmek istiyorsanız, bu gerçekten farklı bir soru.

Ayrıca, ekran çözünürlüğü veya xlarge'ye karşı büyük kaynak yönetimini kullanırken, geçmişte yeni bir 'Mobil' cihazlar şimdi çok büyük ekranlar ve yüksek çözünürlüklerle geliyor olabilir. telefon görüşmesi vs hiçbir telefon görüşmesi yeteneği bilmek aşağıda 'en iyi'.

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

9
Bazı tabletler telefon edebilir ve GSM veya CDMA tipine sahip olabilir ... Yani çözümünüz de mükemmel değil.
arnouf

6

Robert Dale Johnson III ve Helton Isac'a dayanarak bu kod ile geldim Umarım bu yararlıdır

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

Kodunuzda şöyle bir filtre yapın:

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

6

Google IOSched 2017 uygulama kaynak kodunda aşağıdaki yöntem kullanılır:

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

3

Google'ın hangi cihazların Tablet kullanıcı arayüzü kullanacağına karar verme koduna başvurmak isteyenler için aşağıdakilere başvurabilirsiniz:

  // 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
değeri shortSizenedir?
kc ochibili

3

Bu yöntem Google tarafından tavsiye edilir. Bu kodu Google Resmi Android Uygulaması'nda görüyorumiosched

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

Bu çözüm örneğin API 18 ve Nexus 7 1200 x 1920 xhdpi içeren bir Emulator üzerinde çalışmıyor!
Ingo

1
gerçek cihaz üzerinde test etmelisiniz :)
hqt

Emulator üzerinde test yaptım ve "isTablet (Bağlam bağlamı) sonucu yanlıştı. Emulator'da kendi kendine dene.
Ingo

1
Bu @hqt için teşekkürler, ben sadece Xamarin Studio için gerekli C # kodunu:public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
Phil Ryan

2

Kod gerekmez

Diğer cevaplar, cihazın bir telefon veya tablet olup olmadığını programlı olarak belirlemenin birçok yolunu listeler. Ancak, belgeleri okursanız çeşitli ekran boyutlarını desteklemeniz için önerilen yol bu değildir.

Bunun yerine, tabletler veya telefonlar için farklı kaynaklar bildirin. Sen bu benim ekleyerek ek kaynak klasörler yapmak layout, valuesvb

  • Android 3.2 (API seviye 13) için bir sw600dpklasör ekleyin . Bu araçlar s mallest ağırlık IDþ yaklaşık telefon / tablet bölme olan, en az 600dp olup. Ancak, başka boyutlar da ekleyebilirsiniz. Ek düzen kaynak dosyasının nasıl ekleneceğine ilişkin bir örnek için bu cevaba göz atın .

  • Ayrıca Android 3.2 öncesi cihazları da destekliyorsanız, tabletleri desteklemek için klasör largeveya xlargeklasör eklemeniz gerekir . (Telefonlar genellikle smallve normal.)

Farklı ekran boyutları için ekstra bir xml dosyası ekledikten sonra kaynaklarınızın neye benzeyebileceğini gösteren bir resim.

resim açıklamasını buraya girin

Bu yöntemi kullanırken, sistem sizin için her şeyi belirler. Hangi cihazın çalışma zamanında kullanıldığından endişelenmenize gerek yoktur. Sadece uygun kaynakları sağlar ve Android'in tüm işi yapmasına izin verirsiniz.

notlar

  • Aynı kaynak dosyalarını çoğaltmamak için takma adlar kullanabilirsiniz .

Okumaya değer Android belgeleri


2

Yalnızca API düzeyi> = 13'ü hedefliyorsanız,

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

şerefe :-)


1

"Yeni" kabul edilen dizinler üzerinde düşünme (örneğin değerleri-sw600dp) ekranın genişliği DP dayalı bu yöntemi oluşturdu:

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

Ve bu listede popüler cihazların ve tablet boyutlarının DP'sinden bazılarını bulabilirsiniz:

Wdp / Hdp

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

Wdp = Genişlik dp
Hdp = Yükseklik dp


1

Benim için işe yarayan en iyi çözüm oldukça basit:

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

Bunun gibi kullanılır:

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

Gerçekten piksel boyutlarına bakmak istemiyorum ama sadece ekran boyutuna güveniyorum.

Nexus 7 (BÜYÜK) bir tablet olarak algılanır, ancak Galaxy S3 (NORMAL) tarafından iyi algılanmaz.


1

Cihaz bir tablet olduğunda true değerini döndüren bu yöntemi kullanın

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

Bu çözüm örneğin API 18 ve Nexus 7 1200 x 1920 xhdpi içeren bir Emulator üzerinde çalışmıyor!
Ingo

Bu artık bazı cihazlarda çalışmaz. Örneğin, Samsung Mega cihazı için yanlış döndürür
bkurzius

Evet .. Bu artık işe yaramaz ... Aslında her klasör için tüm dize dosyasına boolean eklemek için kullanılır değerleri, değerleri_large vb. <Bool name = "isTablet"> false </bool> <bool name = "isLargeTablet"> false </bool> ve ardından cihazın tablet olup olmadığını öğrenmek için R.bool.isTablet'in doğru olup olmadığını kontrol edin
Vyshnavi

1

Ekran boyutu algılaması yeni cihazlarda doğru değeri döndürmezse, bir deneyin:

/*
 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'de test edildi (İngilizcem için üzgünüm.)


0

Bunun doğrudan sorunuza bir cevap olmadığını biliyorum, ancak buradaki diğer cevaplar ekran boyutunu nasıl tanımlayacağınız konusunda iyi bir fikir veriyor. Sorunuzda eğim ile ilgili sorunlarınız olduğunu yazdınız ve bu da bana da oldu.

Jiroskopu (veya dönüş sensörünü) bir akıllı telefonda çalıştırırsanız, x ve y ekseni bir tabletten farklı olarak tanımlanabilir, bu cihazın varsayılan yönüne göre (örn. Samsung GS2 varsayılan portre, Samsung GT-7310 varsayılan manzara, yeni Google Nexus 7, bir tablet olmasına rağmen varsayılan portre!).

Şimdi Gyroskop kullanmak istiyorsanız, akıllı telefonlar için çalışan bir çözümle sonuçlanabilir, ancak bazı tabletlerde eksen karışıklığı veya başka bir yolla karşılaşabilirsiniz.

Yukarıdaki ekranlardan birini yalnızca ekran boyutuna gitmek ve ardından uygulamak için kullanırsanız

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

büyük veya xlarge ekran boyutuna sahipse ekseni çevirmek bu durumların% 90'ında işe yarayabilir, ancak Nexus 7'de sorunlara neden olur (varsayılan dikey yönlendirmeye ve büyük ekran boyutuna sahip olduğundan).

Bunu düzeltmenin en basit yolu nosensor, manifesto'nuzda sceenOrientation öğesini ayarlayarak API demolarıyla birlikte gönderilen RotationVectorSample öğesinde sağlanır :

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

0

Paket yöneticisindeki com.sec.feature.multiwindow.tablet yalnızca tablete, com.sec.feature.multiwindow.phone ise telefona özeldir.


0

Aşağıdaki yöntem, cihazın bir telefon veya tablet olduğuna karar vermek için cihaz ekranının çapraz uzunluğunu hesaplamaktır. bu yöntemin tek endişesi, cihazın hava olup olmadığı konusunda karar vermek için eşik değerinin ne olduğudur. Aşağıdaki örnekte 7 inç ve üstü olarak ayarladım.

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

Telefon ve tablet arasındaki hattı çizmek gittikçe zorlaşıyor. Örneğin (Ağu 2015 itibariyle) Samsung Mega 6.3 cihazı, sw600dp klasörlerinden kaynakları çekiyor - Android söz konusu olduğunda bir tablet.

@Vyshnavi'den cevap test ettiğimiz ancak Mega 6.3 için olmayan tüm cihazlarda çalışıyor.

@Helton Isac yanıtı Mega 6.3'ü bir telefon olarak döndürür - ancak cihaz hala sw600dp'den kaynak aldığından başka sorunlara neden olabilir - örneğin, tabletler için değil, telefonlar için bir görüntüleyici kullanırsanız, NPE hatalarıyla dolanırsınız .

Sonunda kontrol etmek için çok fazla koşul var gibi görünüyor ve bazı telefonların aslında tablet olduğunu kabul etmemiz gerekebilir:


0

Ben kullandığım yöntem budur:

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

Kullanımı:

Yapılandırma. SCREENLAYOUT_SIZE_MASK

Yapılandırma. SCREENLAYOUT_SIZE_LARGE

Önerilen yöntem budur!


-1 için açıklama? , bu google tarafından önerilen bir yöntemdir.
Jorgesys

0

neden kullanıyorsun?

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

yukarıdaki birçok yol görüyorum.Yapılandırma sınıfı hemen aşağıda doğru cevabı aldı:

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

sadece ara :

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

tamam?


0

Gezinme kodunu kullandığım için akıllı telefonu / tableti yalnızca düzen dosyasında algılamam gerekiyordu.

İlk yaptığım, bir düzen-sw600dp dizini oluşturmaktı, ancak Nokia 8 cihazımda yatay modda etkinleştirileceği için ekranın çok küçük olacağı için iyi çalışmıyor.

Bu yüzden, dizini layout-sw600dp-h400dp olarak yeniden adlandırdım ve sonra istenen efekti aldım. H-xxxdp parametresi, mizanpajınıza ne kadar içerik bırakmak istediğinize bağlı olmalıdır ve bu nedenle uygulamaya bağlı olmalıdır.


-1

Lütfen aşağıdaki kodu kontrol edin.

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
Artık ICS ile geçerli değil. Gerçekten, Android sürümleri 11'in altında olan tabletler var
mdelolmo

1
Bu güvenilir DEĞİLDİR. Yeni ICS telefonlarının API seviyesi> 11'dir.
Jason Robinson

-1

Bir tabletin min ve max 600 piksel genişlik ve yüksekliğe sahip olduğunu düşünüyorum,
bu yüzden
değeri almak için ekran yoğunluğunu ve dp cinsinden yükseklik / genişliği bilmeniz gerekir :

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;


Bu doğru değil çünkü Samsung galaxy s3 sonucu 720 x 1280.
Nikhil

-1

Telefon ve tablet arasında önemli bir fark var (en azından programım için). Cihazın varsayılan yönüdür. Telefonun dikey bir yönü vardır, tablet - manzara. Ve sırasıyla cihazı belirleme yöntemi:

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

DÜZENLENEN: Dan Hulme ile yapılan tartışmaların ardından yöntemin adını değiştirdi.


1
Tüm tabletlerin varsayılan yatay yönlendirmesi yoktur. Ve "varsayılan" yönlendirme programınız için önemliyse, muhtemelen başka şekillerde yanlıştır. Örnek için bu Android Geliştiricilerinin Blog yayınına bakın.
Dan Hulme

Lütfen, varsayılan yönde genişliğin yükseklikten daha az olduğu belirli tablet örnekleri verebilir misiniz? Ve tabii ki benim app ne olması gerektiğini daha iyi biliyorsun: D.
Gümüş

Nexus 7 buna bir örnek olacaktır. Ama benim sözümü almak zorunda değilsiniz: Bağlantı verdiğim makaleyi okuyun, bu da her şeyi açıklıyor.
Dan Hulme

Bence yöntemimin adını değiştirmeliyim. Aslında, daha önemlisi (en azından uygulamam için;)) varsayılan cihaz yönlendirmesi ve yöntemim bu görev için yeterli. Ayrıca @Nanne cevabı problemini çok doğru tanımladı, yukarıya bakın.
Gümüş


-1

Benim için telefon ve tablet arasındaki fark, cihaz boyutu ve / veya piksel yoğunluğu değil, teknoloji ve zevkle değişecek, daha çok ekran oranı. Bir metin ekranı görüntülüyorsam, 15 uzun satırın (telefon) vs 20 daha kısa satırın (tablet) olup olmadığını bilmem gerekir. Oyunum için, yazılımımın ele alacağı dikdörtgenin basketbol sahası tahmininde aşağıdakileri kullanıyorum:

    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

Dürüst olmanın en kolay yolu bu bence. Bu, kullanılan ekran boyutunu kontrol edecektir:

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

İyi şanslar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.