You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android使用DrmManagerClient无法获取可用DrmEngines问题求助

排查华为/荣耀设备DrmManagerClient.getAvailableDrmEngines返回0的问题

这个问题我之前适配华为、荣耀设备时也踩过坑,明明设备实际支持Widevine,但旧的DrmManagerClient就是返回0,大概率是几个容易忽略的细节没处理到位,咱们一步步来排查:

1. 权限声明没配全

有些华为/荣耀的定制ROM要求明确声明DRM相关权限,即使系统底层支持,也得在AndroidManifest.xml里加上:

<uses-permission android:name="android.permission.DRM_CERTIFICATE" />
<uses-feature android:name="android.software.drm" android:required="false" />

这里required="false"是为了兼容不支持DRM的设备,但华为系设备需要这个声明才能让DrmManagerClient正确识别到DRM引擎。

2. 初始化时机太早

别在ApplicationonCreate里急着调用getAvailableDrmEngines,此时系统的DRM服务可能还没完全启动完成。建议把检测逻辑放到ActivityonResume之后,或者用异步延迟的方式调用:

new Handler(Looper.getMainLooper()).postDelayed(() -> {
    DrmManagerClient drmClient = new DrmManagerClient(context);
    int engineCount = drmClient.getAvailableDrmEngines();
    // 后续处理逻辑
}, 1000);

3. 改用更可靠的现代API

DrmManagerClient是Android早期的DRM接口(从API 11引入,API 28开始被标记为废弃),华为/荣耀的新系统对这个旧API的兼容性做了限制。推荐直接用MediaDrm来检测Widevine支持,这个方法更准确:

boolean isWidevineSupported = false;
try {
    // 直接初始化Widevine对应的MediaDrm实例
    MediaDrm mediaDrm = new MediaDrm("widevine");
    isWidevineSupported = true;
    mediaDrm.close();
} catch (Exception e) {
    // 捕获异常说明设备不支持Widevine
    e.printStackTrace();
}

这个方式直接和底层DRM服务交互,绕过了旧API的兼容性问题,也是Google官方推荐的检测方式。

4. 定制ROM的隐藏限制

部分华为/荣耀的定制ROM可能修改了DrmManagerClient的返回逻辑,但底层DRM服务其实是正常的。这种情况下,MediaDrm的检测结果才是最真实的,直接用它来判断即可。

5. 设备DRM服务异常

极少数情况是设备的DRM服务出现了异常,可以引导用户重启设备,或者检查系统更新——有些系统补丁会专门修复DRM识别的问题。

总结一下:优先替换成MediaDrm API来检测Widevine支持,同时补全权限声明、调整初始化时机,基本就能解决这个问题了。

内容的提问来源于stack exchange,提问作者David Lara

火山引擎 最新活动