我想了解一种设备的信息,看看它是智能手机还是平板电脑。我该怎么做呢?
我想显示不同的网页资源基于设备的类型:
String s="Debug-infos:";
s += "\n OS Version: " + System.getProperty("os.version") + "(" + android.os.Build.VERSION.INCREMENTAL + ")";
s += "\n OS API Level: " + android.os.Build.VERSION.SDK;
s += "\n Device: " + android.os.Build.DEVICE;
s += "\n Model (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")";
然而,这似乎对我的情况毫无用处。
这个解决方案现在对我很有效:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
if (SharedCode.width > 1023 || SharedCode.height > 1023){
//code for big screen (like tablet)
}else{
//code for small screen (like smartphone)
}
回复:上面关于如何区分电话和非电话的正题:据我所知,只有电话有15位IMEI(国际移动站设备标识),所以下面的代码将明确区分电话和非电话:
TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String deviceInfo = "";
deviceInfo += manager.getDeviceId(); // the IMEI
Log.d(TAG, "IMEI or unique ID is " + deviceInfo);
if (manager.getDeviceId() == null) {
Log.d(TAG, "This device is NOT a phone");
} else {
Log.d(TAG, "This device is a phone.");
}
我发现在一个Nook模拟器getPhoneType()返回phoneType的“GSM”出于某种原因,所以它似乎检查手机类型是不可靠的。同样,对于处于飞行模式的手机,getNetworkType()将返回0。事实上,飞行模式也会导致getLine1Number()和getSim*方法返回null。但即使在飞行模式下,手机的IMEI仍然存在。
这个主题在Android Training中有讨论:
使用最小宽度限定符
如果你阅读了整个主题,他们解释了如何在特定的值文件(如res/values-sw600dp/attrs.xml)中设置布尔值:
<resources>
<bool name="isTablet">true</bool>
</resources>
因为sw600dp限定符只对android3.2以上的平台有效。如果你想确保这个方法适用于所有平台(3.2之前),在res/values-xlarge文件夹中创建相同的文件:
<resources>
<bool name="isTablet">true</bool>
</resources>
然后,在“标准”值文件(如res/values/attrs.xml)中,将布尔值设置为false:
<resources>
<bool name="isTablet">false</bool>
</resources>
然后在你的活动中,你可以得到这个值,并检查你是否在平板电脑大小的设备上运行:
boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
// do something
} else {
// do something else
}
回复:上面关于如何区分电话和非电话的正题:据我所知,只有电话有15位IMEI(国际移动站设备标识),所以下面的代码将明确区分电话和非电话:
TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String deviceInfo = "";
deviceInfo += manager.getDeviceId(); // the IMEI
Log.d(TAG, "IMEI or unique ID is " + deviceInfo);
if (manager.getDeviceId() == null) {
Log.d(TAG, "This device is NOT a phone");
} else {
Log.d(TAG, "This device is a phone.");
}
我发现在一个Nook模拟器getPhoneType()返回phoneType的“GSM”出于某种原因,所以它似乎检查手机类型是不可靠的。同样,对于处于飞行模式的手机,getNetworkType()将返回0。事实上,飞行模式也会导致getLine1Number()和getSim*方法返回null。但即使在飞行模式下,手机的IMEI仍然存在。
我发现最好的选择和侵入性较小,是在xml中设置一个标记参数,如
电话XML布局
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="phone"/>
Tablet XML布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="tablet">
...
</RelativeLayout>
然后在你的活动类中调用这个
View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));
希望这对你有用。