AudioManager 修改系统Android系统的音量

文章出处:http://blog.csdn.net/chuchu521/article/details/7848706

 

AudioManager可以修改系统Android系统的音量

下面介绍几个AudioManager的几个音量调整方面的方法.

首先是得到AudioManager实例:

AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

调整音量方法有两种,一种是渐进式,即像手动按音量键一样,一步一步增加或减少,另一种是直接设置音量值.

1、渐进式

  1. public void adjustStreamVolume (int streamType, int direction, int flags)
  2. am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);

解释一下三个参数

  1. 第一个streamType是需要调整音量的类型,这里设的是媒体音量,可以是:
  2. STREAM_ALARM 警报
  3. STREAM_MUSIC 音乐回放即媒体音量
  4. STREAM_NOTIFICATION 窗口顶部状态栏Notification,
  5. STREAM_RING 铃声
  6. STREAM_SYSTEM 系统
  7. STREAM_VOICE_CALL 通话
  8. STREAM_DTMF 双音多频,不是很明白什么东西
  9. 第二个direction,是调整的方向,增加或减少,可以是:
  10. ADJUST_LOWER 降低音量
  11. ADJUST_RAISE 升高音量
  12. ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量
  13. 第三个flags是一些附加参数,只介绍两个常用的
  14. FLAG_PLAY_SOUND 调整音量时播放声音
  15. FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个

2、直接设置音量值的方法:

  1. public void setStreamVolume (int streamType, int index, int flags)
  2. am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND);
  3. am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的最大值
  4. am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的当前值

第一个和第三个参数与上面的相同

第二个参数是一个音量的int值,getStreamMaxVolume(int streamType)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.

最后我的代码:

  1. package com.lp;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import Android.app.Activity;
  8. import Android.content.Context;
  9. import Android.media.AudioFormat;
  10. import Android.media.AudioManager;
  11. import Android.media.AudioTrack;
  12. import Android.os.Bundle;
  13. import Android.view.View;
  14. import Android.view.View.OnClickListener;
  15. import Android.widget.Button;
  16. import Android.widget.SeekBar;
  17. /**
  18. * AudioTrack 播放音频 如wav格式
  19. * 并允许调节音量
  20. * @author Administrator
  21. *
  22. */
  23. public class MainActivity5 extends Activity {
  24. private Button play;
  25. private Button stop;
  26. private SeekBar soundValue;
  27. private AudioTrack at;
  28. private AudioManager am;
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.main_sk);
  33. am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
  34. play = (Button)findViewById(R.id.main_sk_play);
  35. stop = (Button)findViewById(R.id.main_sk_stop);
  36. soundValue = (SeekBar)findViewById(R.id.skbVolume);
  37. setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
  38. play.setOnClickListener(new OnClickListener() {
  39. @Override
  40. public void onClick(View v) {
  41. if(am.isSpeakerphoneOn()){
  42. am.setSpeakerphoneOn(false);
  43. }
  44. //setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
  45. am.setMode(AudioManager.MODE_IN_CALL);
  46. System.out.println(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));
  47. System.out.println("&&&&&&&&&&&&&");
  48. System.out.println(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL));
  49. //am.setStreamVolume(streamType, index, flags)
  50. int bufferSizeInBytes = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
  51. if(at==null){
  52. at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
  53. System.out.println("22222");
  54. //at.setStereoVolume(100f, 100f);
  55. at.setStereoVolume(0.7f, 0.7f);//设置当前音量大小
  56. new AudioTrackThread().start();
  57. }else{
  58. if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
  59. System.out.println("111111111");
  60. }else{
  61. System.out.println("33333");
  62. at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
  63. new AudioTrackThread().start();
  64. }
  65. }
  66. }
  67. });
  68. stop.setOnClickListener(new OnClickListener() {
  69. @Override
  70. public void onClick(View v) {
  71. if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
  72. try{
  73. at.stop();
  74. }catch (IllegalStateException e)
  75. {
  76. e.printStackTrace();
  77. }
  78. at.release();
  79. am.setMode(AudioManager.MODE_NORMAL);
  80. }
  81. }
  82. });
  83. // soundValue.setMax(100);//音量调节的极限
  84. // soundValue.setProgress(70);//设置seekbar的位置值
  85. soundValue.setMax(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));
  86. soundValue.setProgress(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL));
  87. soundValue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  88. @Override
  89. public void onStopTrackingTouch(SeekBar seekBar) {
  90. // float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());
  91. // System.out.println(vol);
  92. // at.setStereoVolume(vol, vol);//设置音量
  93. am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, seekBar.getProgress(), AudioManager.FLAG_PLAY_SOUND);
  94. }
  95. @Override
  96. public void onStartTrackingTouch(SeekBar seekBar) {
  97. // TODO Auto-generated method stub
  98. }
  99. @Override
  100. public void onProgressChanged(SeekBar seekBar, int progress,
  101. boolean fromUser) {
  102. // TODO Auto-generated method stub
  103. }
  104. });
  105. }
  106. class AudioTrackThread extends Thread{
  107. @Override
  108. public void run() {
  109. byte[] out_bytes = new byte[44100];
  110. InputStream is = getResources().openRawResource(R.raw.start);
  111. int length ;
  112. try{
  113. at.play();
  114. }catch (IllegalStateException e)
  115. {
  116. e.printStackTrace();
  117. }
  118. try {
  119. while((length = is.read(out_bytes))!=-1){
  120. //System.out.println(length);
  121. at.write(out_bytes, 0, length);
  122. }
  123. } catch (IOException e) {
  124. e.printStackTrace();
  125. }
  126. if(at.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
  127. try{
  128. at.stop();
  129. }catch (IllegalStateException e)
  130. {
  131. e.printStackTrace();
  132. }
  133. at.release();
  134. am.setMode(AudioManager.MODE_NORMAL);
  135. }
  136. }
  137. }
  138. }

当然 权限

  1. <uses-permission Android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  2. <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission Android:name="android.permission.RECORD_AUDIO" />

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值