有没有办法检查应用程序是否在Android电视或Android手机上运行?
我知道如何检查正在运行的版本,但是如果应用程序在Android电视与手机上运行,我想启动特定的服务。希望能将两者放在同一个库下。
有没有办法检查应用程序是否在Android电视或Android手机上运行?
我知道如何检查正在运行的版本,但是如果应用程序在Android电视与手机上运行,我想启动特定的服务。希望能将两者放在同一个库下。
来自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");
}
private boolean isDirectToTV() {
return(getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)
|| getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK));
}
如果设备在广告中宣传自己具有android.hardware.type.television
或android.software.leanback
系统功能,则会返回true
。Android TV和Fire TV可以正确处理此功能;我还没有在其他环境中尝试过。
minSdkVersion
为21或更高版本,则可以跳过FEATURE_TELEVISION
/android.hardware.type.television
部分,直接使用FEATURE_LEANBACK
/android.software.leanback
。 - CommonsWare以下是一些选项:
1)查询系统以获取大屏幕
2)使用反射来检测电视特定类
3)使用hasSystemFeature来检测缺少触摸屏
更多信息请参见:
https://developer.android.com/training/tv/start/hardware.html
Google TV 的类似答案请参考:
总结之前的答案:
uiModeManager.currentModeType == UI_MODE_TYPE_TELEVISION
,那肯定是电视currentModeType
来判断它是否是电视,因为一些电视设备实际上会返回UI_MODE_TYPE_NORMAL
FEATURE_TELEVISION
来判断早期的设备,检查FEATURE_LEANBACK
来判断lollipop设备。这是我们实际使用的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
}
}