【问题标题】:Correctly detect Android device type正确检测 Android 设备类型
【发布时间】:2016-10-20 14:51:14
【问题描述】:

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

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

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

现在的问题是区分平板电脑和笔记本电脑。你有什么想法吗?

PS:我不是要求这个做出响应式 UI,这是一个与帐户设备管理相关的问题

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以检测是否使用此代码应用程序在大屏幕上运行。

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

    这个link 对你也有帮助。

    获取屏幕宽度并使用此断点进行检查。

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

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

    /* 台式机和笔记本电脑 ----------- */

    min-width : 1224px
    

    【讨论】:

    • 如何区分平板电脑和电脑?他们都有一个大屏幕
    • 有些平板电脑的像素比笔记本电脑多。无论如何,屏幕尺寸并不是平板电脑与笔记本电脑的区别
    • 如前所述,像素数并不是确定设备类型的可靠方法,因为许多新发布的手机的尺寸远远超过了几年前普通平板电脑的尺寸。跨度>
    【解决方案2】:

    请参考此链接,

    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseSWQuali

    下面我放了用于检查平板电脑或安卓电视的代码,请检查,它会工作

    平板电脑

    private boolean checkIsTablet() {
       boolean isTablet;
       Display display = ((Activity)   this.mContext).getWindowManager().getDefaultDisplay();
       DisplayMetrics metrics = new DisplayMetrics();
       display.getMetrics(metrics);
    
      float widthInches = metrics.widthPixels / metrics.xdpi;
      float heightInches = metrics.heightPixels / metrics.ydpi;
      double diagonalInches = Math.sqrt(Math.pow(widthInches, 2) + Math.pow(heightInches, 2));
      if (diagonalInches >= 7.0) {
        isTablet = true;
      }
    
    return isTablet;
    }
    

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

    它会起作用的,享受吧......

    【讨论】:

    • 如何区分平板电脑和笔记本电脑?大屏幕并不能使任何设备成为平板电脑
    【解决方案3】:

    为了区分手机和平板电脑或计算机,我可以检查最小屏幕尺寸(例如 600dp 以符合 talet 或笔记本电脑的条件)。

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

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

    在你的 values-large 文件夹中:

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

    然后在你的活动中:

    boolean isLarge = getResources().getBoolean(R.bool.isLarge);
    if (isLarge) {
        // do something
    } else {
        // do something else
    }
    

    使用它,你可以对手机、sw-600dp、sw-720dp 等做同样的事情。我不确定你是否可以将它用于电视等,但我认为值得一试。

    【讨论】:

    • 如何区分平板电脑和电脑?他们都有一个大屏幕
    【解决方案4】:

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

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

    检查应用是否在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 TV:

        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")
    }
    

    【讨论】:

    • 如何区分平板电脑和笔记本电脑?大屏幕并不能使任何设备成为平板电脑
    【解决方案5】:

    检查这个类。 https://developer.android.com/reference/android/os/Build.html

    String manufacturer = Build.MANUFACTURER
    String model = Build.MODEL
    

    您可以从 Build.MODEL 中知道它的手机、标签或电视

    【讨论】:

    • 不幸的是,这种方法不适用于这种情况,因为我需要手动将每个设备型号与其类型相关联。我需要一种今天有效并且明天有效的方法......我猜它不存在:(
    【解决方案6】:

    使用以下静态方法获取设备名称、ID、高度和宽度。有关更多详细信息,请访问此link。项目包含基本 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;
        }
    

    【讨论】:

    • 这没有回答我的问题:如何获取设备类型(即手机、平板电脑、电视、汽车、手表或电脑)?
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2017-01-24
    相关资源
    最近更新 更多