栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基于AudioManager实现的音频控制器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于AudioManager实现的音频控制器

基于AudioManager实现的音频控制器

.

介绍

如果我们想对Android系统中各种音频进行控制,那我们可以通过**AudioManager**(音频管理器)类提供的方法来实现,该类提供了各种音量控制与设置铃声模式相关操作,并且可以对麦克风以及音频焦点进行管理和监听等等。

.

.

AudioManager的常用方法

.

1. 音量控制相关的方法:

  • getStreamMaxVolume(streamType):

作用: 获取streamType对应类型的最大音量值

  • getStreamVolume(streamType):

作用: 获取streamType对应类型的当前音量,当设置为0的时候,会自动调整为震动模式

  • adjustStreamVolume(streamType, direction,flags):

作用: 根据不同的streamType类型,调整手机指定类型的声音

streamType类型如下:

  • STREAM_ALARM:表示手机闹铃的声音
  • STREAM_DTMF:表示DTMF音调的声音
  • STREAM_MUSIC:表示手机媒体声音
  • STREAM_NOTIFICATION:表示系统提示的声音
  • STREAM_RING:表示电话铃声的声音
  • STREAM_SYSTEM:表示手机系统的声音
  • STREAM_VOICE_CALL:表示语音电话的声音
  • setStreamVolume (streamType,index,flags):

作用: 直接设置手机的指定类型的音量值。其中streamType参数与adjustStreamVolume()方法中第一个参数的意义相同

  • setStreamMute(streamType,state):

作用: 将手机的指定类型的声音调整为静音。其中streamType参数与adjustStreamVolume()方法中第一个参数的意义相同

.

2. 铃声与通话相关的方法:

  • getMode():

作用: 获取当前的音频模式

  • setMode(mode):

作用: 设置声音模式。可设置的值有 NORMAL,RINGTONE, 和IN_CALL

  • getRingerMode():

作用: 获取当前的铃声模式

  • setRingerMode(ringerMode):

作用: 设置手机电话铃声的模式

ringerMode类型如下:

  • RINGER_MODE_NORMAL:正常的手机铃声
  • RINGER_MODE_SILENT:手机铃声静音
  • RINGER_MODE_VIBRATE:手机震动
  • setSpeakerphoneOn(boolean on):

作用: 设置扬声器打开或关闭。设置为true开启免提通话;false关闭免提

  • isMicrophoneMute():
  • 作用: 判断麦克风是否静音或是否打开
  • setMicrophoneMute(boolean on):

作用: 设置是否让麦克风静音。设置为true将麦克风静音;false关闭静音

.

3. 音频设置相关的方法:

  • isMusicActive():

作用: 判断是否有音乐处于活跃状态

  • requestAudioFocus(AudioManager.OnAudioFocusChangeListener,streamType,durationHint):

作用: 请求音频的焦点

  • abandonAudioFocus(AudioManager.OnAudioFocusChangeListener):

作用: 放弃音频的焦点

  • loadSoundEffects():

作用: 加载声音效果

  • playSoundEffect(effectType,volume):

作用: 播放声音效果

  • unloadSoundEffects():

作用: 卸载音效

  • setStreamSolo(streamType,state):

作用: 设置独奏或来取消特定流

  • isWiredHeadsetOn():

作用: 判断是否插入了耳机

.

.

基于AudioManager音频控制器的实现

.

效果图:

.

1. 在AndroidManifest.xml中注册权限




.

2. 获得AudioManager对象实例

//震动管理器
private Vibrator vibrator;
//音量管理器
private AudioManager audioManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    audioManager = (AudioManager) getApplicationContext().getSystemService
    vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
}

.

3. 调用 AudioManager中的方法实现具体功能

.

4. 监听物理音量按键

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {


    Log.i("萝莉","="+keyCode);

    mediaCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            if (mediaCurVolume < mediaMaxVolume) {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaCurVolume + 1, 0);
                sb_media_audio.setProgress(mediaCurVolume + 1);
            } else {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaMaxVolume, 0);
                sb_media_audio.setProgress(mediaMaxVolume);
            }
            setVibrator();
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (mediaCurVolume > 0) {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaCurVolume - 1, 0);
                sb_media_audio.setProgress(mediaCurVolume - 1);
            } else {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
                sb_media_audio.setProgress(0);
            }
            setVibrator();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}

.

.

实现的完整代码如下:

.

1. 布局代码:




    

        

            

                

                

                

            

            

                

                

                    

                    
                
            

            

                

                

                    

                    
                
            


            

                

                

                    

                    
                
            

            

                

                

                    

                    
                
            
        
    


.

2. MainActivity 中的实现的Java代码

public class MainActivity extends AppCompatActivity {

    //震动管理器
    private Vibrator vibrator;
    //震动等级
    private int vibrateLevel = 30;
    //音量管理器
    private AudioManager audioManager;

    private int mediaMaxVolume;
    private int mediaCurVolume;
    private int alarmMaxVolume;
    private int alarmCurVolume;
    private int callMaxVolume;
    private int callCurVolume;
    private int ringMaxVolume;
    private int ringCurVolume;
    private ImageView iv_audio_mode;
    private TextView tv_audio_mode;
    private Switch switch_mode;
    private SeekBar sb_media_audio;
    private SeekBar sb_alarm_audio;
    private SeekBar sb_call_audio;
    private SeekBar sb_ring_audio;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initView();
        initListener();
    }




    @Override
    protected void onResume() {
        super.onResume();
        setData();
    }


    private void init() {
        //设置音量管理器(参考资料:https://blog.csdn.net/weixin_37730482/article/details/80567141)
        audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        //设置震动管理器(参考资料:https://blog.csdn.net/weixin_37730482/article/details/80564848)
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    }


    private void initView() {
        tv_audio_mode = findViewById(R.id.tv_audio_mode);
        iv_audio_mode = findViewById(R.id.iv_audio_mode);
        switch_mode = findViewById(R.id.switch_mode);
        sb_media_audio = findViewById(R.id.sb_media_audio);
        sb_alarm_audio = findViewById(R.id.sb_alarm_audio);
        sb_call_audio = findViewById(R.id.sb_call_audio);
        sb_ring_audio = findViewById(R.id.sb_ring_audio);
    }


    private void setData() {

        mediaMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        mediaCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        alarmMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
        alarmCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
        callMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
        callCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
        ringMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
        ringCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);


        sb_media_audio.setMax(mediaMaxVolume);
        sb_media_audio.setProgress(mediaCurVolume);
        sb_alarm_audio.setMax(alarmMaxVolume);
        sb_alarm_audio.setProgress(alarmCurVolume);
        sb_call_audio.setMax(callMaxVolume);
        sb_call_audio.setProgress(callCurVolume);
        sb_ring_audio.setMax(ringMaxVolume);
        sb_ring_audio.setProgress(ringCurVolume);


        switch (audioManager.getRingerMode()) {
            case AudioManager.RINGER_MODE_SILENT:
            case AudioManager.RINGER_MODE_VIBRATE:
                switch_mode.setChecked(true);
                return;
            case AudioManager.RINGER_MODE_NORMAL:
                switch_mode.setChecked(false);
                return;
        }

    }

    private void initListener() {

        switch_mode.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (isChecked) {
                NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.isNotificationPolicyAccessGranted()) {
                    startActivity(new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS));
                } else {
                    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                    audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    iv_audio_mode.setImageResource(R.drawable.ic_silent_mode_1);
                    tv_audio_mode.setText("静音开");
                    sb_ring_audio.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_RING));
                }
            } else {
                audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                iv_audio_mode.setImageResource(R.drawable.ic_silent_mode_0);
                tv_audio_mode.setText("静音关");
                sb_ring_audio.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_RING));
            }
        });


        //设置音量控制变化监听
        sb_media_audio.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
                    setVibrator();
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });


        sb_ring_audio.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    audioManager.setStreamVolume(AudioManager.STREAM_RING, progress, 0);
                    setVibrator();
                }

                if (audioManager.getStreamVolume(AudioManager.STREAM_RING)!=0){
                    switch_mode.setChecked(false);
                    iv_audio_mode.setImageResource(R.drawable.ic_silent_mode_0);
                    tv_audio_mode.setText("静音关");
                }else {
                    switch_mode.setChecked(true);
                    iv_audio_mode.setImageResource(R.drawable.ic_silent_mode_1);
                    tv_audio_mode.setText("静音开");
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });


        //设置音量控制变化监听
        sb_alarm_audio.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    audioManager.setStreamVolume(AudioManager.STREAM_ALARM, progress, 0);
                    setVibrator();
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });


        sb_call_audio.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, progress, 0);
                    setVibrator();
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });

    }


    private void setVibrator() {
        if (vibrator.hasVibrator()) {
            vibrator.vibrate(vibrateLevel);
        } else {
            Toast.makeText(this, "该设备不支持振动功能!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {


        Log.i("萝莉","="+keyCode);

        mediaCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (mediaCurVolume < mediaMaxVolume) {
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaCurVolume + 1, 0);
                    sb_media_audio.setProgress(mediaCurVolume + 1);
                } else {
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaMaxVolume, 0);
                    sb_media_audio.setProgress(mediaMaxVolume);
                }
                setVibrator();
                return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (mediaCurVolume > 0) {
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaCurVolume - 1, 0);
                    sb_media_audio.setProgress(mediaCurVolume - 1);
                } else {
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
                    sb_media_audio.setProgress(0);
                }
                setVibrator();
                return true;
        }
        return super.onKeyDown(keyCode, event);

    }
}

.

案例地址:

  • Gitee地址

.

.

参考资料
  • Android Manager之AudioManager(音频管理器)

  • Android Manager之Vibrator(振动器)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315682.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号