正确检测Android设备类型

正确检测Android设备类型,android,Android,有没有办法精确检测设备类型(手机、平板电脑、手表、电视、汽车、PC) 现在,我找到了一种方法来检测应用程序是在汽车(uiModeManager.getCurrentModeType()==Configuration.UI\u MODE\u TYPE\u car)、电视(uiModeManager.getCurrentModeType()==Configuration.UI\u MODE\u TYPE\u TELEVISION)上运行还是在手表(uiModeManager.getCurrentMo

有没有办法精确检测设备类型(手机、平板电脑、手表、电视、汽车、PC)

现在,我找到了一种方法来检测应用程序是在汽车(
uiModeManager.getCurrentModeType()==Configuration.UI\u MODE\u TYPE\u car
)、电视(
uiModeManager.getCurrentModeType()==Configuration.UI\u MODE\u TYPE\u TELEVISION
)上运行还是在手表(
uiModeManager.getCurrentModeType())==Configuration.UI\u MODE\u TYPE\u WATCH
)。 对吗?连接到汽车上的手机是显示为手机还是显示为“Android Auto”

为了区分手机、平板电脑或电脑,我可以检查屏幕的最小尺寸(例如,600dp即为平板电脑或笔记本电脑)

现在的问题是如何区分平板电脑和笔记本电脑。你知道吗

PS:我问这个问题并不是为了创建一个响应性的UI,而是一个与帐户的设备管理相关的问题


您可以从Build.MODEL中知道其手机、标签或电视是否可以在大屏幕上运行此代码应用程序进行检测

public static boolean isTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK)
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
  }
这对你也有帮助

获取屏幕的宽度,并用此断点检查

/*平板电脑(纵向和横向)----*/

 min-device-width : 768px
 max-device-width : 1024px
min-width : 1224px
/*台式机和笔记本电脑--------*/

 min-device-width : 768px
 max-device-width : 1024px
min-width : 1224px

使用以下静态方法获取设备名称、id、高度和宽度。欲了解更多详情,请访问此网站。该项目包括基本android应用程序需要的所有公共功能

     public static String getDeviceName() {
        String manufacturer = Build.MANUFACTURER;
        String model = Build.MODEL;
        if (model.startsWith(manufacturer)) {
            return capitalize(model);
        } else {
            return capitalize(manufacturer) + " " + model;
        }
    }

    public static String getDeviceID(Context context) {
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return telephonyManager.getDeviceId();
    }

    public static int getDeviceHeight(Context mContext) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        ((Activity) mContext).getWindowManager().getDefaultDisplay()
                .getMetrics(displaymetrics);
        return displaymetrics.heightPixels;
    }

    public static int getDeviceWidth(Context mContext) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        ((Activity) mContext).getWindowManager().getDefaultDisplay()
                .getMetrics(displaymetrics);
        return displaymetrics.widthPixels;
    }
为了区分手机和平板电脑或电脑,我可以检查屏幕的最小尺寸(例如600dp以符合talet或笔记本电脑的要求)

有一种更好的方法可以做到这一点,那就是使用值。例如,如果您有两种类型的设备(例如手机和平板电脑),也可以为值创建两个文件夹。然后为“值”文件夹添加以下内容:

<resources>
    <bool name="isLarge">false</bool>
</resources>

使用此功能,您可以对手机、sw-600dp、sw-720dp等设备执行相同的操作。我不确定您是否可以将此功能用于电视等设备,但我认为值得尝试。

请参考此链接

下面我把检查平板电脑或安卓电视的代码放在这里,请检查,它会工作的

平板电脑

电视节目


它将工作、享受……

检查物理屏幕大小是否较大(=平板电脑或笔记本电脑类设备):

检查应用程序是否在Android SDK模拟器中运行:

public static boolean isEmulator() {
return Build.FINGERPRINT.startsWith("generic")
        || Build.FINGERPRINT.startsWith("unknown")
        || Build.MODEL.contains("google_sdk")
        || Build.MODEL.contains("Emulator")
        || Build.MODEL.contains("Android SDK built for x86")
        || Build.MANUFACTURER.contains("Genymotion")
        || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
        || "google_sdk".equals(Build.PRODUCT);
}

检查设备是否为Android电视:

    public static final String TAG = "DeviceTypeRuntimeCheck";

    UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
    if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
        Log.d(TAG, "Running on a TV Device")
    } else {
        Log.d(TAG, "Running on a non-TV Device")
}

不幸的是,这种方法不适用于这种情况,因为我需要手动将每个设备模型与其类型关联起来。我需要一种今天有效明天也会有效的方法。。。我猜它不存在:(如何区分平板电脑和电脑?它们都有一个大屏幕。平板电脑的像素比笔记本电脑多。不管怎样,屏幕大小并不是平板电脑和笔记本电脑的区别。正如之前所指出的那样,像素计数并不是确定设备类型的可靠方法,因为许多新发布的手机的尺寸远远超过就像几年前普通平板电脑一样。如何区分平板电脑和电脑?它们都有大屏幕这并不能回答我的问题:如何获取设备类型(即电话、平板电脑、电视、汽车、手表或电脑)?如何区分平板电脑和笔记本电脑?大屏幕不会使任何设备成为桌面。如何区分平板电脑和笔记本电脑?大屏幕不会使任何设备成为平板电脑
public static boolean checkIsTablet(Context ctx){    
return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private boolean checkIsTelevision() {
  boolean isAndroidTV;
  int uiMode = mContext.getResources().getConfiguration().uiMode;
  if ((uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION) {
    isAndroidTV = true;
}
private static boolean isTabletDevice(Context activityContext) {
    boolean device_large = ((activityContext.getResources().getConfiguration().screenLayout &
            Configuration.SCREENLAYOUT_SIZE_MASK) ==
            Configuration.SCREENLAYOUT_SIZE_LARGE);

    if (device_large) {
        DisplayMetrics metrics = new DisplayMetrics();
        Activity activity = (Activity) activityContext;
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

        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) {
            AppInstance.getLogger().logD("DeviceHelper","IsTabletDevice-True");
            return true;
        }
    }
    AppInstance.getLogger().logD("DeviceHelper","IsTabletDevice-False");
    return false;
}
public static boolean isEmulator() {
return Build.FINGERPRINT.startsWith("generic")
        || Build.FINGERPRINT.startsWith("unknown")
        || Build.MODEL.contains("google_sdk")
        || Build.MODEL.contains("Emulator")
        || Build.MODEL.contains("Android SDK built for x86")
        || Build.MANUFACTURER.contains("Genymotion")
        || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
        || "google_sdk".equals(Build.PRODUCT);
    public static final String TAG = "DeviceTypeRuntimeCheck";

    UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
    if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
        Log.d(TAG, "Running on a TV Device")
    } else {
        Log.d(TAG, "Running on a non-TV Device")
}