Android 6.0.1 TV音量调节

2,039 阅读2分钟

rk平台在调节音量时,发现调为0时,systemUI会触发勿扰模式,通过查看代码因为AudioSystem.java中

public static int getPlatformType(Context context) {

        if (context.getResources().getBoolean(com.android.internal.R.bool.config_voice_capable)) {
            return PLATFORM_VOICE;
        } else if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
            return PLATFORM_TELEVISION;
        } else {
            return PLATFORM_DEFAULT
        }
    }

因为是Tv端的,默认应该是PLATFORM_TELEVISION,但是通过添加log查看,RK平台走的PLATFORM_DEFAULT,感觉是有问题的,我们继续查看代码

在PackageManager.java中我们找到这个变量

public static final String FEATURE_LEANBACK = "android.software.leanback";

通过对比正常平台的我们发现在

device/mstar/common/preinstall/permission/mtv_core_hardware.xml

文件中发现有定义

<feature name="android.software.leanback" />

在RK平台则没有找到类似定义的地方,将mtv_core_hardware.xml 拷贝到设备的system/etc/permission下,给权限后,重启RK设备,发现音量STREAM则变为了AudioSystem.STREAM_MUSIC,验证后发现音量总的大小为15(以前是7)

不过发现按静音键则不能静音,通过对比mstar代码 在AudioService.java中

private void adjustStreamVolume(int streamType, int direction, int flags,
            String callingPackage, String caller, int uid) {
            ....
            
            final int result = checkForRingerModeChange(aliasIndex, direction, step,
                    streamState.mIsMuted);
            adjustVolume = (result & FLAG_ADJUST_VOLUME) != 0;
            //Patch Begin
            if ((streamTypeAlias == AudioSystem.STREAM_MUSIC) &&
                isPlatformTelevision()) {
                adjustVolume = true;
            }
			//Patch End
            // If suppressing a volume adjustment in silent mode, display the UI hint
            if ((result & AudioManager.FLAG_SHOW_SILENT_HINT) != 0) {
                flags |= AudioManager.FLAG_SHOW_SILENT_HINT;
            }
            ....
            

发现是因为adjustVolume变量的值来确定是否要修改音量,修改为上方patch即可正常


RK平台还发现一个问题是音量为零时,按静音键,音量则会变为一,对音量流程不是很清楚,通过添加日志查看到每次按音量减时都会调用

 private int checkForRingerModeChange(int oldIndex, int direction, int step, boolean isMuted) 
 {
    .....
    setRingerMode(ringerMode, TAG + ".checkForRingerModeChange", false /*external*/);
    .....
 }

改变RingerMode 接着调用

private void setRingerModeInt(int ringerMode, boolean persist)
{
    ....
    muteRingerModeStreams();
    ....
}

private void muteRingerModeStreams() {
        ......
        for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
            final boolean isMuted = isStreamMutedByRingerMode(streamType);
            final boolean shouldMute = ringerModeMute && isStreamAffectedByRingerMode(streamType);
            if (isMuted == shouldMute) continue;
            if (!shouldMute) {
                // unmute
                // ring and notifications volume should never be 0 when not silenced
                if (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) {
                    synchronized (VolumeStreamState.class) {
                        final VolumeStreamState vss = mStreamStates[streamType];
                        for (int i = 0; i < vss.mIndexMap.size(); i++) {
                            int device = vss.mIndexMap.keyAt(i);
                            int value = vss.mIndexMap.valueAt(i);
                            if (value == 0) {
                                vss.setIndex(10, device, TAG);
                            }
                        }
               ........
    }

通过

vss.setIndex(10, device, TAG);

设置音量为1