检测Widevine DRM HDCP保护级别

3

我目前正在切换到使用具有Dash/Widevine DRM功能的ExoPlayer。经过测试,我发现高比例的设备未启用HDCP保护。由于合同协议,这是个问题。在允许播放之前,我必须检测并记录这一点。

我从应用程序DRM Info中获得了灵感,知道这样做是可能的。 WideVineScreenShot

我的第一个想法是使用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")

太棒了!问题解决了!

......但是,正如您所看到的,它只能在Pie及以上版本上运行...... 这是不行的。DrmInfo将在我尝试过的每个Android版本上工作。我只是不知道如何使用和文档实际上不存在。

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

2个回答

5

好的,经过一整天的尝试,我开始觉得这似乎不可能。我最好的尝试都失败了,而唯一与此主题相关的StackOverflow帖子只有一个提示,但它并没有起作用。

val algorithms = mediaDrm.getPropertyString("maxHdcpLevel")

但是正如您在这里看到的,这无法通过编译器,并且需要一个MediaDrm.Property*Compiler Error
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")

1
这些键中的一些可能会抛出异常,因为我遇到了一些异常情况,您可能需要将其包装在try catch块中。 - Saurabh Kumar

0

我访问并使用了许多以下的功能。这可能适用于您。

try {
            val mediaDrm = MediaDrm(WIDEVINE_UUID)
            securityLevel = mediaDrm.getPropertyString("securityLevel")
            bundle.apply {
                putString("vendor", mediaDrm.getPropertyString(MediaDrm.PROPERTY_VENDOR))
                putString("version", mediaDrm.getPropertyString(MediaDrm.PROPERTY_VERSION))
                putString("description", mediaDrm.getPropertyString(MediaDrm.PROPERTY_DESCRIPTION))
                putString("algorithms", mediaDrm.getPropertyString(MediaDrm.PROPERTY_ALGORITHMS))
                putString("securityLevel", mediaDrm.getPropertyString("securityLevel"))
                putString("systemId", mediaDrm.getPropertyString("systemId"))
                putString("hdcpLevel", mediaDrm.getPropertyString("hdcpLevel"))
                putString("maxHdcpLevel", mediaDrm.getPropertyString("maxHdcpLevel"))
                putString("usageReportingSupport", mediaDrm.getPropertyString("usageReportingSupport"))
                putString("maxNumberOfSessions", mediaDrm.getPropertyString("maxNumberOfSessions"))
                putString("numberOfOpenSessions", mediaDrm.getPropertyString("numberOfOpenSessions"))
            }
            if (Build.VERSION.SDK_INT >= 28) {
                mediaDrm.close()
            } else {
                mediaDrm.release()
            }
        } catch (e: Exception) {
            bundle.putString("error", e.toString())
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接