TelephonyManager और स्क्रीन आकार के माध्यम से डिवाइस प्रकार निर्धारित करना
एंड्रॉइड में फोन और टैबलेट के बीच अंतर करने के कई तरीके हैं। सबसे विश्वसनीय विधि TelephonyManager.getPhoneType() है जो वॉयस कॉल क्षमता जांचता है, लेकिन स्क्रीन आकार और UI मोड भी उपयोगी संकेत देते हैं।
चरण 1: नया प्रोजेक्ट बनाएं
Android Studio में प्रोजेक्ट बनाएं।
चरण 2: लेआउट फ़ाइल
res/layout/activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvDeviceInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:textSize="18sp"
android:lineSpacingExtra="8dp"
tools:text="डिवाइस जानकारी लोड हो रही है..." />
</RelativeLayout>
चरण 3: MainActivity में डिवाइस डिटेक्शन लॉजिक
package com.app.sample;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private TextView tvDeviceInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDeviceInfo = findViewById(R.id.tvDeviceInfo);
detectDeviceType();
}
private void detectDeviceType() {
StringBuilder info = new StringBuilder();
// विधि 1: TelephonyManager (सबसे विश्वसनीय फोन/टैबलेट के लिए)
String phoneTypeResult = detectByTelephony();
info.append("📞 टेलीफोनी: ").append(phoneTypeResult).append("\n\n");
// विधि 2: स्क्रीन आकार श्रेणी
String screenSizeResult = detectByScreenSize();
info.append("📏 स्क्रीन आकार: ").append(screenSizeResult).append("\n\n");
// विधि 3: UI मोड
String uiModeResult = detectByUiMode();
info.append("🖥️ UI मोड: ").append(uiModeResult).append("\n\n");
// विधि 4: स्क्रीन घनत्व और आकार
String metricsResult = detectByMetrics();
info.append("📐 मेट्रिक्स: ").append(metricsResult);
tvDeviceInfo.setText(info.toString());
}
// विधि 1: TelephonyManager - वॉयस कॉल क्षमता जांचें
private String detectByTelephony() {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager == null) return "उपलब्ध नहीं";
int phoneType = telephonyManager.getPhoneType();
switch (phoneType) {
case TelephonyManager.PHONE_TYPE_NONE:
return "टैबलेट (कोई सेलुलर रेडियो नहीं) 📱";
case TelephonyManager.PHONE_TYPE_GSM:
return "फोन (GSM) 📞";
case TelephonyManager.PHONE_TYPE_CDMA:
return "फोन (CDMA) 📞";
case TelephonyManager.PHONE_TYPE_SIP:
return "फोन (SIP/VoIP) 📞";
default:
return "अज्ञात फोन प्रकार (" + phoneType + ")";
}
}
// विधि 2: स्क्रीन आकार श्रेणी (Configuration)
private String detectByScreenSize() {
int screenLayout = getResources().getConfiguration().screenLayout;
int screenSize = screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
String sizeName;
switch (screenSize) {
case Configuration.SCREENLAYOUT_SIZE_SMALL: sizeName = "स्मॉल"; break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL: sizeName = "नॉर्मल"; break;
case Configuration.SCREENLAYOUT_SIZE_LARGE: sizeName = "लार्ज"; break;
case Configuration.SCREENLAYOUT_SIZE_XLARGE: sizeName = "एक्स्ट्रा लार्ज"; break;
default: sizeName = "अज्ञात";
}
// लॉन्ग स्क्रीन जांच (API 17+)
boolean isLong = (screenLayout & Configuration.SCREENLAYOUT_LONG_MASK) == Configuration.SCREENLAYOUT_LONG_YES;
return sizeName + (isLong ? " (लॉन्ग)" : "") + " - " + (screenSize >= Configuration.SCREENLAYOUT_SIZE_LARGE ? "संभावित टैबलेट" : "संभावित फोन");
}
// विधि 3: UI मोड (टेलीविजन, घड़ी, कार, डेस्क)
private String detectByUiMode() {
int uiMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK;
switch (uiMode) {
case Configuration.UI_MODE_TYPE_NORMAL: return "सामान्य (फोन/टैबलेट) 📱";
case Configuration.UI_MODE_TYPE_TELEVISION: return "टीवी 📺";
case Configuration.UI_MODE_TYPE_WATCH: return "वॉच ⌚";
case Configuration.UI_MODE_TYPE_CAR: return "कार 🚗";
case Configuration.UI_MODE_TYPE_DESK: return "डेस्क डॉक 🖥️";
case Configuration.UI_MODE_TYPE_VR_HEADSET: return "VR हेडसेट 🥽";
default: return "अज्ञात (" + uiMode + ")";
}
}
// विधि 4: डिस्प्ले मेट्रिक्स (भौतिक आकार इंच में)
private String detectByMetrics() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
float widthInches = metrics.widthPixels / metrics.xdpi;
float heightInches = metrics.heightPixels / metrics.ydpi;
double diagonalInches = Math.sqrt(widthInches * widthInches + heightInches * heightInches);
String deviceClass;
if (diagonalInches >= 7.0) {
deviceClass = "टैबलेट (7 इंच+)";
} else if (diagonalInches >= 5.5) {
deviceClass = "फैबलेट/बड़ा फोन (5.5-7 इंच)";
} else {
deviceClass = "फोन (< 5.5 इंच)";
}
return String.format("%.1f x %.1f इंच = %.1f इंच विकर्ण → %s", widthInches, heightInches, diagonalInches, deviceClass);
}
}
Kotlin एक्सटेंशन फंक्शन्स
// Context एक्सटेंशन
fun Context.isTablet(): Boolean {
return (resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
}
fun Context.isPhone(): Boolean = !isTablet()
// TelephonyManager एक्सटेंशन
fun TelephonyManager.isVoiceCapable(): Boolean {
return phoneType != PHONE_TYPE_NONE
}
// उपयोग
val isTablet = this.isTablet()
val isPhone = telephonyManager.isVoiceCapable()
डिवाइस प्रकार निर्धारण रणनीति
| विधि | विश्वसनीयता | उपयोग का मामला |
|---|---|---|
| TelephonyManager.PHONE_TYPE_NONE | उच्च | सेलुलर क्षमता जांचने के लिए सर्वश्रेष्ठ |
| स्क्रीन आकार >= लार्ज | मध्यम | लेआउट अनुकूलन के लिए |
| विकर्ण >= 7 इंच | उच्च | भौतिक आकार आधारित निर्णय |
| UI मोड | विशिष्ट | टीवी, वॉच, कार, VR पहचान |
व्यावहारिक उपयोग: रिस्पॉन्सिव लेआउट
// ऑनक्रिएट में लेआउट निर्णय लें
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isTabletDevice()) {
setContentView(R.layout.activity_main_tablet); // दो-पैन लेआउट
// फ्रैगमेंट्स साइड-बाय-साइड
} else {
setContentView(R.layout.activity_main_phone); // सिंगल पैन
}
}
private boolean isTabletDevice() {
// संयुक्त जांच: टेलीफोनी + स्क्रीन आकार
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
boolean hasTelephony = tm != null && tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
boolean isLargeScreen = screenSize >= Configuration.SCREENLAYOUT_SIZE_LARGE;
// टैबलेट: कोई टेलीफोनी नहीं AND बड़ी स्क्रीन
// या: बड़ी स्क्रीन (कुछ बड़ी स्क्रीन फोन के लिए)
return !hasTelephony && isLargeScreen;
}
चरण 4: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.app.sample">
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- टेलीफोनी के लिए -->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
महत्वपूर्ण नोट्स
- READ_PHONE_STATE अनुमति
getPhoneType()के लिए आवश्यक नहीं (केवल फोन नंबर/आईएमईआई के लिए) - कुछ बड़े फोन (फोल्डेबल, फैबलेट)
SCREENLAYOUT_SIZE_LARGEरिपोर्ट कर सकते हैं - Chrome OS डिवाइस पर
PHONE_TYPE_NONEलेकिन डेस्कटॉप UI मोड हो सकता है - फोल्डेबल्स के लिए
WindowManager.getCurrentWindowMetrics()(API 30+) का उपयोग करें
सर्वोत्तम अभ्यास: एकल जांच पर भरोसा न करें। TelephonyManager (वॉयस क्षमता) + स्क्रीन आकार + भौतिक विकर्ण के संयोजन का उपयोग करें। लेआउट निर्णयों के लिए Configuration.SCREENLAYOUT_SIZE_LARGE सबसे व्यावहारिक है।