iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Mobile Development

android studio 30天 精華筆記系列 第 12

精華筆記 Day 12 - 手機音量(AUDIO)

  • 分享至 

  • xImage
  •  

很常在音樂撥放軟體可以看到調整音量功能,透過seekBar即可拉動調整音量大小,那麼是怎麼做到的呢?今天就來跟各位介紹一下,如何在APP內監控到手機音量。

  1. UI(XML檔)
<?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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="聲音調整"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.103" />

    <SeekBar
        android:id="@+id/music_seekBar"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/guideline2"
        app:layout_constraintEnd_toStartOf="@+id/guideline9"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline3"
        app:layout_constraintVertical_bias="1.0" />


    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.25" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.2" />

    <Button
        android:id="@+id/up_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Up"
        app:layout_constraintEnd_toStartOf="@+id/guideline7"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline8" />

    <Button
        android:id="@+id/down_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Down"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.54"
        app:layout_constraintStart_toStartOf="@+id/guideline7"
        app:layout_constraintTop_toTopOf="@+id/guideline8" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/guideline2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/music_seekBar"
        app:layout_constraintTop_toTopOf="@+id/guideline3"
        app:srcCompat="@drawable/ic_baseline_music_note_24" />

</androidx.constraintlayout.widget.ConstraintLayout>

準備好以上就可以開始設定拉~

  1. 獲取AudioManager
//取得AudioManager
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
  1. 初始化音量
private void initSeekBarVolume() {
    //取得目前及最大音量
    //STREAM_MUSIC(音樂)
    //最大聲
    int mMusicMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    //目前聲音
    int mMusicCurrentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    music_seekBar.setMax(mMusicMaxVolume);
    music_seekBar.setProgress(mMusicCurrentVolume);
}

透過AudioManager.STREAM_MUSIC可以獲取有關音樂大小的調整,如果有別的需求也可以選擇不同的類型,如下。

  • STREAM_MUSIC(音樂)
  • STREAM_VOICE_CALL(電話)
  • STREAM_ALARM(鬧鐘)
  • STREAM_RING(鈴聲)

記得每種類型的MaxVolume可能不太一樣,需要注意一下,不然設定錯誤時,調整起來會很奇怪喔。

  1. 設定seekBar
//STREAM_MUSIC(音樂)
music_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    //滑動時
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
                        progress,AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
    }
    //觸碰到seekBar時
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }
    //停止移動seekBar時
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

其中setStreamVolume()包含了flag設定,常見flag如下。

  • AudioManager.FLAG_PLAY_SOUND :改變音量時撥出聲音。
  • AudioManager.FLAG_SHOW_UI:顯示音量調節UI。
  • FLAG_VIBRATE:如果進入振動鈴聲模式,是否振動。
  1. 按鈕調節音量
//向上調節
up_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC
                                ,AudioManager.ADJUST_RAISE,AudioManager.FLAG_PLAY_SOUND);
            initSeekBarVolume();
        }
    });
    //向下調節
down_btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {  
        audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC
                        ,AudioManager.ADJUST_LOWER,AudioManager.FLAG_PLAY_SOUND);
        initSeekBarVolume();
    }
});

adjustStreamVolume()可以直接調節音量,帶入參數分別為(類型,調整方向,Flag標籤)。

以上就完成了調節音量的功能拉,希望有幫助到想要自己製作音約撥放或相關app的同學~


上一篇
精華筆記 Day11 -- Vibrator、MediaPlayer
下一篇
精華筆記 Day13-- QRcode
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言