2

我正在开发一个旨在播放 Widevine 受保护内容的应用程序。我正在尝试在 Genymotion 虚拟 Android 设备上运行应用程序。但是当我这样做时,应用程序无法获取 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 一起使用?任何帮助将不胜感激。

4

4 回答 4

10

上面的方法对我不起作用,acquireDrmInfo(request) 总是返回null。经过研究 Exo-player 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();
}
}
于 2017-08-09T13:44:10.780 回答
3
    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;
            }
于 2017-03-01T08:29:30.217 回答
0

您可以在管理器上注册错误侦听器以了解正在发生的事情:

manager.setOnErrorListener(new DrmManagerClient.OnErrorListener() {
    public void onError(DrmManagerClient drmManagerClient, DrmErrorEvent event) {
        Log.i(TAG, "Error Type : " + event.getType());
    }
});
于 2014-08-07T11:41:40.600 回答
0

DRM 是一项硬件功能。它无法在模拟器中获得。

于 2017-06-14T11:46:36.810 回答