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