最近有个新需求就是根据后台返回,指定某设备的音量值可以修改,我就简单记录一下我只自己的方式,如下:
这里用到的思想是:
1.先获取本地设备的音乐类型(AudioManager.STREAM_MUSIC)的最大值(max ) 和本地设备当前值(current )。
2.传入一个int类型的0-100的值,代表你想要的声音大小,下面用了一个模拟值(apiVolume ),一个本机最大值的百分比(zhanbi ):max/100。
乘上
当前本地音量值 跟 默认值在设备上的比例的值
当前本地音量值 > 后台拿到的音量值 时 拿 当前本地音量值-后台拿到的音量值 得到差值 ,adjustSuggestedStreamVolume的方法里面的一个参数AudioManager.ADJUST_LOWER是代表音量减少的意思,然后拿差值一步步减少int的值到后台拿到音量值为准。,当前本地音量值 < 后台拿到的音量值 时,原理反之。
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int current = am.getStreamVolume(AudioManager.STREAM_MUSIC);
float zhanbi = max / 100f;
Log.i("MUSIC 1", "本机最大值=" + max + " 本机当前值=" + current + " 最大音量占比=" + zhanbi);
//假设默认值
int apiVolume = 35;
//默认值*最大音量占比取整数
int setapi = (int) (apiVolume * zhanbi);
Log.i("MUSIC 2", "最后正确需要调节到音量为=" + setapi);
if (current > setapi) {
int ad = current - setapi;
for (int p = 0; p < ad; p++) {
am.adjustSuggestedStreamVolume(AudioManager.ADJUST_LOWER, AudioManager.STREAM_MUSIC, setapi);
}
int currents = am.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.i("MUSIC 3", "成功输出,最后减少到正确音量值=" + currents);
} else {
int af = setapi - current;
for (int p = 0; p < af; p++) {
am.adjustSuggestedStreamVolume(ADJUST_RAISE, AudioManager.STREAM_MUSIC, setapi);
}
int currents = am.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.i("MUSIC 3 ", "成功输出,最后增加到正确音量=" + currents);
}
//设置声音为静音
// Log.i(TAG, "==设置设备为静音==");
// am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
看完上面之后,基本就可以实现这个增加或者减少声音的值了,当然这样还是有一个静音的方式:
Log.i(TAG, "==设置设备为静音==");
am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
当传入值为0的时候,就设置为静音。还有很多细节问题可以自己按照自己的需求去完善上面的代码和功能,实现自己的需求,最后我也修改了上面的代码,但是基本的思路就是上面那些。有问题可以评论留言一起参考,谢谢。
增加修改:重新去修改了一些问题,用一个方法调用:
/**
* 声音处理
*/
private void include_volume(String volumes) {
try {
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int current = am.getStreamVolume(AudioManager.STREAM_MUSIC);
float zhanbi = max / 100f;
Log.i("include_volume:MUSIC 1", "本机最大值=" + max + " 本机当前值=" + current + " 最大音量占比=" + zhanbi + "后台传入的声音值=" + volumes);
if (!volumes.equals(0)) {
Log.i(TAG, "==设置设备执行==");
//转换声音量值
int apiVolume = Integer.parseInt(volumes);
//默认值*最大音量占比取整数
int setapi = (int) (apiVolume * zhanbi);
Log.i("include_volume:MUSIC 2", "最后正确需要调节到音量为=" + setapi);
if (current > setapi) {
int ad = current - setapi;
for (int p = 0; p < ad; p++) {
am.adjustSuggestedStreamVolume(AudioManager.ADJUST_LOWER, AudioManager.STREAM_MUSIC, setapi);
}
int currents = am.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.i("include_volume:MUSIC 3", "成功输出,最后减少到正确音量值=" + currents);
} else {
int af = setapi - current;
for (int p = 0; p < af; p++) {
am.adjustSuggestedStreamVolume(ADJUST_RAISE, AudioManager.STREAM_MUSIC, setapi);
}
int currents = am.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.i("include_volume:MUSIC 3 ", "成功输出,最后增加到正确音量=" + currents);
}
} else {
Log.i(TAG, "include_volume:设置设备为静音");
am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
} catch (Exception e) {
Log.e(TAG, "include_volume:出问题了" + e.getMessage());
}
}
include_volume(volume);
报空指针,int类型错误
//转换声音量值
int apiVolume = Integer.parseInt(volumes);
所以调用这个方法的时候记得判空处理一下:
String volume = js1.getString("Volume");
Log.i(TAG, "updata:onResponse:音量值=" + volume);
//处理后台返回值的声音值
if (volume.equals("null")) {
String volume_str = "0";
include_volume(volume_str);
} else {
include_volume(volume);
}