IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 基于AudioManager实现的音频控制器 -> 正文阅读

[移动开发]基于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="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:id="@+id/container_ball_menu_detail_voice_content"
            android:layout_width="240dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingStart="10dp">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1">

                <ImageView
                    android:id="@+id/iv_audio_mode"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignTop="@id/switch_mode"
                    android:layout_alignBottom="@id/switch_mode"
                    android:layout_alignParentLeft="true"
                    android:layout_centerVertical="true"
                    android:gravity="center_vertical"
                    android:src="@drawable/ic_silent_mode_0" />

                <TextView
                    android:id="@+id/tv_audio_mode"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignTop="@id/iv_audio_mode"
                    android:layout_alignBottom="@id/iv_audio_mode"
                    android:layout_centerVertical="true"
                    android:layout_toRightOf="@id/iv_audio_mode"
                    android:gravity="center_vertical"
                    android:src="@drawable/ic_notifications"
                    android:text="静音关"
                    android:textColor="#ffffff" />

                <Switch
                    android:id="@+id/switch_mode"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:layout_centerVertical="true"
                    android:paddingEnd="5dp"
                    tools:ignore="UseSwitchCompatOrMaterialXml" />

            </RelativeLayout>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="2">

                <ImageView
                    android:id="@+id/iv_audio_media"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:src="@drawable/ic_media" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_toRightOf="@id/iv_audio_media"
                    android:orientation="vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="媒体"
                        android:textColor="@color/colorWhite" />

                    <SeekBar
                        android:id="@+id/sb_media_audio"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>
            </RelativeLayout>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="2">

                <ImageView
                    android:id="@+id/iv_audio_ring"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:src="@drawable/ic_notifications" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_toRightOf="@id/iv_audio_ring"
                    android:orientation="vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="铃声"
                        android:textColor="@color/colorWhite" />

                    <SeekBar
                        android:id="@+id/sb_ring_audio"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>
            </RelativeLayout>


            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="2">

                <ImageView
                    android:id="@+id/iv_audio_alarm"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:src="@drawable/ic_alarm" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_toRightOf="@id/iv_audio_alarm"
                    android:orientation="vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="闹钟"
                        android:textColor="@color/colorWhite" />

                    <SeekBar
                        android:id="@+id/sb_alarm_audio"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>
            </RelativeLayout>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="2">

                <ImageView
                    android:id="@+id/iv_audio_call"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:src="@drawable/ic_audio_call" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_toRightOf="@id/iv_audio_call"
                    android:orientation="vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="通话"
                        android:textColor="@color/colorWhite" />

                    <SeekBar
                        android:id="@+id/sb_call_audio"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>
            </RelativeLayout>
        </LinearLayout>
    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

.

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);

    }
}

.

案例地址:

.

.

参考资料

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:38:03  更:2021-10-11 17:39:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:52:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码