ট্যাবলেট বা ফোন - অ্যান্ড্রয়েড


140

ব্যবহারকারী কোনও ট্যাবলেট বা ফোন ব্যবহার করছেন কিনা তা পরীক্ষা করার কোনও উপায় আছে? আমার টিল্ট ফাংশন এবং আমার নতুন ট্যাবলেট (ট্রান্সফর্মার) নিয়ে আমার সমস্যা হয়েছে


26
আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন। ডিভাইসটি ফোন, ট্যাবলেট, টেলিভিশন, টোস্টার, টিচআপ, বা থার্মোমিটার কিনা তা বিবেচ্য নয়। ডিভাইসের বিপণন-সংজ্ঞায়িত শ্রেণি নয়, যা সক্ষমতাগুলি তা গুরুত্বপূর্ণ। আপনি কী দক্ষতাগুলি অনুসন্ধান করছেন এবং কীভাবে ডিভাইসটির এমন ক্ষমতা রয়েছে কিনা তা সনাক্ত করতে বা এই জাতীয় দক্ষতার অভাব রয়েছে এমন ডিভাইসগুলির জন্য কীভাবে নিজেকে বাজার থেকে ছাঁটাই করতে হবে তা নির্ধারণ করার জন্য দয়া করে একটি নতুন অ্যান্ড্রয়েড প্রশ্ন জিজ্ঞাসা করুন।
কমন্সওয়্যার

7
@ কমন্সওয়্যার: কিছু সময় আপনি বড় ডিভাইসগুলির জন্য অতিরিক্ত বৈশিষ্ট্য যুক্ত করতে চান।
ববস

10
@ ব্রেকসিমেইল: যার অর্থ আপনার ডিভাইসের বড় স্ক্রিন রয়েছে কিনা তা পরীক্ষা করা দরকার। "বৃহত্তর স্ক্রিন"! = "ট্যাবলেট"।
CommonsWare

2
আরও ভাল উত্তর এখানে পাওয়া যাবে: stackoverflow.com/a/9308284/1750829 হিসাবে সহজ :-)
বা কাজাজ

3
আমি এই পুরো পৃষ্ঠাটি ডাউনটাতে চাই! একটি ফোন টেলিফোনি করে, একটি ট্যাবলেট দেয় না। খুব সুন্দর সমস্ত পরামর্শ হ'ল নোংরা হ্যাক যা কারও ব্যবহার করা উচিত নয়। এই পৃষ্ঠাটি আর কেউ না দেখলে পৃথিবী আরও ভাল জায়গা হতে পারে!
চিহ্নিত করুন Gjøl

উত্তর:


122

যেমনটি আগে উল্লেখ করা হয়েছে, আপনি ডিভাইসটি ট্যাবলেট বা ফোন কিনা তা পরীক্ষা করতে চান না তবে আপনি ডিভাইসের বৈশিষ্ট্যগুলি সম্পর্কে জানতে চান,

বেশিরভাগ সময়, একটি ট্যাবলেট এবং একটি ফোনের মধ্যে পার্থক্য হল পর্দার আকার যা এজন্য আপনি বিভিন্ন লেআউট ফাইল ব্যবহার করতে চান। এই ফাইল 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ধ্রুবকের মাধ্যমে এখন পর্দার ধরণ অ্যাক্সেসযোগ্য ।


4
+1, দুর্দান্ত উত্তর কারণ এটি কেন আপনি আসলে ট্যাবলেট / ফোনের জন্য চেক করতে চান তা আরও অন্তর্দৃষ্টি দেয় । আমরা এমন এক মুহুর্তের
নিকটে

গ্যালাক্সি নোট এবং নতুন নেক্সাস 6 এর মতো বড় ফোনে এটি কীভাবে প্রযোজ্য? এই কৌশলটি ব্যবহার করে, এই বড় ডিভাইসগুলি ফোন বা ট্যাবলেট হিসাবে সনাক্ত করা যাবে?
পেরাকাকোলাবস

1
দুর্ভাগ্যক্রমে, এই apporach স্যামসাং মেগা 6.3 ডিভাইসের জন্য কাজ করে না এবং এটি একটি ট্যাবলেট (sw600dp) হিসাবে ফেরত দেয় - এটি ক্যাপচার করার জন্য অন্য কোনও ধারণা?
বুকুরজিয়াস

ট্যাবলেটগুলি কি ফোন কল করে?
মাইক

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


উভয়ই - কিন্ডল ফায়ার এবং মটোরোলা ড্রয়েড বায়োনিক - SCREENLAYOUT_SIZE_MASK == 15. তাহলে আপনার সমাধানটি কেন কাজ করবে?
ইগোরগানাপলস্কি

আমি বিশ্বাস করি, কিন্ডল ফায়ারে এই ফলাফল সত্য। আজ আমার উপর বায়োনিক লাগবে না ... তবে আমার বন্ধু শহরে ফিরে আসলে আমি কয়েকদিনের মধ্যে পরীক্ষা করব check যাইহোক ..... আমি হেলটন ইস্যাকের উত্তরটি পরীক্ষা করেছি এবং এটি সুন্দরভাবে কাজ করে। দয়া করে এটি পরীক্ষা করে দেখুন।
পেটে

4
রয়েছে Configuration.SCREENLAYOUT_SIZE_XLARGE, তাই আপনাকে ধ্রুবক ব্যবহার করতে হবে না এবং আপনি ব্যবহার করতে পারেন >= LARGE
ট্রায়ানগ

2
গ্যালাক্সি নোটটি SCREENLAYOUT_SIZE_LARGE কে প্রতিবেদন করেছে বলে মনে হচ্ছে যাতে এটি ভুলভাবে ট্যাবলেট হিসাবে শ্রেণিবদ্ধ করা হবে
মাইগুয়েলস্যান্তিরসো

1
ডিভাইসের ফন্টটি যদি ছোট হয় এবং সেটিংসে প্রদর্শনের আকার ছোট হয় তবে এই ক্ষেত্রেটি সত্য হয়।
arul

38

এই পোস্টটি আমাকে অনেক সাহায্য করেছে,

দুর্ভাগ্যক্রমে আমার যে উত্তরগুলি আমাকে সহায়তা করেছিল সেগুলি মূল্যায়নের জন্য প্রয়োজনীয় খ্যাতি আমার নেই।

আমার ডিভাইসটি ট্যাবলেট বা ফোন ছিল কিনা তা সনাক্ত করার দরকার ছিল, এটির সাহায্যে আমি স্ক্রিনটির যুক্তি বাস্তবায়ন করতে সক্ষম হব। এবং আমার বিশ্লেষণে ট্যাবলেটটি এমডিপিআই থেকে শুরু করে অবশ্যই 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;
}

2
আমি যে সেরা সমাধানটি পেয়েছি তা হেলটন ইসাককে ধন্যবাদ! সম্ভবত আপনি (আরও ভাল সমাধানের জন্য) স্ক্রিনের ইঞ্চিগুলির জন্য একটি চেক যুক্ত করতে পারেন? যাইহোক, এই সমাধানের জন্য একটি 10
অ্যারেসেম

7
আমি সত্যিই একমত। এটি একটি নির্দিষ্ট পর্দার আকার খুঁজতে একটি পদ্ধতি। আবার, আমি যেমন উত্তর দিয়েছি, ট্যাবলেট এবং ফোনের মধ্যে কোনও পার্থক্য নেই। এটি প্রশ্নের উত্তর নয়। পার্থক্য করা সম্ভব নয় কারণ 1 পার্থক্য নেই। আপনার যদি কিছু নির্দিষ্ট বৈশিষ্ট্যগুলির জন্য কোড করতে হয় (যেমন আপনি নির্দিষ্ট স্ক্রিনের আকারগুলির জন্য করছেন বলে মনে করেন) তবে তা করুন তবে এটিকে ট্যাবলেট বনাম ফোন বলবেন না। টপিক স্টার্টার মনে হয়েছে @ নির্দিষ্ট টিল্ট কার্যকারিতাটি লাইনটি রেখে দিয়েছে। প্রশ্নটি চৌকসভাবে @ কমোনারওয়্যারের মন্তব্য পড়ুন।
Nanne

1
আমি ন্যানির সাথে একমত নই, তবে আমি যেমন বলেছিলাম, আমার আবেদনে স্ক্রিনটি যথেষ্ট পরিমাণে বড় করার জন্য আমাকে দুটি প্যানেল দেখানো দরকার। এবং আমি এই ক্ষেত্রে লেআউটগুলি ব্যবহার করতে পারি না, কারণ স্ক্রিনের যুক্তি জাভা সাইডে ছিল।
হেলটন ইসাক 13'12

3
হেলটন, এই জন্য THX। ভেবেছি আমি এটি বলব যে: এই জ্বলবে: কিন্ডল ফায়ার: মিথ্যা, মোটো জুম (ভি 1): সত্য, গ্যালাক্সি নোট: মিথ্যা, গ্যালাক্সি ট্যাব 10.1 সীমাবদ্ধ: সত্য
পেটি

যুক্তিটি বাদ দিয়ে, কনফিগারেশন
SSCREENLAYOUT_SIZE_XLARGE

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 টি ট্যাবলেট (পকেটের আকার) পছন্দ করি এবং এই উত্তরটি আমার মনে হয় সেরা। তবে রিটার্ন করুন (স্ক্রিন ডায়াগোনাল> = 9.0); ফিরে আসা উচিত (স্ক্রিনডিজোনাল> = 6.5)। তবে প্রশ্নের মন্তব্যে মন্তব্য হিসাবে ব্যবহারের উপর নির্ভরশীল।
জান বার্গস্ট্রমে

11

এখানে কোন পার্থক্য নেই. আপনার পার্থক্য কী বলে মনে হয় তা আপনাকে সংজ্ঞায়িত করা উচিত এবং এটি পরীক্ষা করা উচিত। একটি গ্যালাক্সি ট্যাব একটি ফোন? বা একটি ট্যাবলেট? এবং কেন?

আপনি নির্দিষ্ট সুনির্দিষ্ট বৈশিষ্ট্য এবং এর জন্য কোড নির্ধারণ করতে হবে।

দেখে মনে হচ্ছে আপনি 'টিল্ট' খুঁজছেন। আমি মনে করি এটি অ্যাক্সিলোমিটারের মতো (এটি কি কোনও শব্দ?)। আপনি কেবল ডিভাইসটি সমর্থন করে কিনা তা পরীক্ষা করে দেখতে পারেন:

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/ থেকে । আমি এটি পরীক্ষা করিনি)


আমার টিল্ট ফাংশন এবং আমার নতুন ট্যাবলেট (ট্রান্সফর্মার)
বেনি

একটি নির্বোধ উত্তর ইমো ধরনের - অবশ্যই একটি পার্থক্য আছে। গ্যালাক্সি = ফোন। কেন? কারণ এটি একটির জন্য নির্মাতার মতে একটি "স্মার্টফোন"। যদি আপনি ইঙ্গিত দিচ্ছেন যে তাকে আকার, বা কল করার ক্ষমতা, বা ... যে কোনও কিছু পরীক্ষা করতে হবে - কেবল এটি বলুন say
ডেভ

3
আমি একমত নই, এটি সমস্ত মোবাইলের জন্য কাজ নাও করতে পারে, কিছু ট্যাবলেটে এই সেন্সর রয়েছে। কোন কারণে কোনও পার্থক্য সম্পর্কে আমার প্রাথমিক উত্তর। যাইহোক, আমি চেষ্টা করেছিলাম এমন কিছু কোড যুক্ত করেছি।
Nanne

2
সমস্যাটি হ'ল ল্যান্ডস্কেপ মোডে ট্যাবলেটগুলি "বিল্ড" হওয়ার কারণে অ্যাক্সিলোমিটারের এক্স এবং ওয়াই অক্ষগুলি উল্টে যায় যখন আপনি নিজের অ্যাপ্লিকেশন প্রতিকৃতি মোডে চালিত হওয়ার প্রত্যাশা করেন। এটি জিনিসগুলিকে কিছুটা বিশৃঙ্খলা করতে পারে :) সুতরাং এটি আবশ্যক যে আপনি আবহাওয়াটি আপনি কোনও ট্যাবলেটে চলছে কি না তা পরীক্ষা করে দেখান।
পাম্পি

1
তবে তারপরে এটি অন্যান্য উপায় => যদি কেবলমাত্র এটিই কোনও ডিভাইসটিকে ট্যাবলেট তৈরি করে তবে আপনাকে x / y অক্ষ কীভাবে কাজ করে তা খুঁজে পাওয়া উচিত, অন্যভাবে নয়। আমি কীভাবে সন্দেহ করি যে সমস্ত ট্যাবলেট এবং / বা ফোনের ক্ষেত্রে এটি সত্য?
Nanne

10

আমার ধারণাটি হ'ল আপনি যখন 'মোবাইল / ফোন' সংজ্ঞায়িত করেন তখন আপনি জানতে চান যে আপনি ডিভাইসে ফোন কল করতে পারবেন যা কোনও 'ট্যাবলেট' হিসাবে সংজ্ঞায়িত করা যেতে পারে on এটি যাচাই করার উপায় নীচে। আপনি যদি সেন্সর, পর্দার আকার ইত্যাদির উপর ভিত্তি করে কিছু জানতে চান তবে এটি সত্যিই আলাদা প্রশ্ন।

এছাড়াও, স্ক্রিন রেজোলিউশন, বা রিসোর্স ম্যানেজমেন্টগুলি বৃহত বনাম এক্স্লারেজ ব্যবহার করার সময়, নতুন 'মোবাইল' ডিভাইসগুলি এখন এত বড় স্ক্রিন এবং উচ্চ রেজোলিউশন নিয়ে আসছে যা আপনি যদি সত্যিই চান তবে এই লাইনটি ঝাপসা করছে ফোন কল বনাম কোনও ফোন কলের সামর্থ্য জানতে নীচে 'সেরা'।

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

9
কিছু ট্যাবলেট ফোন করতে পারে এবং একটি জিএসএম বা সিডিএমএ টাইপ থাকতে পারে ... সুতরাং আপনার সমাধানটিও নিখুঁত নয়।
আর্নুফ

6

রবার্ট ডেল জনসন তৃতীয় এবং হেলটন ইস্যাকের উপর ভিত্তি করে আমি এই কোডটি নিয়ে এসেছি আশা করি এটি কার্যকর

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
}

6

গুগল আইওএসচেড 2017 অ্যাপ্লিকেশন উত্স কোডে , নিম্নলিখিত পদ্ধতিটি ব্যবহার করা হয়েছে:

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

3

যাঁরা কোনও ডিভাইসগুলি ট্যাবলেট ইউআই ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার জন্য গুগলের কোডটি উল্লেখ করতে চান তাদের জন্য নীচে উল্লেখ করতে পারেন:

  // 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?
কেসি ওচিবিলি

3

এই পদ্ধতিটি গুগলের একটি প্রস্তাবনা। আমি গুগল অফিকাল অ্যান্ড্রয়েড অ্যাপ এ এই কোডটি দেখতে পাচ্ছিiosched

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

এই সমাধানটি উদাহরণস্বরূপ, এপিআই 18 এবং নেক্সাস 7 1200 x 1920 এক্সএইচডিপি সহ কোনও এমুলেটরটিতে কাজ করছে না!
ইঙ্গো

1
আপনার বাস্তব ডিভাইসে পরীক্ষা করা উচিত :)
htt

আমি এমুলেটর উপর পরীক্ষা করেছেন এবং "isTablet (কনটেক্সট প্রসঙ্গ) ফল মিথ্যা এমুলেটর স্ব ব্যবহার করে
ইঙ্গো

1
এই @ htt এর জন্য ধন্যবাদ, আমি এটি কেবলমাত্র জ্যামারিন স্টুডিওর জন্য প্রয়োজনীয় সি # তে ট্রান্সকোড করেছি:public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
ফিল রায়ান

2

কোনও কোডের দরকার নেই

অন্যান্য উত্তরগুলি ডিভাইসটি ফোন বা ট্যাবলেট কিনা তা প্রোগ্রামগতভাবে নির্ধারণের বিভিন্ন উপায়ের তালিকা করে। তবে, আপনি যদি ডকুমেন্টেশনটি পড়ে থাকেন তবে এটি বিভিন্ন পর্দার আকারকে সমর্থন করার প্রস্তাবিত উপায় নয়।

পরিবর্তে, ট্যাবলেট বা ফোনের জন্য বিভিন্ন সংস্থান ঘোষণা করুন। আপনার জন্য এই আমার যোগ অতিরিক্ত সংস্থান ফোল্ডার না layout, valuesইত্যাদি

  • অ্যান্ড্রয়েড 3.2 (এপিআই স্তর 13) এর জন্য, একটি sw600dpফোল্ডার যুক্ত করুন। এই উপায়ে গুলি mallest W idth যা আনুমানিক ফোন / ট্যাবলেট ডিভাইড হয় অন্তত 600dp হয়। তবে আপনি অন্য আকারগুলিও যুক্ত করতে পারেন। অতিরিক্ত লেআউট রিসোর্স ফাইল কীভাবে যুক্ত করবেন তার উদাহরণের জন্য এই উত্তরটি দেখুন ।

  • যদি আপনি প্রাক অ্যান্ড্রয়েড 3.2 ডিভাইসগুলিকে সমর্থন করছেন তবে ট্যাবলেটগুলিকে সমর্থন করার জন্য আপনাকে ফোল্ডার যুক্ত করতে largeবা xlargeফোল্ডার লাগাতে হবে। (ফোনগুলি সাধারণত smallএবং normal।)

বিভিন্ন পর্দার আকারের জন্য অতিরিক্ত এক্সএমএল ফাইল যুক্ত করার পরে আপনার সংস্থানগুলি কী পছন্দ করতে পারে তার একটি চিত্র এখানে।

এখানে চিত্র বর্ণনা লিখুন

এই পদ্ধতিটি ব্যবহার করার সময়, সিস্টেমটি আপনার জন্য সমস্ত কিছু নির্ধারণ করে। রান সময় কোন ডিভাইস ব্যবহার করা হচ্ছে তা নিয়ে আপনাকে চিন্তা করার দরকার নেই। আপনি কেবল উপযুক্ত সংস্থান সরবরাহ করুন এবং অ্যান্ড্রয়েডকে সমস্ত কাজ করতে দিন।

মন্তব্য

  • আপনি ব্যবহার করতে পারেন alias লেখা অভিন্ন রিসোর্স ফাইল অনুরূপ এড়ানো।

অ্যান্ড্রয়েড ডক্স পড়ার জন্য মূল্যবান



1

"নতুন" স্বীকৃত ডিরেক্টরিগুলি (উদাহরণস্বরূপ মান-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

ডাব্লুডিপি = প্রস্থ ডিপি
এইচডিপি = উচ্চতা পিপি


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) হিসাবে ভাল কাজ করে যা ট্যাবলেট হিসাবে ধরা পড়ে তবে গ্যালাক্সি এস 3 (সাধারণ) নয়।


1

এই পদ্ধতিটি ব্যবহার করুন যা ডিভাইসটি ট্যাবলেট হলে সত্য হয়

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

এই সমাধানটি উদাহরণস্বরূপ, এপিআই 18 এবং নেক্সাস 7 1200 x 1920 এক্সএইচডিপি সহ কোনও এমুলেটরটিতে কাজ করছে না!
ইঙ্গো

এটি আর কিছু ডিভাইসে কাজ করে না। উদাহরণস্বরূপ এটি স্যামসাং মেগা ডিভাইসের জন্য মিথ্যা ফিরিয়ে দেয়
বুরকিউজিয়াস

হ্যাঁ .. এটি আর কাজ করে না ... আমি প্রকৃতপক্ষে প্রতিটি ফোল্ডারের মান, মান_লার্জ ইত্যাদির জন্য সমস্ত স্ট্রিং ফাইলগুলিতে বুলিয়ান যোগ করতে চাইতাম <bool name = "istocolate"> মিথ্যা </ b >> <bool name = "isLargeTocolate"> মিথ্যা </bool> এবং তারপরে আর.বুল.আইস ট্যাবলেটটি ডিভাইসটি ট্যাবলেট রয়েছে কিনা তা সত্য কিনা তা পরীক্ষা করে দেখুন
বৈষ্ণবী

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

অ্যান্ড্রয়েড ৪.২.২ এ পরীক্ষিত (আমার ইংরাজির জন্য দুঃখিত)


0

আমি জানি এটি সরাসরি আপনার প্রশ্নের উত্তর নয়, তবে এখানে অন্যান্য উত্তরগুলি কীভাবে পর্দার আকার সনাক্ত করতে পারে সে সম্পর্কে একটি ভাল ধারণা দেয়। আপনি আপনার প্রশ্নে লিখেছেন যে ঝুঁকতে সমস্যা হয়েছে এবং আমার সাথে এটিও ঘটেছিল।

আপনি যদি স্মার্টফোনে জাইরস্কোপ (বা রোটেশন সেন্সর) চালনা করেন তবে ডিভাইসের ডিফল্ট ওরিয়েন্টেশন অনুযায়ী (যেমন স্যামসাং জিএস 2 ডিফল্ট প্রতিকৃতি, স্যামসং জিটি -৩৩১০) একটি স্মার্টফোনে এক্স- এবং ওয়াই-অক্ষটি একটি ট্যাবলেটের চেয়ে আলাদাভাবে সংজ্ঞায়িত করা যেতে পারে can ডিফল্ট ল্যান্ডস্কেপ, নতুন গুগল নেক্সাস 7 হ'ল ডিফল্ট প্রতিকৃতি, যদিও এটি একটি ট্যাবলেট!)।

এখন আপনি যদি জাইরোস্কোপ ব্যবহার করতে চান তবে আপনি স্মার্টফোনগুলির জন্য একটি কার্যক্ষম সমাধানের সাথে শেষ করতে পারেন, তবে কিছু ট্যাবলেট বা অন্যভাবে রাউন্ডে অক্ষ-বিভ্রান্তি রয়েছে।

আপনি যদি উপরে থেকে কোনও সমাধান ব্যবহার করেন তবে কেবল স্ক্রিন-আকারের জন্য যান এবং তারপরে প্রয়োগ করুন

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

অক্ষটি ফ্লিপ করার জন্য যদি এটির স্ক্রিন-আকারের একটি বৃহত বা এক্স্লার্জ থাকে এটি 90% ক্ষেত্রে কাজ করতে পারে তবে উদাহরণস্বরূপ Nexus 7 এ এটি সমস্যার কারণ হতে পারে (কারণ এটির ডিফল্ট প্রতিকৃতি ওরিয়েন্টেশন এবং বড় স্ক্রিন-আকার রয়েছে)।

এটি ঠিক করার সহজতম উপায়টি রোটেশনভেক্টরস্যাম্পলটিতে সরবরাহ করা nosensorহয়েছে যা আপনার ম্যানিফেস্টে দৃশ্যের ওরিয়েন্টেশনটি সেট করে এপিআই ডেমো দিয়ে জাহাজগুলি সরবরাহ করে :

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

0

প্যাকেজ ম্যানেজারে com.sec.feature.m Multiwindow.tocolate কেবলমাত্র ট্যাবলেট এবং com.sec.feature.m 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 হিসাবে) স্যামসাং মেগা 6.3 স্যামসুগ ডিভাইসটি sw600dp ফোল্ডারগুলি থেকে রিসোর্সগুলি টানছে - তাই অ্যান্ড্রয়েডের হিসাবে এটি যতক্ষণ না এটি ট্যাবলেট।

@ বৈষ্ণবী থেকে উত্তর আমরা পরীক্ষিত সমস্ত ডিভাইসে কাজ করে তবে মেগা 6.3 এর জন্য নয়।

@ হেলটন আইস্যাকের উত্তরটি মেগা 6.3 কে ফোন হিসাবে ফেরত দিয়েছে - তবে ডিভাইসটি এখনও এসএম 600 ডিপি থেকে সংস্থান গ্রহণ করার ফলে এটি অন্যান্য সমস্যার কারণ হতে পারে - উদাহরণস্বরূপ যদি আপনি ফোনের জন্য ভিউপেজার ব্যবহার করেন এবং ট্যাবলেটগুলির জন্য নয় তবে আপনি এনপিই ত্রুটিগুলি দিয়ে শেষ করবেন ।

শেষ পর্যন্ত এটি কেবলমাত্র মনে হচ্ছে অনেকগুলি শর্তাদি যাচাই করার জন্য রয়েছে এবং আমাদের কেবল এটি গ্রহণ করতে হবে যে কিছু ফোন আসলে ট্যাবলেট :- পি


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 এর জন্য ব্যাখ্যা? এটি গুগল দ্বারা পুনরায় সংশোধিত একটি পদ্ধতি।
জর্জেসিস

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

আমি উপরের বিভিন্ন উপায়ে দেখছি 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);

ঠিক আছে?


0

আমার কেবলমাত্র লেআউট ফাইলে স্মার্টফোন / ট্যাবলেট সনাক্ত করা দরকার, কারণ আমি নেভিগেশন কোডটি ব্যবহার করছি।

আমি প্রথমে যা করেছি তা হ'ল একটি লেআউট-sw600dp ডিরেক্টরি তৈরি করা হয়েছিল তবে এটি ভালভাবে কাজ করছে না কারণ এটি আমার নোকিয়া 8 এ ল্যান্ডস্কেপ মোডে সক্রিয় করবে, তবে পর্দার উচ্চতা খুব কম হবে।

সুতরাং, আমি ডিরেক্টরিটির নাম লেআউট-sw600dp-h400dp হিসাবে রাখলাম এবং তারপরে আমি পছন্দসই প্রভাব পেয়েছি। এইচ-এক্সএক্সএক্সএক্সডিপি প্যারামিটারটি আপনার লেআউটে আপনি কতটা বিষয়বস্তু ফেলতে চান তার উপর নির্ভর করতে হবে এবং যেমন অ্যাপ্লিকেশন নির্ভর।


-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
আইসিএসের সাথে আর বৈধ নয়। প্রকৃতপক্ষে, 11 এর নিচে অ্যান্ড্রয়েড সংস্করণগুলি সহ ট্যাবলেট রয়েছে
mdelolmo

1
এটি নির্ভরযোগ্য নয়। নতুন আইসিএস ফোন আছে একটি API স্তর> 11.
জেসন রবিনসন

-1

আমি মনে করি যে কোনও ট্যাবলেটের ন্যূনতম এবং সর্বোচ্চ 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;


এটি ঠিক নয় কারণ স্যামসং গ্যালাক্সি এস 3 রিসুলশন 720 x 1280.
নিখিল

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

সম্পাদিত: ড্যান হালমের সাথে আলোচনার পরে পদ্ধতির নাম পরিবর্তন করা হয়েছে।


1
সমস্ত ট্যাবলেটগুলির একটি ডিফল্ট ল্যান্ডস্কেপ ওরিয়েন্টেশন থাকে না। এবং যদি "ডিফল্ট" ওরিয়েন্টেশন আপনার প্রোগ্রামটির সাথে সম্পর্কিত হয় তবে এটি সম্ভবত অন্যান্য উপায়ে ভুল। উদাহরণের জন্য এই অ্যান্ড্রয়েড বিকাশকারীদের ব্লগ পোস্টটি দেখুন
ড্যান হাল্মে

দয়া করে, আপনি কি ট্যাবলেটগুলির নির্দিষ্ট উদাহরণ দিতে পারেন, ডিফল্ট অভিযোজনে প্রস্থটি দৈর্ঘ্যের চেয়ে কম? এবং অবশ্যই আপনি ভাল জানেন যে আমার অ্যাপটি কী হওয়া উচিত: ডি।
সিলভার

নেক্সাস 7 এর একটি উদাহরণ হবে। তবে আপনাকে এটির জন্য আমার কথাটি নিতে হবে না: আমি লিঙ্কিত নিবন্ধটি পড়ুন, যা এটির সমস্ত ব্যাখ্যা করে।
ড্যান হাল্মে

আমি মনে করি আমার পদ্ধতির নাম পরিবর্তন করা উচিত। আসলে, আরও গুরুত্বপূর্ণভাবে (কমপক্ষে আমার অ্যাপ্লিকেশনটির জন্য;)) ডিফল্ট ডিভাইস ওরিয়েন্টেশন এবং এই পদ্ধতির জন্য আমার পদ্ধতিটি পর্যাপ্ত adequate সমস্যাটি খুব সঠিকভাবে সনাক্ত করেছেন ন্যান উত্তর, উপরে দেখুন।
রৌপ্য

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