当前位置: 首页 > 知识库问答 >
问题:

检测Widevine DRM HDCP保护级别

饶骁
2023-03-14

我目前正在使用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个答案

曾宏毅
2023-03-14

好吧,在一整天都在抱怨这件事之后,我开始认为这是不可能的。我最好的尝试都失败了,其中一篇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")
 类似资料:
  • 我正在尝试编写一个应用程序,输入一美元金额打印在一张支票上,我遇到了麻烦,知道如何打印出一张支票中的数字,用前导****星号保护。 这是我到目前为止的代码

  • 5.2 权限和保护级别 权限内有四种类型的保护级别,它们包括正常,危险,签名和签名或系统。 根据保护级别,权限被称为正常权限,危险权限,签名权限或签名或系统权限。 以下部分中使用这些名称。

  • 当HDCP策略阻止播放HD内容时,我试图确定降级为SD内容的最佳做法。 > 降级的合适步骤是什么? 我发现了一些flash线程,建议在每次初始播放尝试之前,在启用HDCP的情况下播放测试资源,以查看它是否播放或返回输出保护错误,这将要求您清理测试资源,然后设置真正的内容进行播放。 看起来我们之前为flash播放器提供的另一个解决方案是尝试播放HD内容,如果出现输出保护错误,我们会尝试获取仅SD清单

  • 两种保护机制和页级保护相关: 1、 可寻址范围约束。 2、 类型检查。 6.4.1 页表项保存保护参数(Page-Table Entries Hold Protection Parameters) 图6-10高亮显示了控制访问的页表项和页目录项的字段。 6.4.1.1 可寻址范围约束(Restricting Addressable Domain) 页面的特权级的概念是通过以下两级来实现的: 1、

  • 段保机护机制有以下五个方面: 1、 类型检查(Type Checking) 2、 界限检查(Limit Checking) 3、 寻址范围约束(Restriction of addressable domain) 4、 子程序入口点约束(Restriction of procedure entry points) 5、 指令集约束(Restriction of instruction set) 段

  • 内存保护单元(Memory Protection Unit) 对于ARM Corte-M3/4F,freeRTOS提供两个版本,一个是不带内存保护的标准版本,一个是带内存保护的freeRTOS-MPU版本。 使用内存保护单元可以从多个潜在的错误中,未被发现的编程错误和硬件故障中保护应用。在任务执行无效的操作时,freeRTOS-MPU可以保护RTOS内核和数据。同样,在任务导致的非预期修改和任务堆