Ошибка получения DRMManagerClientDrmInfo

Я разрабатываю приложение, предназначенное для воспроизведения содержимого, защищенного Widevine. Я пытаюсь запустить приложение на виртуальном Android-устройстве Genymotion. Но когда я это делаю, приложению не удается получить информацию DRM. Таким образом, следующий код возвращает null, и приложение не будет продолжаться дальше.

    DrmInfoRequest request = new DrmInfoRequest(DrmInfoRequest.TYPE_REGISTRATION_INFO,
    Settings.WIDEVINE_MIME_TYPE);
    request.put("WVPortalKey", portal);
    DrmInfo response = mDrmManager.acquireDrmInfo(request);

Мне интересно, является ли виртуальное устройство genymotion причиной проблемы. Если да, то можно ли настроить genymotion так, чтобы он работал с DRM? Любая помощь будет высоко оценен.


person Farooq Zaman    schedule 22.07.2014    source источник
comment
Удалось решить вашу проблему? Вы также указали URI сервера и актива для DrmInfoRequest? например request.put("WVDRMServerKey", serverKey) и request.put("WVAssetURIKey", assetUri);   -  person D. Pereira    schedule 03.01.2017


Ответы (4)


Вышеупомянутый метод не работает для меня, AcquireDrmInfo (запрос) всегда возвращает ноль. После изучения Exo-плеера DashTestRunner. Я использую следующий метод для получения информации Widevine DRM.

private static final UUID WIDEVINE_UUID = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);

@TargetApi (Build.VERSION_CODES.JELLY_BEAN_MR2)
@SuppressWarnings("ResourceType")
private void getWVDrmInfo() {
MediaDrm mediaDrm = null;
try {
  mediaDrm = new MediaDrm(WIDEVINE_UUID);

  String vendor = mediaDrm.getPropertyString(MediaDrm.PROPERTY_VENDOR);
  String version = mediaDrm.getPropertyString(MediaDrm.PROPERTY_VERSION);
  String description = mediaDrm.getPropertyString(MediaDrm.PROPERTY_DESCRIPTION);
  String algorithms = mediaDrm.getPropertyString(MediaDrm.PROPERTY_ALGORITHMS);
  String securityLevel = mediaDrm.getPropertyString("securityLevel");
  String systemId = mediaDrm.getPropertyString("systemId");
  String hdcpLevel = mediaDrm.getPropertyString("hdcpLevel");
  String maxHdcpLevel = mediaDrm.getPropertyString("maxHdcpLevel");
  String usageReportingSupport = mediaDrm.getPropertyString("usageReportingSupport");
  String maxNumberOfSessions = mediaDrm.getPropertyString("maxNumberOfSessions");
  String numberOfOpenSessions = mediaDrm.getPropertyString("numberOfOpenSessions");

  mediaDrm.release();
} catch (UnsupportedSchemeException e) {
  e.printStackTrace();
}
}
person Jason Zong    schedule 09.08.2017

Вы можете зарегистрировать прослушиватели ошибок в менеджере, чтобы получить представление о том, что происходит:

manager.setOnErrorListener(new DrmManagerClient.OnErrorListener() {
    public void onError(DrmManagerClient drmManagerClient, DrmErrorEvent event) {
        Log.i(TAG, "Error Type : " + event.getType());
    }
});
person Miguel Beltran    schedule 07.08.2014

DRM — это аппаратная функция. Его нельзя получить в эмуляторах.

person Cecil Paul    schedule 14.06.2017
comment
Это уже не так, так как на API 24 и выше можно получить widevine L3, а андроид тв начиная с API 28 - person SjoerdvGestel; 12.12.2019
comment
это утверждение ложно - person Kirill Kostrov; 25.11.2020

person    schedule
comment
Только это работает для меня. Может быть, вы могли бы добавить, почему вы проверяете drmPath и для чего он нужен? Большое спасибо! - person Alexey O.; 26.04.2017
comment
@АлексейО. Я просмотрел это где-то в Google, может быть, это для проверки существования пути drm (это путь к файлу drm, когда плагин drm инициализируется в устройстве), если его нет в устройстве, то есть Drm недоступен. Все условия должны соответствовать для проверки наличия drm. - person DeepakPanwar; 27.04.2017
comment
Для меня drmInfo всегда null. Где я могу найти свой WVPortalKey? Не уверен, что здесь использовать. - person wkarl; 14.06.2019