Сбой DRMManagerClient acquDrmInfo
Я разрабатываю приложение, предназначенное для воспроизведения содержимого, защищенного Widevine. Я пытаюсь запустить приложение на виртуальном Android-устройстве Genymotion. Но когда я делаю это, приложение не может получить информацию о DRM. Таким образом, следующий код возвращает ноль, и приложение не будет продолжать работу.
DrmInfoRequest request = new DrmInfoRequest(DrmInfoRequest.TYPE_REGISTRATION_INFO,
Settings.WIDEVINE_MIME_TYPE);
request.put("WVPortalKey", portal);
DrmInfo response = mDrmManager.acquireDrmInfo(request);
Мне интересно, является ли причиной проблемы виртуальное устройство genymotion. Если так, возможно ли настроить genymotion таким образом, чтобы он работал с DRM? Любая помощь будет высоко оценен.
4 ответа
Вышеупомянутый метод не работает для меня, acquDrmInfo(запрос) всегда возвращает ноль. После изучения Exo-плеер DashTestRunner. Я использую следующий метод, чтобы получить информацию о DRM Widevine.
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();
}
}
private final static long DEVICE_IS_PROVISIONED = 0;
private final static long DEVICE_IS_NOT_PROVISIONED = 1;
private final static long DEVICE_IS_PROVISIONED_SD_ONLY = 2;
private final static String WIDEVINE_MIME_TYPE = "video/wvm";
public static boolean isDeviceWidevineDRMProvisioned(Context context)
{
boolean isDrmAvailable = true;
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT)
{
//As Media DRM Package is available only after KITKAT(API Level 19)
isDrmAvailable = false;
} else
{
DrmManagerClient drmManagerClient = new DrmManagerClient(context);
DrmInfoRequest drmInfoRequest = new DrmInfoRequest(DrmInfoRequest.TYPE_REGISTRATION_INFO, WIDEVINE_MIME_TYPE);
drmInfoRequest.put("WVPortalKey", "key provided for drm in widevine portal");
DrmInfo drmInfo = drmManagerClient.acquireDrmInfo(drmInfoRequest);
if (drmInfo != null)
{
String kWVDrmInfoRequestStatusKey = (String) drmInfo.get("WVDrmInfoRequestStatusKey");
String drmPath = (String) drmInfo.get("drm_path");
if ((kWVDrmInfoRequestStatusKey != null && Integer.parseInt(kWVDrmInfoRequestStatusKey) == DEVICE_IS_NOT_PROVISIONED) || (drmPath != null && drmPath.length() == 0))
{
//not supported
isDrmAvailable = false;
}
}
}
return isDrmAvailable;
}
DRM - это аппаратная функция. Это не может быть получено в эмуляторах.
Вы можете зарегистрировать прослушиватели ошибок на менеджере, чтобы получить представление о том, что происходит:
manager.setOnErrorListener(new DrmManagerClient.OnErrorListener() {
public void onError(DrmManagerClient drmManagerClient, DrmErrorEvent event) {
Log.i(TAG, "Error Type : " + event.getType());
}
});