AudioManager(오디오 관리자)


이 섹션 소개:

멀티미디어의 첫 번째 섹션에서는 SoundPool을 사용하여 Duang의 예를 작성했습니다. 돼지가 버튼을 클릭한 후 갑자기 "Duang" 소리가 들렸습니다. 소리 한 번, 아기가 무서워 죽을 정도로 소리가 커요1.jpg 다행히 근무시간에는 아니어서 몰래 블로그에 글을 써서 매니저에게 알렸어요. 죽겠군요~ 글쎄, 음량에 관해서는 Android에서 제공하는 API(볼륨 조절)를 도입해야 합니다:

AudioManager(오디오 관리자) , 이 클래스는 Android.Media에 있습니다. 패키지에는 볼륨 조절, 벨소리 모드 관련 조작이 제공됩니다! 이 섹션에서는 이 기능을 사용하는 방법에 대해 알아보겠습니다. 짧은 영화를 보기 전에 먼저 간단한 음소거를 작성해 보세요. Demo에 들어가서 음소거를 클릭한 다음 2.gif, 그냥 이야기하세요~ 자, 더 이상 고민하지 말고 이 섹션을 시작하겠습니다!

공식 API 문서: AudioManager


1. AudioManager 객체 인스턴스 가져오기

AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);


2. 에 대한 자세한 설명 method

일반적으로 사용되는 방법:

  • adjustVolume(int 방향, int 플래그): 휴대폰의 볼륨을 제어하고 한 단위씩 위아래로 조정하고 첫 번째 매개변수 AudioManager.ADJUST_LOWER에 따라 판단합니다. AudioManager.ADJUST_RAISE는 한 단위씩 높일 수 있습니다. 한 단위
  • adjustStreamVolume(int streamType , int 방향, int 플래그): 위와 동일하지만 사운드 유형을 조정하도록 선택할 수 있습니다. 1) streamType 매개변수는 사운드 유형을 지정합니다. STREAM_ALARM: 휴대폰 알람 ​ ​ ​ STREAM_MUSIC: 모바일 음악
    STREAM_DTMF: 톤 STREAM_NOTIFICATION: 시스템 프롬프트
    STREAM_VOICE_ 통화 : 음성통화 2) 두 번째 파라미터는 위와 동일하며 볼륨을 높이거나 낮추는 역할을 합니다. 3) AudioManager.FLAG_SHOW_UI, 진행률 표시줄 표시, AudioManager.
    PLAY_SOUND와 같은 선택적 플래그 비트: 사운드 재생setStreamVolume(int streamType, int index, intflags): 볼륨 크기를 직접 설정
  • getMode (): 현재 오디오 모드를 반환합니다.
  • setMode(): 사운드 모드를 설정합니다. 다음과 같은 모드가 있습니다: MODE_NORMAL
  • (일반),
  • MODE_RINGTONE(벨소리), MODE_IN_CALL(전화 통화), MODE_IN_COMMUNICATION(전화)getRingerMode( ): 현재 벨소리 모드를 반환합니다
  • setRingerMode(int streamType): 벨소리 모드 설정 여러 가지 모드가 있습니다: 예: RINGER_MODE_NORMAL
  • (일반),
  • RINGER_MODE_SILENT(음소거), RINGER_MODE_VIBRATE(진동) getStreamVolume(int streamType): 휴대폰의 현재 볼륨을 가져옵니다. 최대값은 7이고 최소값은 0입니다. 0으로 설정하면 자동으로 진동 모드로 조정됩니다
  • getStreamMaxVolume(int streamType): 특정 볼륨의 최대 볼륨 값을 가져옵니다. 전화기의 사운드 유형
  • setStreamMute(int streamType, boolean state): 전화기의 특정 사운드 유형을 음소거로 설정
  • setSpeakerphoneOn(boolean on): 스피커 켜기 여부 설정
  • setMicrophoneMute (boolean on): 마이크 음소거 허용 여부를 설정합니다
  • isMicrophoneMute(): 마이크가 음소거 또는 켜져 있는지 확인
  • isMusicActive(): 음악이 활성 상태인지 확인
  • isWiredHeadsetOn(): 여부 확인 헤드폰이 연결되어 있습니다
  • 다른 방법
  • :
  • abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl): 오디오 포커스 포기
  • adjustSuggestedStreamVolume(int,int presentsStreamType intflags): 가장 관련성이 높은 스트림 또는 지정된 대체 스트림의 볼륨을 조정합니다.
  • getParameters(문자열 키): 오디오 하드웨어에 대해 가변 개수의 매개변수 값을 설정합니다.
  • getVibrateSetting(int vibrateType): 사용자의 진동은 진동 유형으로 설정됩니다.
  • isBluetoothA2dpOn(): A2DP 블루투스 헤드셋 오디오 라우팅이 켜져 있는지 여부를 확인합니다.
  • isBluetoothScoAvailableOffCall(): 현재 플랫폼이 SCO
  • 를 사용하여 통화 외 사용 사례를 지원하는지 표시합니다. isBluetoothScoOn() : 통신에서 Bluetooth SCO
  • loadSoundEffects(): 사운드 효과 로드
  • playSoundEffect((int effectType, float Volume): 사운드 효과 재생
  • egisterMediaButtonEventReceiver(ComponentName eventReceiver): 구성요소의 MEDIA_BUTTON 인텐트
  • requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int DurationHint)의 유일한 수신자를 등록합니다. 오디오 포커스 요청
  • setBluetoothScoOn(boolean on): 통신에 Bluetooth SCO 헤드셋 사용 요청
  • startBluetoothSco/stopBluetoothSco()(): Bluetooth SCO 오디오 연결 시작/중지
  • unloadSoundEffects(): 사운드 언로드 효과

3. 사용 예

헤헤, Bluetooth와 같은 속성이 많이 포함되어 있습니다. 여기서는 가장 일반적인 방법 중 일부만 설명합니다.

이전에 보지 못한 특별한 것들을 발견했다면, 문서를 다시 확인해 보세요!

간단한 예: Mediaplayer를 사용하여 음악을 재생하고 AudioManager를 통해 볼륨과 음소거를 조정하세요!

그나저나 먼저 res 아래에 raw 폴더를 만들고 그 안에 MP3 리소스 파일을 넣으세요!

렌더링 실행:

3.gif

코드 구현:

레이아웃 코드activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:enabled="false"
        android:text="停止" />

    <Button
        android:id="@+id/btn_higher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调高音量" />

    <Button
        android:id="@+id/btn_lower"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调低音量" />

    <Button
        android:id="@+id/btn_quite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="静音" /></LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_start;
    private Button btn_stop;
    private Button btn_higher;
    private Button btn_lower;
    private Button btn_quite;
    private MediaPlayer mePlayer;
    private AudioManager aManager;
    //定义一个标志用来标示是否点击了静音按钮
    private int flag = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得系统的音频对象
        aManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
        //初始化mediaplayer对象,这里播放的是raw文件中的mp3资源
        mePlayer = MediaPlayer.create(MainActivity.this, R.raw.countingstars);
        //设置循环播放:
        mePlayer.setLooping(true);
        bindViews();
    }

    private void bindViews() {
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_stop = (Button) findViewById(R.id.btn_stop);
        btn_higher = (Button) findViewById(R.id.btn_higher);
        btn_lower = (Button) findViewById(R.id.btn_lower);
        btn_quite = (Button) findViewById(R.id.btn_quite);

        btn_start.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
        btn_higher.setOnClickListener(this);
        btn_lower.setOnClickListener(this);
        btn_quite.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                btn_stop.setEnabled(true);
                mePlayer.start();
                btn_start.setEnabled(false);
                break;
            case R.id.btn_stop:
                btn_start.setEnabled(true);
                mePlayer.pause();
                btn_stop.setEnabled(false);
                break;
            case R.id.btn_higher:
                // 指定调节音乐的音频,增大音量,而且显示音量图形示意
                aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
                break;
            case R.id.btn_lower:
                // 指定调节音乐的音频,降低音量,只有声音,不显示图形条
                aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);
                break;
            case R.id.btn_quite:
                // 指定调节音乐的音频,根据isChecked确定是否需要静音
                flag *= -1;
                if (flag == -1) {
                    aManager.setStreamMute(AudioManager.STREAM_MUSIC, true);   //API 23过期- -
//                    aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE,
//                            AudioManager.FLAG_SHOW_UI);   //23以后的版本用这个
                    btn_quite.setText("取消静音");
                } else {
                    aManager.setStreamMute(AudioManager.STREAM_MUSIC, false);//API 23过期- -
//                    aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE,
//                            AudioManager.FLAG_SHOW_UI);  //23以后的版本用这个
                    aManager.setMicrophoneMute(false);
                    btn_quite.setText("静音");
                }
                break;
        }
    }
}

코드는 다음과 같습니다. 여전히 매우 간단합니다. 예, 추가로 설정합니다. mute setStreamMute() 메서드는 API 버전 23에서 만료되었습니다. 다른 메서드인 adjustStreamVolume(int, int, int)을 사용한 다음 세 번째 속성인

ADJUST_MUTE 또는 ADJUST_UNMUTE을 설정할 수 있습니다!

그런데 다음도 있습니다:

adjustStreamVolume()의 세 번째 매개변수에 진동(진동기)을 설정하면, AndroidManifest.xml에 이 권한을 추가해야 합니다!

<**uses-permission android:name="android.permission.VIBRATE"**/>

4. 코드 샘플 다운로드

AudioManagerDemo.zip


이 섹션 요약:

좋아요, 이 섹션에서는 볼륨을 조정하기 위한 AudioManager의 간단한 사용법을 보여줍니다. 이 유형은 작성자가 일반적으로 사용하지 않습니다. 자, 앞으로 얻을 수 있는 새로운 스킬이 있다면 추가해주세요~ 헤헤, 뮤트 데모 작성은 끝났나요? 실제 요구 사항과 결합해야 합니다~4.gif

게다가 이번 주에는 회사의 WebSocket 라이브러리가 교체되므로 블로그가 너무 자주 업데이트되지 않을 수 있습니다. 알았어 그게 다야 고마워~