提问者:小点点

检测Widevine DRM HDCP保护级别


我目前正在使用Dash/Widevine DRM切换到ExoPlayer。通过测试,我遇到了很多没有启用HDCP保护的设备。由于合同协议,这是一个问题。在允许播放之前,我必须检测并记录它。

我的第一个想法是使用DrmManagerClient

我放弃了它,因为我没有得到结果,并试图使用MediaDrm

val mediaDrm = MediaDrm(WIDEVINE_UUID)

val vendor = mediaDrm.getPropertyString(MediaDrm.PROPERTY_VENDOR)
val version = mediaDrm.getPropertyString(MediaDrm.PROPERTY_VERSION)
val description = mediaDrm.getPropertyString(MediaDrm.PROPERTY_DESCRIPTION)
val algorithms = mediaDrm.getPropertyString(MediaDrm.PROPERTY_ALGORITHMS)

var hdcp: String? = null

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
   hdcp = mediaDrm.connectedHdcpLevel.toString()
}

Log.i("WideVine", "$vendor $version $description $algorithms $hdcp")

成功了!惊人的问题解决了!

。。。除非你能看到它只会在馅饼上起作用。。。这是不可能的。DrmInfo将在我尝试的每个Android版本上工作。我只是不知道如何使用DrmManagerClient,而这些文档实际上是不存在的。

任何信息都将受到重视,谢谢。


共1个答案

匿名用户

好吧,在一整天都在抱怨这件事之后,我开始认为这是不可能的。我最好的尝试都失败了,其中一篇StackOverflow帖子甚至有一点关于这个主题的提示,但没有奏效。

val algorithms = mediaDrm.getPropertyString("maxHdcpLevel")

val stringProperties = arrayOf(
                MediaDrm.PROPERTY_VENDOR,
                MediaDrm.PROPERTY_VERSION,
                MediaDrm.PROPERTY_DESCRIPTION,
                MediaDrm.PROPERTY_ALGORITHMS,
                "maxHdcpLevel")

val widevinePropertiesMap = mutableMapOf<String, String>()

for (prop in stringProperties) {
     widevinePropertiesMap[prop] = mediaDrm.getPropertyString(prop)
     Log.i(prop, mediaDrm.getPropertyString(prop))
     }

Log.i("maxHdcpLevel:", "${widevinePropertiesMap["maxHdcpLevel"]}")

或者,如果你只想得到一样东西,你可以。。。

@SupressLint("WrongConstant")

这很有效!。

我真的不知道你为什么可以这样利用这个方法,但是,它完成了工作!

以下是我们可以获得的一些其他属性:

  val securityLevel = mediaDrm.getPropertyString("securityLevel")
  val systemId = mediaDrm.getPropertyString("systemId")
  val hdcpLevel = mediaDrm.getPropertyString("hdcpLevel")
  val maxHdcpLevel = mediaDrm.getPropertyString("maxHdcpLevel")
  val usageReportingSupport = mediaDrm.getPropertyString("usageReportingSupport")
  val maxNumberOfSessions = mediaDrm.getPropertyString("maxNumberOfSessions")
  val numberOfOpenSessions = mediaDrm.getPropertyString("numberOfOpenSessions")