Android使用AudioManager修改系統(tǒng)音量的方法
本文實例講述了Android使用AudioManager修改系統(tǒng)音量的方法。分享給大家供大家參考,具體如下:
下面介紹幾個AudioManager的幾個音量調(diào)整方面的方法.
首先是得到AudioManager實例:
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
調(diào)整音量方法有兩種,一種是漸進式,即像手動按音量鍵一樣,一步一步增加或減少,另一種是直接設(shè)置音量值.
1、漸進式
public void adjustStreamVolume (int streamType, int direction, int flags) am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
解釋一下三個參數(shù)
第一個streamType是需要調(diào)整音量的類型,這里設(shè)的是媒體音量,可以是:
STREAM_ALARM 警報
STREAM_MUSIC 音樂回放即媒體音量
STREAM_NOTIFICATION 窗口頂部狀態(tài)欄Notification,
STREAM_RING 鈴聲
STREAM_SYSTEM 系統(tǒng)
STREAM_VOICE_CALL 通話
STREAM_DTMF 雙音多頻,不是很明白什么東西
第二個direction,是調(diào)整的方向,增加或減少,可以是:
ADJUST_LOWER 降低音量
ADJUST_RAISE 升高音量
ADJUST_SAME 保持不變,這個主要用于向用戶展示當前的音量
第三個flags是一些附加參數(shù),只介紹兩個常用的
FLAG_PLAY_SOUND 調(diào)整音量時播放聲音
FLAG_SHOW_UI 調(diào)整時顯示音量條,就是按音量鍵出現(xiàn)的那個
2、直接設(shè)置音量值的方法:
public void setStreamVolume (int streamType, int index, int flags) am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND); am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);//得到聽筒模式的最大值 am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);//得到聽筒模式的當前值
第一個和第三個參數(shù)與上面的相同
第二個參數(shù)是一個音量的int值,getStreamMaxVolume(int streamType)得到的是該類型音量的最大值,可以根據(jù)這個值計算你需要的音量,我這里直接調(diào)到最大.
最后我的代碼:
package com.lp; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import Android.app.Activity; import Android.content.Context; import Android.media.AudioFormat; import Android.media.AudioManager; import Android.media.AudioTrack; import Android.os.Bundle; import Android.view.View; import Android.view.View.OnClickListener; import Android.widget.Button; import Android.widget.SeekBar; /** * AudioTrack 播放音頻 如wav格式 * 并允許調(diào)節(jié)音量 * @author Administrator * */ public class MainActivity5 extends Activity { private Button play; private Button stop; private SeekBar soundValue; private AudioTrack at; private AudioManager am; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_sk); am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); play = (Button)findViewById(R.id.main_sk_play); stop = (Button)findViewById(R.id.main_sk_stop); soundValue = (SeekBar)findViewById(R.id.skbVolume); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(am.isSpeakerphoneOn()){ am.setSpeakerphoneOn(false); } //setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); am.setMode(AudioManager.MODE_IN_CALL); System.out.println(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL)); System.out.println("&&&&&&&&&&&&&"); System.out.println(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL)); //am.setStreamVolume(streamType, index, flags) int bufferSizeInBytes = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); if(at==null){ at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM); System.out.println("22222"); //at.setStereoVolume(100f, 100f); at.setStereoVolume(0.7f, 0.7f);//設(shè)置當前音量大小 new AudioTrackThread().start(); }else{ if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){ System.out.println("111111111"); }else{ System.out.println("33333"); at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM); new AudioTrackThread().start(); } } } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){ try{ at.stop(); }catch (IllegalStateException e) { e.printStackTrace(); } at.release(); am.setMode(AudioManager.MODE_NORMAL); } } }); // soundValue.setMax(100);//音量調(diào)節(jié)的極限 // soundValue.setProgress(70);//設(shè)置seekbar的位置值 soundValue.setMax(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL)); soundValue.setProgress(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL)); soundValue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax()); // System.out.println(vol); // at.setStereoVolume(vol, vol);//設(shè)置音量 am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, seekBar.getProgress(), AudioManager.FLAG_PLAY_SOUND); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub } }); } class AudioTrackThread extends Thread{ @Override public void run() { byte[] out_bytes = new byte[44100]; InputStream is = getResources().openRawResource(R.raw.start); int length ; try{ at.play(); }catch (IllegalStateException e) { e.printStackTrace(); } try { while((length = is.read(out_bytes))!=-1){ //System.out.println(length); at.write(out_bytes, 0, length); } } catch (IOException e) { e.printStackTrace(); } if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){ try{ at.stop(); }catch (IllegalStateException e) { e.printStackTrace(); } at.release(); am.setMode(AudioManager.MODE_NORMAL); } } } }
當然還要設(shè)置權(quán)限
<uses-permission Android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission Android:name="android.permission.RECORD_AUDIO" />
PS:關(guān)于Android Manifest功能與權(quán)限設(shè)置詳細內(nèi)容可參考本站在線工具:
Android Manifest功能與權(quán)限描述大全:
http://tools.jb51.net/table/AndroidManifest
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android操作SQLite數(shù)據(jù)庫技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進階教程》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android 藍牙連接 ESC/POS 熱敏打印機打印實例(ESC/POS指令篇)
這篇文章主要介紹了Android 藍牙連接 ESC/POS 熱敏打印機打印實例(ESC/POS指令篇),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04Android開發(fā)實現(xiàn)調(diào)節(jié)屏幕亮度功能
這篇文章主要介紹了Android開發(fā)實現(xiàn)調(diào)節(jié)屏幕亮度功能,涉及Android權(quán)限控制及屏幕亮度相關(guān)屬性操作技巧,需要的朋友可以參考下2018-03-03Android?ViewPager2?+?Fragment?聯(lián)動效果的實現(xiàn)思路
這篇文章主要介紹了Android?ViewPager2?+?Fragment?聯(lián)動,本篇主要介紹一下 ViewPager2 + Fragment聯(lián)動效果的實現(xiàn)思路,需要的朋友可以參考下2022-12-12