क्या यह जांचने का कोई तरीका है कि क्या उपयोगकर्ता टैबलेट या फोन का उपयोग कर रहा है? मुझे अपने झुकाव समारोह और मेरे नए टैबलेट (ट्रांसफार्मर) के साथ समस्याएं हैं
क्या यह जांचने का कोई तरीका है कि क्या उपयोगकर्ता टैबलेट या फोन का उपयोग कर रहा है? मुझे अपने झुकाव समारोह और मेरे नए टैबलेट (ट्रांसफार्मर) के साथ समस्याएं हैं
जवाबों:
जैसा कि पहले उल्लेख किया गया है, आप यह जांचना नहीं चाहते हैं कि डिवाइस टैबलेट है या फोन, लेकिन आप डिवाइस की विशेषताओं के बारे में जानना चाहते हैं,
अधिकांश समय, टैबलेट और फोन के बीच का अंतर स्क्रीन का आकार होता है, यही वजह है कि आप विभिन्न लेआउट फ़ाइलों का उपयोग करना चाहते हैं। इन फ़ाइलों को res/layout-<qualifiers>
निर्देशिकाओं में संग्रहीत किया जाता है । आप res/values-<same qualifiers>
अपने प्रत्येक लेआउट के लिए निर्देशन में एक XML फ़ाइल बना सकते हैं और अपने द्वारा उपयोग किए जाने वाले लेआउट के बीच अंतर करने के लिए इसमें एक 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/
में नेक्सस 10 जैसी बड़ी गोलियों के लिए आपकी लेआउट फाइलें शामिल हैं):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_type">10-inch-tablet</string>
</resources>
अब स्क्रीन प्रकार R.string.screen_type
निरंतर के माध्यम से सुलभ है।
यह पता लगाने के लिए कि उपकरण टेबलेट है या नहीं, निम्नलिखित कोड का उपयोग करें:
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
Configuration.SCREENLAYOUT_SIZE_XLARGE
, इसलिए आपको एक स्थिरांक का उपयोग करने की आवश्यकता नहीं है, और आप इसका उपयोग कर सकते हैं >= LARGE
।
इस पोस्ट ने मुझे बहुत मदद की,
दुर्भाग्य से मेरे पास उन सभी उत्तरों का मूल्यांकन करने के लिए आवश्यक प्रतिष्ठा नहीं है, जिन्होंने मेरी मदद की।
मुझे यह पहचानने की आवश्यकता थी कि क्या मेरा उपकरण टैबलेट या फोन है, इसके साथ मैं स्क्रीन के तर्क को लागू करने में सक्षम होऊंगा। और मेरे विश्लेषण में टैबलेट एमडीपीआई पर शुरू होने वाले 7 इंच (एक्सलरेज) से अधिक होना चाहिए।
यहाँ नीचे कोड है, जो इस पोस्ट के आधार पर बनाया गया था।
/**
* 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;
}
स्क्रीन विकर्ण के आकार की गणना क्यों न करें और इसका उपयोग यह निर्णय लेने के लिए करें कि क्या डिवाइस फोन या टैबलेट है?
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 इंच या उससे कम होनी चाहिए।
इसमें कोई फर्क नही है। आपको परिभाषित करना चाहिए कि आपको क्या लगता है कि अंतर क्या है, और इसके लिए जांच करें। क्या आकाशगंगा टैब एक फोन है? या एक गोली? और क्यों?
आपको यह परिभाषित करना चाहिए कि आप किन विशिष्ट विशेषताओं की तलाश कर रहे हैं, और उसके लिए कोड।
लगता है आप for झुकाव ’की तलाश में हैं। मुझे लगता है कि यह एक्सेलेरोमीटर (यह एक शब्द है?) के समान है। यदि डिवाइस इसका समर्थन करता है, तो आप केवल जाँच कर सकते हैं:
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/03/15/android-accelerometer/ से । मैंने इसका परीक्षण नहीं किया है)।
मेरी धारणा यह है कि जब आप 'मोबाइल / फोन' को परिभाषित करते हैं, तो आप यह जानना चाहते हैं कि क्या आप उस डिवाइस पर एक फोन कॉल कर सकते हैं जो किसी ऐसी चीज पर नहीं किया जा सकता है जिसे 'टैबलेट' के रूप में परिभाषित किया जाएगा। इसे सत्यापित करने का तरीका नीचे है। यदि आप सेंसर, स्क्रीन के आकार आदि के आधार पर कुछ जानना चाहते हैं तो यह वास्तव में एक अलग सवाल है।
इसके अलावा, स्क्रीन रिज़ॉल्यूशन का उपयोग करते समय, या संसाधन प्रबंधन बड़े बनाम एक्सलर्ज, पिछले नए 'मोबाइल' उपकरणों में एक वैध दृष्टिकोण हो सकता है, अब ऐसे बड़े स्क्रीन और उच्च संकल्प के साथ आ रहे हैं कि वे इस लाइन को धुंधला कर रहे हैं जब आप वास्तव में चाहते हैं फोन कॉल पता करने के लिए बनाम फोन कॉल की क्षमता नीचे 'सर्वश्रेष्ठ' है।
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
return "Tablet";
}else{
return "Mobile";
}
रॉबर्ट डेल जॉनसन III और हेल्टन इसाक के आधार पर मैं इस कोड के साथ आया था आशा है कि यह उपयोगी है
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
}
Google IOSched 2017 एप्लिकेशन स्रोत कोड में , निम्न विधि का उपयोग किया जाता है:
public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
उन लोगों के लिए जो Google को यह निर्धारित करने के लिए कोड का उपयोग करना चाहते हैं कि कौन से उपकरण टेबलेट यूआई का उपयोग करेंगे:
// 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;
}
}
shortSize
?
यह विधि Google द्वारा सुझाई गई है। मैं इस कोड को Google Offical Android App में देखता हूंiosched
public static boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
अन्य उत्तर प्रोग्राम को निर्धारित करने के कई तरीकों को सूचीबद्ध करते हैं कि क्या डिवाइस फोन या टैबलेट है। हालाँकि, यदि आप दस्तावेज़ीकरण पढ़ते हैं, तो यह विभिन्न स्क्रीन आकारों का समर्थन करने के लिए अनुशंसित तरीका नहीं है।
इसके बजाय, टैबलेट या फोन के लिए विभिन्न संसाधनों की घोषणा करें। आप के लिए इसे मेरा जोड़ने अतिरिक्त संसाधन फ़ोल्डर करते हैं layout
, values
आदि
एंड्रॉइड 3.2 (एपीआई स्तर 13) के लिए, एक sw600dp
फ़ोल्डर जोड़ें । यह साधन है mallest डब्ल्यू idth जो लगभग फ़ोन / टेबलेट विभाजित है कम से कम 600dp है। हालाँकि, आप अन्य आकारों को भी जोड़ सकते हैं। अतिरिक्त लेआउट संसाधन फ़ाइल को जोड़ने के तरीके के लिए इस उत्तर की जाँच करें ।
यदि आप प्री एंड्रॉइड 3.2 डिवाइस का भी समर्थन कर रहे हैं, तो आपको टैबलेट का समर्थन करने के लिए फ़ोल्डर large
या xlarge
फ़ोल्डर जोड़ना होगा । (फ़ोन आम तौर पर small
और हैं normal
)
यहां विभिन्न स्क्रीन आकारों के लिए एक अतिरिक्त xml फ़ाइलों को जोड़ने के बाद आपके संसाधन क्या पसंद कर सकते हैं, इसकी एक छवि है।
इस पद्धति का उपयोग करते समय, सिस्टम आपके लिए सब कुछ निर्धारित करता है। आपको इस बात की चिंता करने की जरूरत नहीं है कि रन टाइम में किस डिवाइस का इस्तेमाल किया जा रहा है। आप बस उचित संसाधन प्रदान करते हैं और Android को सभी काम करने देते हैं।
टिप्पणियाँ
यदि आप केवल एपीआई स्तर> = 13 को लक्षित कर रहे हैं तो प्रयास करें
public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
चीयर्स :-)
"नई" अभिज्ञात निर्देशिकाओं (उदाहरण के लिए मान-sw600dp) पर विचार करके मैंने स्क्रीन / चौड़ाई के आधार पर यह विधि बनाई:
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;
}
और इस सूची में आप लोकप्रिय उपकरणों और टैबलेट के आकार की कुछ डीपी पा सकते हैं:
Wdp / Hdp
गैलेक्सी नेक्सस:
360/567 XOOM: 1280/752
गैलेक्सी नोट: 400/615
NEXUS 7: 961/528
गैलेक्सी टैक्सी (> 7 && <10): 1280/752
गैलेक्सी S3: 360/615
Wdp = चौड़ाई dp Hdp =
ऊँचाई dp
खैर, सबसे अच्छा समाधान जो मेरे लिए काम किया है वह काफी सरल है:
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) {
[...]
}
}
मैं वास्तव में पिक्सेल आकार को नहीं देखना चाहता, लेकिन केवल स्क्रीन के आकार पर निर्भर करता हूं।
नेक्सस 7 (LARGE) को टैबलेट के रूप में अच्छी तरह से जाना जाता है, लेकिन गैलेक्सी S3 (NORMAL) के रूप में नहीं।
इस विधि का उपयोग करें जो डिवाइस के टेबलेट होने पर सही लौटे
public boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
यदि स्क्रीन आकार का पता लगाने के नए उपकरणों पर सही मूल्य वापस नहीं आता है, तो एक कोशिश करें:
/*
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 पर परीक्षण किया गया (मेरी अंग्रेजी के लिए खेद है)
मुझे पता है कि यह सीधे आपके प्रश्न का उत्तर नहीं है, लेकिन यहां अन्य उत्तर स्क्रीन के आकार की पहचान करने का एक अच्छा विचार देते हैं। आपने अपने प्रश्न में लिखा है कि आपको झुकाव के साथ समस्याएं मिलीं और यह मेरे साथ भी हुआ।
यदि आप एक स्मार्टफोन पर जाइरोस्कोप (या रोटेशन सेंसर) चलाते हैं तो उस डिवाइस के डिफ़ॉल्ट ओरिएंटेशन के अनुसार x- और y- एक्सिस को टैबलेट की तुलना में अलग-अलग परिभाषित किया जा सकता है, (जैसे सैमसंग GS2 डिफ़ॉल्ट पोर्ट्रेट, सैमसंग GT-7310 है) डिफ़ॉल्ट परिदृश्य, नया Google Nexus 7 डिफ़ॉल्ट पोर्ट्रेट है, हालाँकि यह एक टैबलेट है!)।
अब यदि आप जाइरोस्कोप का उपयोग करना चाहते हैं, तो आप स्मार्टफ़ोन के लिए काम कर रहे समाधान के साथ समाप्त हो सकते हैं, लेकिन कुछ टैबलेट या अन्य तरीके से अक्ष-भ्रम।
यदि आप ऊपर से किसी एक समाधान का उपयोग केवल स्क्रीन-आकार के लिए करते हैं और फिर आवेदन करते हैं
SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Y, outputRotationMatrix);
अक्ष को फ़्लिप करने के लिए यदि इसमें एक बड़ी या बड़ी स्क्रीन आकार है तो यह 90% मामलों में काम कर सकता है लेकिन उदाहरण के लिए Nexus 7 पर यह परेशानी का कारण बनेगा (क्योंकि इसमें डिफ़ॉल्ट पोर्ट्रेट ओरिएंटेशन और एक बड़ी स्क्रीन-आकार है)।
इसे ठीक करने का सबसे सरल तरीका RotationVectorSample में प्रदान किया गया है जो आपके प्रदर्शन में sceenOrientation को सेट करके API डेमो के साथ जहाज nosensor
देता है:
<activity
...
android:screenOrientation="nosensor">
...
</activity>
नीचे विधि डिवाइस स्क्रीन की विकर्ण लंबाई की गणना करने के लिए तय करने के लिए है डिवाइस एक फोन या टैबलेट है। इस पद्धति के लिए एकमात्र चिंता यह है कि मौसम का निर्णय लेने के लिए थ्रेशोल्ड मान है कि डिवाइस टैबलेट है या नहीं। नीचे के उदाहरण में मैंने इसे 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 );
}
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)));
}
फोन और टैबलेट के बीच की रेखा खींचना कठिन होता जा रहा है। उदाहरण के लिए (अगस्त 2015 तक) सैमसंग मेगा 6.3 डिवाइस sw600dp फ़ोल्डरों से संसाधनों को खींचता है - जहां तक एंड्रॉइड का संबंध है यह एक टैबलेट है।
@Vyshnavi का उत्तर उन सभी उपकरणों में काम करता है जिन्हें हमने परीक्षण किया है, लेकिन मेगा 6.3 के लिए नहीं।
@ हेल्टन इसाक उत्तर फोन के रूप में मेगा 6.3 लौटाता है - लेकिन चूंकि डिवाइस अभी भी sw600dp से संसाधनों को पकड़ता है, इसलिए यह अन्य मुद्दों का कारण बन सकता है - उदाहरण के लिए यदि आप फोन के लिए व्यूप्लेर का उपयोग करते हैं और टैबलेट के लिए नहीं तो आप एनपीई त्रुटियों के साथ हवा देंगे। ।
अंत में बस ऐसा लगता है कि जाँच करने के लिए बहुत अधिक शर्तें हैं और हमें बस यह स्वीकार करना पड़ सकता है कि कुछ फोन वास्तव में टैबलेट हैं :-P
यह वह विधि है जिसका मैं उपयोग करता हूं:
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
यह अनुशंसित विधि है!
इसका उपयोग क्यों करें?
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);
यह ठीक है?
मुझे केवल लेआउट फ़ाइल में स्मार्टफोन / टैबलेट का पता लगाने की आवश्यकता थी, क्योंकि मैं नेविगेशन कोड का उपयोग कर रहा हूं।
मैंने सबसे पहले एक लेआउट-स्व 600dp डायरेक्टरी बनाई थी, लेकिन यह अच्छी तरह से काम नहीं कर रही थी क्योंकि यह मेरे Nokia 8 को लैंडस्केप मोड में सक्रिय कर देगी, लेकिन स्क्रीन की ऊँचाई बहुत कम होगी।
इसलिए, मैंने निर्देशिका को लेआउट-स्व 600dp-h400dp के रूप में नाम दिया और फिर मुझे वांछित प्रभाव मिला। H-xxxdp पैरामीटर को इस बात पर निर्भर करना चाहिए कि आप अपने लेआउट पर कितनी सामग्री छोड़ना चाहते हैं और जैसे आवेदन निर्भर होना चाहिए।
कृपया नीचे कोड देखें।
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;
}
मुझे लगता है कि एक टैबलेट की न्यूनतम और अधिकतम 600 पीएक्स चौड़ाई और ऊंचाई है,
इसलिए
मान प्राप्त करने के लिए स्क्रीन घनत्व और डीपी में ऊंचाई / चौड़ाई जानने की आवश्यकता है :
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;
फोन और टैबलेट के बीच में एक महत्वपूर्ण अंतर है (कम से कम मेरे कार्यक्रम के लिए)। यह डिवाइस का डिफ़ॉल्ट ओरिएंटेशन है। फोन में एक पोर्ट्रेट ओरिएंटेशन है, टैबलेट - लैंडस्केप। और डिवाइस को निर्धारित करने के लिए क्रमशः विधि:
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: दान हुलमे के साथ चर्चा के बाद विधि का नाम बदल दिया।
मैं एंड्रॉइड लाइब्रेरी 'कैफीन' की सिफारिश कर रहा हूं जिसमें फोन या टैबलेट शामिल हैं, और 10 इंच ~!
बहुत आसान उपयोग।
पुस्तकालय यहाँ है।
https://github.com/ShakeJ/Android-Caffeine-library
और उपयोग करें
DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);
मेरे लिए फोन और टैबलेट के बीच अंतर डिवाइस और / या पिक्सेल घनत्व का आकार नहीं है, जो प्रौद्योगिकी और स्वाद के साथ बदल जाएगा, बल्कि स्क्रीन अनुपात। यदि मैं पाठ की एक स्क्रीन प्रदर्शित कर रहा हूं, तो मुझे पता होना चाहिए कि क्या, कहने के लिए, 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;
}