栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android使用AudioManager修改系统音量的方法

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android使用AudioManager修改系统音量的方法

本文实例讲述了Android使用AudioManager修改系统音量的方法。分享给大家供大家参考,具体如下:

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

首先是得到AudioManager实例:

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

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

1、渐进式

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

解释一下三个参数

第一个streamType是需要调整音量的类型,这里设的是媒体音量,可以是:

STREAM_ALARM 警报
STREAM_MUSIC 音乐回放即媒体音量
STREAM_NOTIFICATION 窗口顶部状态栏Notification,
STREAM_RING 铃声
STREAM_SYSTEM 系统
STREAM_VOICE_CALL 通话
STREAM_DTMF 双音多频,不是很明白什么东西

第二个direction,是调整的方向,增加或减少,可以是:

ADJUST_LOWER 降低音量
ADJUST_RAISE 升高音量
ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量

第三个flags是一些附加参数,只介绍两个常用的

FLAG_PLAY_SOUND 调整音量时播放声音
FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个

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

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);//得到听筒模式的当前值

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

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

最后我的代码:

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;

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);//设置当前音量大小
   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);//音量调节的极限
//    soundValue.setProgress(70);//设置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);//设置音量
 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);
      }
    }
  }
}

当然还要设置权限


  
  

PS:关于Android Manifest功能与权限设置详细内容可参考本站在线工具:

Android Manifest功能与权限描述大全:

http://tools.jb51.net/table/AndroidManifest

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/161756.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号