基于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中注册权限

<!-- 授予程序访问振动器的权限 -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />

.

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. 布局代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:id="@+id/container_ball_menu_detail_voice"
        android:layout_width="240dp"
        android:layout_height="240dp"
        android:background="@drawable/shape_react_corners_top_menu_bg"
        android:padding="3dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf=
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值