天天看点

android音量条——AudioManager和SeekBar应用android音量条——AudioManager和SeekBar应用

android音量条——AudioManager和SeekBar应用

本文分为以下几部分:

  • java代码
  • XML布局
  • 运行效果
  • AudioManager类
  • SeekBar

代码

XML代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.administrator.voice.MainActivity">
    <TextView
        android:id="@+id/vioce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <SeekBar

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/vioce"
        android:layout_marginTop="68dp"
        android:id="@+id/seekBar"
        android:layout_alignParentStart="true" />
</RelativeLayout>
           

MainActivity的代码:

public class MainActivity extends AppCompatActivity {
    private SeekBar SoundseekBar;
    private AudioManager audioManager;
    private TextView vioce;
    private MyVolumeReceiver mVolumeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);//获取AudioManager服务
        audioManager.setMode(AudioManager.RINGER_MODE_NORMAL);//设置声音模式
        SoundseekBar = (SeekBar) findViewById(R.id.seekBar);
        vioce = (TextView) findViewById(R.id.vioce);
        int MaxSound = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//获取系统音量最大值
        int viocesize = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);//获取当前系统音量
        SoundseekBar.setMax(MaxSound);//设置进度条的最大值
        SoundseekBar.setProgress(viocesize);/设置进度条滑块的初始值
        vioce.setText(String.valueOf(viocesize));//显示当前的音量值
        //设置监听
        SoundseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser) {
                    int SeekPosition = seekBar.getProgress();
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, SeekPosition, );
                }
                vioce.setText(String.valueOf(progress));

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        myRegisterReceiver();//接收广播
    }
    private void myRegisterReceiver() {
        mVolumeReceiver = new MyVolumeReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.media.VOLUME_CHANGED_ACTION");
        registerReceiver(mVolumeReceiver, filter);
    }
//接收系统音量改变的广播
    private class MyVolumeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //如果音量发生变化则更改seekbar的位置
            if (intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")) {
                int currVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 当前的媒体音量
                SoundseekBar.setProgress(currVolume);
            }
        }
    }
}

           

运行效果图

android音量条——AudioManager和SeekBar应用android音量条——AudioManager和SeekBar应用

运行出来的效果是这样。

AudioManager类

AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作

以下分别是AudioManager设置声音模式和调整声音大小的方法。

如何获取声音管理器:

AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

里面主要的方法:

A、设置声音模式

//声音模式

AudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

//静音模式

AudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

//震动模式

AudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);

B、调整声音大小

//减少声音音量

AudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0);

//调大声音音量

AudioManager.adjustVolume(AudioManager.ADJUST_RAISE, 0);

(当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。)

getMode()获取音频模式

getRingerMode()获取铃声震动模式

AudioManager

public void setStreamMute (int streamType, boolean state)

静音或不静音音频流。

静音命令被保护以免客户端进程死亡:若具有流上的活动静音请求的进程死亡,这个流会自动取消静音。

对于给定的流,静音请求是累计的:AudioManager会从一个或多个客户端接收数个静音请求,只有当接收到相同数目的取消静音请求时流才会取消静音。

为了更好的用户体验,应该程序必须在onPause()中取消已静音流,若合适在onResume()中再次静音

这个方法只能用于代替音频设置的平台范围管理应用程序或主要电话应用程序。

参数

streamType 欲静音/取消静音的流。

state 请求静音状态:若为true,静音;若为false,取消静音。

常见的方法和参数的含义

方法:adjustStreamVolume(int streamType, int direction, int flags)

streamType为铃声类型,例如:AudioManager.STREAM_VOICE_CALL、AudioManager.STREAM_SYSTEM等,direction当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入 AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。flags为标志位。

方法:getMode()

解释:返回当前音频模式。例如:MODE_NORMAL, MODE_RINGTONE, MODE_IN_CALL or MODE_IN_COMMUNICATION

方法:getRingerMode()

解释:返回当前的铃声模式。例如 RINGER_MODE_NORMAL, RINGER_MODE_SILENT, or RINGER_MODE_VIBRATE.

方法:getStreamVolume(int streamType)

解释:取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。

方法:setStreamVolume(int streamType, int index, int flags)

解释:改变铃声音量,解释同1,index为声音大小。

方法:setMode(int mode)

解释:改变音频模式。见get方法

方法:setRingerMode(int ringerMode)

解释:改变铃声模式。见get方法

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 调整时显示音量条,就是按音量键出现的界面

FLAG_REMOVE_SOUND_AND_VIBRATE 无振动无声音

FLAG_ALLOW_RINGER_MODES Whether to include ringer modes as possible options when changing volume.

FLAG_VIBRATE Whether to vibrate if going into the vibrate ringer mode

SeekBar

@Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            // 触发操作,拖动
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
         // 表示进度条刚开始拖动,开始拖动时候触发的操作
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
         // 停止拖动时候
        }
           

最后

=,=就这些了。。。