Android修改音量

1.必须要获取系统的声音服务权限
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

2.声明控制声音的变量
//通话音量
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

3.通过AudoManager的get和set方法来获得声音以及设置声音了
3.1
//获取提示声音音量 
current = mAudioManager.getStreamVolume(AudioManager.STREAM_RING ); 

//获取音乐音量  
current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC );  
其中AudioManager.STREAM_MUSIC代表媒体音量,也可以替换成其他的类型,获取其他类型音量。

3.2//设置音量函数  
public void setStreamVolume(int streamType, int index, int flags)
     * 参数说明: 
     * streamType为铃声类型,例如:AudioManager.STREAM_VOICE_CALL、AudioManager.STREAM_SYSTEM等,
     * 
     * index为音量大小
     * 
     * falgs为标志位,一般设置成0就可以了,感觉无影响 
     */
     
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);

//通话音量

int max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d("VIOCE_CALL", "max : " + max + " current : " + current);

//系统音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d("SYSTEM", "max : " + max + " current : " + current);

//铃声音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d("RING", "max : " + max + " current : " + current);

//音乐音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d("MUSIC", "max : " + max + " current : " + current);

//提示声音音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d("ALARM", "max : " + max + " current : " + current);
ps:
  游戏过程中只允许调整多媒体音量,而不允许调整通话音量。
  setVolumeControlStream(AudioManager.STREAM_MUSIC);
  长时间不动,不允许黑屏,View.setKeepScreenOn(true);
  估计manifest文件中需要注册权限吧

 

4.调节媒体音量
AudioManager audio = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
重写 Activity 的 onKeyDown 方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_VOLUME_UP:
        audio.adjustStreamVolume(
            AudioManager.STREAM_MUSIC,
            AudioManager.ADJUST_RAISE,
            AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
        return true;
    case KeyEvent.KEYCODE_VOLUME_DOWN:
        audio.adjustStreamVolume(
            AudioManager.STREAM_MUSIC,
            AudioManager.ADJUST_LOWER,
            AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
        return true;
    default:
        break;
    }
    return super.onKeyDown(keyCode, event);
}

5.监听音量变化:
上面通过监听按键来监听调整音量的方法,不是很靠谱,因为可能用户在设置里调整音量,所以用下面方式监听音量变化

private void registerVolumeChangeReceiver() {
    mSettingsContentObserver = new SettingsContentObserver(mContext, new Handler());
    mContext.getContentResolver()
            .registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver);
}

private void unregisterVolumeChangeReceiver() {
    mContext.getContentResolver().unregisterContentObserver(mSettingsContentObserver);
}

public class SettingsContentObserver extends ContentObserver {
    Context context;

    public SettingsContentObserver(Context c, Handler handler) {
        super(handler);
        context = c;
    }

    @Override
    public boolean deliverSelfNotifications() {
        return super.deliverSelfNotifications();
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        Log.d(TAG, "音量:" + currentVolume);
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_PLAY_SOUND);
    }
}

6.监听震动模式变化
public boolean isMuteMode() {
    AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    return am.getRingerMode() == AudioManager.RINGER_MODE_SILENT;
}

public boolean isVibrateMode() {
    AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    return am.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE;
}

public boolean isNormalMode() {
    AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    return am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL;
}

private void registerRingerModeReceiver() {
    mRingerModeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
                // 监听到震动/静音/响铃的模式变化

                  if( isMuteMode()){

                 }
            }
        }
    };
    IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
    mContext.registerReceiver(mRingerModeReceiver, filter);
}
 
 

修改录音音量,可以通过调整AudioRecord对象的采样率和音频格式来实现。下面是一个简单的示例代码: ```java //设置采样率为16kHz int sampleRate = 16000; //设置音频格式为PCM编码 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //设置录音声道为单声道 int channelConfig = AudioFormat.CHANNEL_IN_MONO; //设置缓冲区大小 int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); //创建AudioRecord对象 AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, bufferSize); //开始录音 audioRecord.startRecording(); byte[] buffer = new byte[bufferSize]; int read = 0; while (true) { read = audioRecord.read(buffer, 0, bufferSize); if (read > 0) { //修改音量 for (int i = 0; i < read / 2; i++) { //左右声道分别处理 short left = (short) ((buffer[i * 2] & 0xff) | (buffer[i * 2 + 1] << 8)); short right = (short) ((buffer[i * 2 + 2] & 0xff) | (buffer[i * 2 + 3] << 8)); //将左右声道的音量都增加一倍 left *= 2; right *= 2; //处理后的左右声道数据写回缓冲区 buffer[i * 2] = (byte) (left & 0xff); buffer[i * 2 + 1] = (byte) ((left >> 8) & 0xff); buffer[i * 2 + 2] = (byte) (right & 0xff); buffer[i * 2 + 3] = (byte) ((right >> 8) & 0xff); } //将处理后的缓冲区数据写入文件或进行其他处理 } } //停止录音 audioRecord.stop(); audioRecord.release(); ``` 在上面的代码中,我们使用了一个简单的算法来将左右声道的音量都增加一倍。你也可以根据需要使用其他算法来调整音量
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值