对于第三方应用如Google music等应用无法播放DRM音乐的问题。这里面我们重点记录一下MTK项目上的处理方法。
1.首先我们需要知道我们要添加应用的包名。adb shell ;top 查看我们要添加的应用的包名。
31597 u0_a95 20 0 4.2G 145M 123M S 1.3 5.1 0:04.81 com.google.android.music:main
作为备用我们需要执行 ps -Z 31597 去查看一下 这个应用的分组,方便我们后面权限申请的使用。这里面我们可以看见谷歌音乐的分组是untrusted_app。
u:r:untrusted_app:s0:c512,c768 u0_a95 31597 624 4441008 150504 0 0 S com.google.android.music:main
2.我们需要在下面的几个文件中添加谷歌音乐的包名。
vendor/mediatek/proprietary/packages/providers/MediaProvider/src/com/android/providers/media/DrmHelper.java
private static void initDrmPermistProcessList() {
String[] permitProcessNames = new String[] {
///modify by xiangzaixiansheng @{
"com.google.android.music:ui",
///}@
"system"
};
vendor/mediatek/proprietary/frameworks/av/drm/mtkwhitelist/DrmMtkDef.cpp
bool DrmMtkDefender::init() {
// Add drm trust client here, it will be checked in DrmManagerService and MediaPlayerService
// 1. inhouse apps(for OMA DRM)
DRM_TRUSTED_PROC.push(String8("com.android.gallery3d")); // image and video, image crop
DRM_TRUSTED_PROC.push(String8("com.android.gallery3d:widgetservice")); // gallery widget
DRM_TRUSTED_PROC.push(String8("com.android.music")); // audio
///modify by xiangzaixiansheng @{
DRM_TRUSTED_PROC.push(String8("com.google.android.music:ui"));
///}@
}
bool DrmTrustedApp::init() {
TRUSTED_APP.push_back(String8("android.process.media"));//for mediaprocess
TRUSTED_APP.push_back(String8("com.android.gallery3d:widgetservice"));//for gallery widget
///modify by xiangzaixiansheng@{
TRUSTED_APP.push_back(String8("com.google.android.music:ui"));
///}@
//Add your special process name here
return true;
}
bool DrmTrustedClient::init() {
///modify by xiangzaixiansheng@{
TRUSTED_PROC.push_back(String8("com.google.android.music:ui"));
///}@
//Add your special process name here
return true;
}
3.在添加完上面的应用包名后,有可能还是不能播放。这个时候我们就需要看log
03:02:35.886000 514 514 W Binder:514_5: type=1400 audit(0.0:915): avc: denied { read } for name="cmdline" dev="proc" ino=104543 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=0
这是我们可以看见其实是应用没有读的权限,我们添加权限即可。
在这里插播一下当然不添加权限之前你也可以用adb指令先实验一下。即
1) adb shell setenforce 0
2) adb shell getenforce (This should return PERMISSIVE)
经过上面两步操作之后不要重启手机,直接测试即可。有可能你会发现竟然可以播放了。当然了这里主要告诉大家的就是“你没权限”。
解决方法如下:
device/mediatek/sepolicy/XXX/plat_private/mediaserver.te 文件中添加如下权限
allow mediaserver untrusted_app:file { read open getattr};
经过如上的操作,应该就可以播放drm文件了。如果还是不能播放就要看log了,这里面主要搜索denied 看是因为什么权限没有,并且还要看这个应用的分组是什么,例如untrusted_app 还是priv_app。 这里面在附赠几个权限给大家,希望也能解决你的困惑。
allow mediaserver priv_app:dir search;
allow mediaserver priv_app:file { read open getattr};