【问题标题】:How can I check if an app is running on an Android TV如何检查应用程序是否在 Android TV 上运行
【发布时间】:2015-01-24 04:08:02
【问题描述】:

有没有办法检查应用程序是否在 Android TV 或 Android Mobile 上运行?

我知道如何检查正在运行的构建。如果应用程序在 Android TV vs Mobile 上运行,我想启动特定服务。希望将两人安置在同一个图书馆下。

【问题讨论】:

    标签: android android-tv


    【解决方案1】:

    来自 Android 文档中的 Handling TV Hardware

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

    【讨论】:

    • 这正是谷歌提到的。
    • 无法解析符号 getCurrentModeType。我得到了这个错误。谢谢
    • 两个语句的末尾都缺少分号。谢谢
    • 这是 Android 培训文档中推荐的方法,应该是公认的答案。
    【解决方案2】:
    private boolean isDirectToTV() {
      return(getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)
          || getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK));
    }
    

    如果设备将自己宣传为具有android.hardware.type.televisionandroid.software.leanback 系统功能,这将返回true。 Android TV 和 Fire TV 可以正确处理这个问题;我还没有在其他环境下尝试过。

    【讨论】:

    • +1 这种方式可以让你在对应平台上轻松插入功能,我只是在AndroidTV上的Now Playing Card中使用过。
    • FEATURE_TELEVISION 在 API 21 及更高版本中已弃用。谢谢
    • @MindRoasterMir:如果你的minSdkVersion 是21 或更高,你可以跳过FEATURE_TELEVISION/android.hardware.type.television 部分,直接使用FEATURE_LEANBACK/android.software.leanback
    【解决方案3】:

    一些选项是:

    1) 查询系统大屏

    2) 使用反射来检测电视特定的类

    3) 使用hasSystemFeature 检测缺少触摸屏

    更多信息

    https://developer.android.com/training/tv/start/hardware.html

    Google TV 也有类似的回答

    Identify GoogleTv from Android app

    【讨论】:

    【解决方案4】:

    总结以前的答案:

    • 如果uiModeManager.currentModeType == UI_MODE_TYPE_TELEVISION 那绝对是电视
    • 不能靠currentModeType说它是电视,因为有些电视设备实际上是返回UI_MODE_TYPE_NORMAL
    • 因此,我们应该检查 FEATURE_TELEVISION 用于预棒棒糖,FEATURE_LEANBACK 用于棒棒糖设备。
    • 如果您不仅想支持电视,还想支持带屏幕的固定设备,您可以添加额外的检查来预测它
    • 您应该小心不要在手机上显示 tv ui

    这是我们实际使用的 kotlin 代码:

    enum class UiModeType {
        NORMAL,
        DESK,
        CAR,
        TV,
        APPLIANCE,
        WATCH,
        VR
    }
    
    private val modeType: Int
        get() = uiModeManager.currentModeType
    
    fun getUiModeType(): UiModeType = when {
        modeType == UI_MODE_TYPE_APPLIANCE -> UiModeType.APPLIANCE
        modeType == UI_MODE_TYPE_CAR -> UiModeType.CAR
        modeType == UI_MODE_TYPE_DESK -> UiModeType.DESK
        modeType == UI_MODE_TYPE_TELEVISION -> UiModeType.TV
    
        sdkInt >= Build.VERSION_CODES.KITKAT_WATCH &&
            modeType == UI_MODE_TYPE_WATCH -> UiModeType.WATCH
    
        sdkInt >= Build.VERSION_CODES.O &&
            modeType == UI_MODE_TYPE_VR_HEADSET -> UiModeType.VR
    
        isLikelyTelevision() -> UiModeType.TV
    
        modeType == UI_MODE_TYPE_NORMAL -> UiModeType.NORMAL
        else -> UiModeType.NORMAL
    }
    
    private fun isLikelyTelevision(): Boolean = with(packageManager) {
        return@with when {
            sdkInt >= Build.VERSION_CODES.LOLLIPOP &&
                hasSystemFeature(PackageManager.FEATURE_LEANBACK) -> true
            sdkInt < Build.VERSION_CODES.LOLLIPOP &&
                @Suppress("DEPRECATION")
                hasSystemFeature(PackageManager.FEATURE_TELEVISION) -> true
            isBatteryAbsent() &&
                hasSystemFeature(PackageManager.FEATURE_USB_HOST) &&
                hasSystemFeature(PackageManager.FEATURE_ETHERNET) &&
                !hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)
    }
    
    @SuppressLint("NewApi")
    private fun isBatteryAbsent(): Boolean {
        return if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) {
            batteryManager?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) == 0
        } else {
            false
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      相关资源
      最近更新 更多