ব্যবহারকারী কোনও ট্যাবলেট বা ফোন ব্যবহার করছেন কিনা তা পরীক্ষা করার কোনও উপায় আছে? আমার টিল্ট ফাংশন এবং আমার নতুন ট্যাবলেট (ট্রান্সফর্মার) নিয়ে আমার সমস্যা হয়েছে
ব্যবহারকারী কোনও ট্যাবলেট বা ফোন ব্যবহার করছেন কিনা তা পরীক্ষা করার কোনও উপায় আছে? আমার টিল্ট ফাংশন এবং আমার নতুন ট্যাবলেট (ট্রান্সফর্মার) নিয়ে আমার সমস্যা হয়েছে
উত্তর:
যেমনটি আগে উল্লেখ করা হয়েছে, আপনি ডিভাইসটি ট্যাবলেট বা ফোন কিনা তা পরীক্ষা করতে চান না তবে আপনি ডিভাইসের বৈশিষ্ট্যগুলি সম্পর্কে জানতে চান,
বেশিরভাগ সময়, একটি ট্যাবলেট এবং একটি ফোনের মধ্যে পার্থক্য হল পর্দার আকার যা এজন্য আপনি বিভিন্ন লেআউট ফাইল ব্যবহার করতে চান। এই ফাইল res/layout-<qualifiers>
ডিরেক্টরিতে সংরক্ষণ করা হয় । আপনি res/values-<same qualifiers>
আপনার প্রতিটি বিন্যাসের জন্য ডাইরেক্টয়ে একটি এক্সএমএল ফাইল তৈরি করতে পারেন এবং আপনার ব্যবহৃত লেআউটগুলির মধ্যে পার্থক্য করার জন্য এটিতে একটি ইনট / বুল / স্ট্রিং সংস্থান রাখতে পারেন।
ফাইল 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/
নেক্সাস small এর মতো ছোট ট্যাবলেটগুলির জন্য আপনার লেআউট ফাইলগুলি ধারণ করে)
<?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 ইঞ্চি বা তার চেয়ে কম হওয়া উচিত কিনা তা অবশ্যই বিতর্ক করতে পারে।
এখানে কোন পার্থক্য নেই. আপনার পার্থক্য কী বলে মনে হয় তা আপনাকে সংজ্ঞায়িত করা উচিত এবং এটি পরীক্ষা করা উচিত। একটি গ্যালাক্সি ট্যাব একটি ফোন? বা একটি ট্যাবলেট? এবং কেন?
আপনি নির্দিষ্ট সুনির্দিষ্ট বৈশিষ্ট্য এবং এর জন্য কোড নির্ধারণ করতে হবে।
দেখে মনে হচ্ছে আপনি 'টিল্ট' খুঁজছেন। আমি মনে করি এটি অ্যাক্সিলোমিটারের মতো (এটি কি কোনও শব্দ?)। আপনি কেবল ডিভাইসটি সমর্থন করে কিনা তা পরীক্ষা করে দেখতে পারেন:
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/ থেকে । আমি এটি পরীক্ষা করিনি)
আমার ধারণাটি হ'ল আপনি যখন 'মোবাইল / ফোন' সংজ্ঞায়িত করেন তখন আপনি জানতে চান যে আপনি ডিভাইসে ফোন কল করতে পারবেন যা কোনও 'ট্যাবলেট' হিসাবে সংজ্ঞায়িত করা যেতে পারে on এটি যাচাই করার উপায় নীচে। আপনি যদি সেন্সর, পর্দার আকার ইত্যাদির উপর ভিত্তি করে কিছু জানতে চান তবে এটি সত্যিই আলাদা প্রশ্ন।
এছাড়াও, স্ক্রিন রেজোলিউশন, বা রিসোর্স ম্যানেজমেন্টগুলি বৃহত বনাম এক্স্লারেজ ব্যবহার করার সময়, নতুন 'মোবাইল' ডিভাইসগুলি এখন এত বড় স্ক্রিন এবং উচ্চ রেজোলিউশন নিয়ে আসছে যা আপনি যদি সত্যিই চান তবে এই লাইনটি ঝাপসা করছে ফোন কল বনাম কোনও ফোন কলের সামর্থ্য জানতে নীচে 'সেরা'।
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
return "Tablet";
}else{
return "Mobile";
}
রবার্ট ডেল জনসন তৃতীয় এবং হেলটন ইস্যাকের উপর ভিত্তি করে আমি এই কোডটি নিয়ে এসেছি আশা করি এটি কার্যকর
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
}
যাঁরা কোনও ডিভাইসগুলি ট্যাবলেট ইউআই ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার জন্য গুগলের কোডটি উল্লেখ করতে চান তাদের জন্য নীচে উল্লেখ করতে পারেন:
// 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
?
এই পদ্ধতিটি গুগলের একটি প্রস্তাবনা। আমি গুগল অফিকাল অ্যান্ড্রয়েড অ্যাপ এ এই কোডটি দেখতে পাচ্ছি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 W idth যা আনুমানিক ফোন / ট্যাবলেট ডিভাইড হয় অন্তত 600dp হয়। তবে আপনি অন্য আকারগুলিও যুক্ত করতে পারেন। অতিরিক্ত লেআউট রিসোর্স ফাইল কীভাবে যুক্ত করবেন তার উদাহরণের জন্য এই উত্তরটি দেখুন ।
যদি আপনি প্রাক অ্যান্ড্রয়েড 3.2 ডিভাইসগুলিকে সমর্থন করছেন তবে ট্যাবলেটগুলিকে সমর্থন করার জন্য আপনাকে ফোল্ডার যুক্ত করতে large
বা xlarge
ফোল্ডার লাগাতে হবে। (ফোনগুলি সাধারণত small
এবং normal
।)
বিভিন্ন পর্দার আকারের জন্য অতিরিক্ত এক্সএমএল ফাইল যুক্ত করার পরে আপনার সংস্থানগুলি কী পছন্দ করতে পারে তার একটি চিত্র এখানে।
এই পদ্ধতিটি ব্যবহার করার সময়, সিস্টেমটি আপনার জন্য সমস্ত কিছু নির্ধারণ করে। রান সময় কোন ডিভাইস ব্যবহার করা হচ্ছে তা নিয়ে আপনাকে চিন্তা করার দরকার নেই। আপনি কেবল উপযুক্ত সংস্থান সরবরাহ করুন এবং অ্যান্ড্রয়েডকে সমস্ত কাজ করতে দিন।
মন্তব্য
আপনি যদি কেবলমাত্র API স্তর> = 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;
}
এবং এই তালিকায় আপনি জনপ্রিয় ডিভাইস এবং ট্যাবলেট আকারের কিছু ডিপি খুঁজে পেতে পারেন:
ডাব্লুডিপি / এইচডিপি
গ্যালাক্সি নেক্সাস:
360/567 XOOM: 1280/752
গ্যালাক্সি নোট:
400/615 নেক্সাস 7: 961/528
গ্যালাক্সি ট্যাব (> 7 && <10): 1280/752
গ্যালাক্সি এস 3: 360/615
ডাব্লুডিপি = প্রস্থ ডিপি
এইচডিপি = উচ্চতা পিপি
আচ্ছা, আমার পক্ষে সবচেয়ে কার্যকর সমাধানটি সবচেয়ে সহজ:
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) হিসাবে ভাল কাজ করে যা ট্যাবলেট হিসাবে ধরা পড়ে তবে গ্যালাক্সি এস 3 (সাধারণ) নয়।
এই পদ্ধতিটি ব্যবহার করুন যা ডিভাইসটি ট্যাবলেট হলে সত্য হয়
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;}
}
অ্যান্ড্রয়েড ৪.২.২ এ পরীক্ষিত (আমার ইংরাজির জন্য দুঃখিত)
আমি জানি এটি সরাসরি আপনার প্রশ্নের উত্তর নয়, তবে এখানে অন্যান্য উত্তরগুলি কীভাবে পর্দার আকার সনাক্ত করতে পারে সে সম্পর্কে একটি ভাল ধারণা দেয়। আপনি আপনার প্রশ্নে লিখেছেন যে ঝুঁকতে সমস্যা হয়েছে এবং আমার সাথে এটিও ঘটেছিল।
আপনি যদি স্মার্টফোনে জাইরস্কোপ (বা রোটেশন সেন্সর) চালনা করেন তবে ডিভাইসের ডিফল্ট ওরিয়েন্টেশন অনুযায়ী (যেমন স্যামসাং জিএস 2 ডিফল্ট প্রতিকৃতি, স্যামসং জিটি -৩৩১০) একটি স্মার্টফোনে এক্স- এবং ওয়াই-অক্ষটি একটি ট্যাবলেটের চেয়ে আলাদাভাবে সংজ্ঞায়িত করা যেতে পারে can ডিফল্ট ল্যান্ডস্কেপ, নতুন গুগল নেক্সাস 7 হ'ল ডিফল্ট প্রতিকৃতি, যদিও এটি একটি ট্যাবলেট!)।
এখন আপনি যদি জাইরোস্কোপ ব্যবহার করতে চান তবে আপনি স্মার্টফোনগুলির জন্য একটি কার্যক্ষম সমাধানের সাথে শেষ করতে পারেন, তবে কিছু ট্যাবলেট বা অন্যভাবে রাউন্ডে অক্ষ-বিভ্রান্তি রয়েছে।
আপনি যদি উপরে থেকে কোনও সমাধান ব্যবহার করেন তবে কেবল স্ক্রিন-আকারের জন্য যান এবং তারপরে প্রয়োগ করুন
SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Y, outputRotationMatrix);
অক্ষটি ফ্লিপ করার জন্য যদি এটির স্ক্রিন-আকারের একটি বৃহত বা এক্স্লার্জ থাকে এটি 90% ক্ষেত্রে কাজ করতে পারে তবে উদাহরণস্বরূপ Nexus 7 এ এটি সমস্যার কারণ হতে পারে (কারণ এটির ডিফল্ট প্রতিকৃতি ওরিয়েন্টেশন এবং বড় স্ক্রিন-আকার রয়েছে)।
এটি ঠিক করার সহজতম উপায়টি রোটেশনভেক্টরস্যাম্পলটিতে সরবরাহ করা 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 ফোল্ডারগুলি থেকে রিসোর্সগুলি টানছে - তাই অ্যান্ড্রয়েডের হিসাবে এটি যতক্ষণ না এটি ট্যাবলেট।
@ বৈষ্ণবী থেকে উত্তর আমরা পরীক্ষিত সমস্ত ডিভাইসে কাজ করে তবে মেগা 6.3 এর জন্য নয়।
@ হেলটন আইস্যাকের উত্তরটি মেগা 6.3 কে ফোন হিসাবে ফেরত দিয়েছে - তবে ডিভাইসটি এখনও এসএম 600 ডিপি থেকে সংস্থান গ্রহণ করার ফলে এটি অন্যান্য সমস্যার কারণ হতে পারে - উদাহরণস্বরূপ যদি আপনি ফোনের জন্য ভিউপেজার ব্যবহার করেন এবং ট্যাবলেটগুলির জন্য নয় তবে আপনি এনপিই ত্রুটিগুলি দিয়ে শেষ করবেন ।
শেষ পর্যন্ত এটি কেবলমাত্র মনে হচ্ছে অনেকগুলি শর্তাদি যাচাই করার জন্য রয়েছে এবং আমাদের কেবল এটি গ্রহণ করতে হবে যে কিছু ফোন আসলে ট্যাবলেট :- পি
এই পদ্ধতিটি আমি ব্যবহার করি:
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;
}
আমি উপরের বিভিন্ন উপায়ে দেখছি Config কনফিগারেশন ক্লাসটি ঠিক নীচে সঠিক উত্তর পেয়েছে:
/**
* 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);
ঠিক আছে?
আমার কেবলমাত্র লেআউট ফাইলে স্মার্টফোন / ট্যাবলেট সনাক্ত করা দরকার, কারণ আমি নেভিগেশন কোডটি ব্যবহার করছি।
আমি প্রথমে যা করেছি তা হ'ল একটি লেআউট-sw600dp ডিরেক্টরি তৈরি করা হয়েছিল তবে এটি ভালভাবে কাজ করছে না কারণ এটি আমার নোকিয়া 8 এ ল্যান্ডস্কেপ মোডে সক্রিয় করবে, তবে পর্দার উচ্চতা খুব কম হবে।
সুতরাং, আমি ডিরেক্টরিটির নাম লেআউট-sw600dp-h400dp হিসাবে রাখলাম এবং তারপরে আমি পছন্দসই প্রভাব পেয়েছি। এইচ-এক্সএক্সএক্সএক্সডিপি প্যারামিটারটি আপনার লেআউটে আপনি কতটা বিষয়বস্তু ফেলতে চান তার উপর নির্ভর করতে হবে এবং যেমন অ্যাপ্লিকেশন নির্ভর।
কোড নীচে চেক আউট করুন।
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;
}
সম্পাদিত: ড্যান হালমের সাথে আলোচনার পরে পদ্ধতির নাম পরিবর্তন করা হয়েছে।
আমি অ্যান্ড্রয়েড লাইব্রেরি 'ক্যাফিন' এর প্রস্তাব দিচ্ছি যাতে এতে ফোন বা ট্যাবলেট পাওয়া যায়, এবং 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;
}