Определение уровня защиты Widevine DRM HDCP

В настоящее время я перехожу на ExoPlayer с DRM Dash/Widevine. Во время тестирования я столкнулся с большим процентом устройств, на которых не включена защита 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, которые я пробовал. Я просто понятия не имею, как использовать DrmManagerClient, а документов практически нет.

Любая информация будет оценена, спасибо.


person Richard Dapice    schedule 11.09.2019    source источник


Ответы (1)


Итак, после того, как я целый день потрепался, я начал думать, что это невозможно. Мои лучшие попытки не увенчались успехом, и в одном сообщении StackOverflow, даже отдаленно связанном с этой темой, была подсказка, но это не сработало.

val algorithms = mediaDrm.getPropertyString("maxHdcpLevel")

Но, как вы можете видеть здесь, это не пройдет мимо компилятора и требует MediaDrm.Property* Ошибка компилятора

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")
person Richard Dapice    schedule 12.09.2019