1. 程式人生 > >Android通過SeekBar控制系統音量

Android通過SeekBar控制系統音量

通過SeekBar控制音量大小可以帶來良好的使用者體驗並且直觀地展現當前音量大小。

1.自定義SeekBar樣式

由於系統自帶的SeekBar樣式一般不滿足日常開發需求,所以需要我們去自定義樣式。這裡就簡單做個示例。

首先在Layout中新增SeekBar控制元件。

   <SeekBar
        android:id="@+id/seekBar"
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
android:maxHeight="4dp" android:minHeight="4dp" android:progressDrawable="@drawable/seek_bar_voice_bg" android:thumb="@drawable/seek_bar_voice_circle" />

這裡使用progressDrawable設定SeekBar進度條樣式,使用thumb設定拖動點樣式,具體程式碼如下:

seek_bar_voice_bg

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape> <solid android:color="#65686A" /> </shape> </item> <item android:id="@android:id/secondaryProgress">
<clip> <shape> <solid android:color="#ff51495e" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape> <solid android:color="#2287FE" /> </shape> </clip> </item> </layer-list>

seek_bar_voice_circle

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <solid
        android:color="#FF9A33"
        />

    <size
        android:width="20dp"
        android:height="20dp"/>
</shape>

2.控制系統音量

完成了SeekBar之後我們監聽使用者調節SeekBar的值,然後相對應的去調整系統音量。這裡我們需要用到系統提供的AudioManager。

am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        //獲取系統最大音量
        int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        seekBar.setMax(maxVolume);
        //獲取當前音量
        int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        seekBar.setProgress(currentVolume);

設定SeekBar的最大值和當前值之後,要接聽SeekBar拖動事件。

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(fromUser){
                    //設定系統音量
                    am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
                    int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                    seekBar.setProgress(currentVolume);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

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

3.監聽系統音量變化重新整理SeekBar

當用戶通過物理音量鍵或者其他方式調節系統音量時,我們需要重新整理SeekBar的值。當系統音量發生改變時,會發送android.media.VOLUME_CHANGED_ACTION廣播。因此我們可以定義一個BroadcastReceiver來實現。

  private class VolumeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")){
                int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                seekBar.setProgress(currentVolume);
            }
        }
    }

註冊廣播

 receiver = new VolumeReceiver();
        IntentFilter filter = new IntentFilter() ;
        filter.addAction("android.media.VOLUME_CHANGED_ACTION") ;
        activity.registerReceiver(receiver, filter) ;

最後不要忘了登出廣播

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(volumeReceiver);
    }

4.隱藏系統自帶調節音量控制元件

當我們用物理音量鍵調節音量的時候,會彈出系統自帶的調節音量控制元件,如圖:

這裡寫圖片描述

大多數情況下我們是不希望彈出系統自帶的調節音量控制元件的,因此我們可以監聽物理音量鍵的按鍵事件,然後遮蔽系統自帶的調節音量控制元件,程式碼如下:

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
            am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);
        }else if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
            am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
        }
        return true;
    }

————————————————————————————————————

原始碼地址

相關推薦

Android通過SeekBar控制系統音量

通過SeekBar控制音量大小可以帶來良好的使用者體驗並且直觀地展現當前音量大小。 1.自定義SeekBar樣式 由於系統自帶的SeekBar樣式一般不滿足日常開發需求,所以需要我們去自定義樣式。這裡就簡單做個示例。 首先在Layout中新

通過程式碼調整系統音量,監聽音量實體按鍵事件

儘管AVPlayer和AVPAudiolayer這些類提供了音量調節功能,但這些音量控制屬於App級別的控制。好處就是音量調節獨立於系統音量,調節大小時不會影響系統音量。但有時候我們可能希望修改系統音量,以免在調節聲音的時候,如果系統音量過小,App調節音量效果不明顯。

MFC通過button控制編輯框是否顯示系統時間(動態顯示)

box style public ack span ren item upd 函數 1.在dlg.h中public bool flag; static UINT time(void *param); 2.在構造函數中 flag=fal

Android 通過騰訊OCR來查詢UiAutomator不能識別的控制元件

最近開發了總有同事抱怨UiAutomator有些介面的空間無法識別,以至於部分功能自動化指令碼開發被Block,對此我研究了騰訊之前釋出的一個adbui庫,這個庫是python版的,其中有一個通過ocr的方式來解決UIA開發過程中控制元件不能識別的問題,於是就想把這個功能移植到UIA的公共庫裡面。

通過winform實現電腦音量控制

先上圖 效果圖: 程式碼框架圖: 程式碼實現大致分為兩部分: 1.core audio API實現系統音量的大小控制與靜音,由於是封裝好的函式,操作起來十分簡單。 2.全域性鉤子。因為要實現監聽按鍵,僅適用執行緒鉤子監聽某一個執行緒是不夠的。該部分有難度。

Android 通過程式碼實現控制資料網路的開關(僅適用於5.0以上)

Android 5.0以前使用ConnectivityManager通過反射兩個方法setMobileDataEnabled和getMobileDataEnabled來控制行動網路開和關。  Android 5.0以後使用TelephonyMananger類通過反射獲取setDataEna

Android 通過程式碼實現控制資料網路的開關(僅適用於5.0以上)

Android 5.0以前使用ConnectivityManager通過反射兩個方法setMobileDataEnabled和getMobileDataEnabled來控制行動網路開和關。  Android 5.0以後使用TelephonyMananger類通過反射獲取set

Android自定義控制元件 帶文字提示的SeekBar

轉載請註明出處:juejin.im/post/5c1af0… 本文出自 容華謝後的部落格 1.寫在前面 SeekBar控制元件在開發中還是比較常見的,比如音視訊進度、音量調節等,但是原生控制元件有時還不能滿足我們的需求,今天就來學習一下如何自定義SeekBar控制元件,本文主要實現了一個帶文

Android SeekBar控制元件詳解

SeekBar控制元件詳解 使用 SeekBar 實現圖片的虛幻 註解:圖片虛幻度最大值為255,為實體最小值為0,虛幻值越小,圖片越虛幻。 使用 SeekBar 實現圖

Android通過findViewById()獲取控制元件為NULL

如果在activity中直接呼叫findViewById方法,它的完整形式是this.findViewById().而我所需要的控制元件是不存在本身activity的佈局中的.所以要通過控制元件所在的view呼叫findViewById方法,就可以獲取到正確的控制元件了

Android平臺上,如何通過SecureCRT等終端通過命令控制機頂盒,傳送鍵值

作者:Yogi 福利 想了解買房知識,可以找我的朋友,千里馬(微信:qianlima0068),教你低首付買房。(註明:CSDN的朋友介紹的) 前言:專案中與人合作的時候,遇到問題:客戶沒有來到公司,但是想操作一下Android機頂盒,就是說想遠端操作

android動畫 通過AnimationDrawable控制逐幀動畫

效果圖: 當我們點選按鈕時,該圖片會不停的旋轉,當再次點選按鈕時,會停止在當前的狀態。 activity程式碼: [java] view plain copy print?package cn.com.chenzheng_java.animation;  import android.app.Acti

android-----音樂播放器的音量控制功能(開發)

一、佈局檔案 在RelativeLayout佈局裡設定一個ImageButton,點選其彈出一個SeekBar(用於音量調節), 再在其下面巢狀一個RelativeLayout,裡面包含兩個ImageView元件、一個SeekBar元件。 此外, anim---push_u

android通過style.xml檔案定義相同控制元件的通用屬性

  <style name="DetailsLabel"> <item name="android:shadowColor">#FF000000</item> <item name="android:shadowRadius">

Android使用webview控制元件載入本地html,通過Js與後臺Java實現資料的傳遞

1.在佈局檔案中加WebView控制元件,在java中獲取WebView物件。 2.載入本地html檔案。 3.開啟js功能。         webView.getSettings().setJa

自定義控制元件 設定系統音量時 遮蔽掉系統自帶音量控制

audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioMa

android TV 通過按鍵控制RecyclerView中的item的選中,移動,點選功能

前言 android tv開發中常常會用到recyclerview展示內容,並且要處理好按鍵控制item的選中,移動,點選功能,會遇到失去焦點,recyclerview 獲取childView獲取不到,出現null的問題。下面介紹的一種方法,可以很方便的實現上

Android通過音量鍵調節音量大小

通過程式實現對android系統手機音量的調節 1、獲得系統服務 AudioManager(音訊管理器)了,該類位於Android.Media包下,提供了音量控制與鈴聲模式相關操作!使用Context.getSystemService(Context.AUDIO.SER

Android AudioManager控制系統聲音的流程

首先上層java呼叫 XXXPlayer AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audiomanager就是我們定義的控制

Android通過原始碼編譯apk獲得系統許可權

Android中的應用程式如何獲得系統許可權? 在 android 的 API中有提供 SystemClock.setCurrentTimeMillis()函式來修改系統時間,可惜無論你怎麼呼叫這個函式都是沒用的,無論模擬器還是真 機,在logcat中總會得到"Unable