`

关于安卓系统媒体音量设置

 
阅读更多

本篇基于 Android API 中的 AudioManager 作讲述,使看过本篇的读者可以迅速的掌握这个类的实现过程。下面是本篇大纲:

  * 1、认识 AudioManager
  * 2、AudioManager 主要方法介绍
  * 3、程序逻辑实现过程

  1、认识 AudioManager
       AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作。
  2、AudioManager 主要方法介绍
  由于 AudioManager 该类方法过多,这里只讲述几个比较常用到的方法:
       * 方法:adjustVolume(int direction, int flags)
  解释:这个方法用来控制手机音量大小,当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入 AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。
  * 方法:getMode()
  解释:返回当前音频模式。
  * 方法:getRingerMode()
  解释:返回当前的铃声模式。
  * 方法:getStreamVolume(int streamType)
  解释:取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。
  * 方法:setRingerMode(int ringerMode)
  解释:改变铃声模式

  3、程序逻辑实现过程
  界面上设置了一个图片,表示当前铃声状态,一个进度条表示当前音量大小,五个图片按钮,用来表示增加/减小音量、普通模式、静音模式和震动模式。下面是界面的 XML 布局代码:

Java代码:

 程序类分别为:

  1、viewHolder
  界面上的所有控件和元素都在这里静态声明


package eoe.terry;



import android.media.AudioManager;

import android.widget.ImageButton;

import android.widget.ImageView;

import android.widget.ProgressBar;



public class viewHolder {

public static ImageButton downButton;

public static ImageButton upButton;

public static ImageButton normalButton;

public static ImageButton muteButton;

public static ImageButton vibrateButton;

public static ProgressBar myProgressBar;

public static ImageView myImageView;

public static AudioManager audiomanage;



}

 2、AudioManagerActivity

  程序入口处,和主要逻辑代码的处理,程序开头以 (AudioManager)getSystemService(AUDIO_SERVICE); 取得 AudioManager 对象。然后再利用该对象来对铃声进行调整。声明了一个返回 ImageButton 的方法,用来处理各自按钮点击所执行的不同事件和对图片的状态进行调整设置。以下把代码提供给大家:

Java代码:

package eoe.terry;



import android.app.Activity;

import android.media.AudioManager;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageButton;

import android.widget.ImageView;

import android.widget.ProgressBar;



public class AudioManagerActivity extends Activity {

//音量变量

private int volume=0;

//声音模式

private int mode;



@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

findview();

//通过getStreamVolume 获得当前音量大小

volume=viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING);

//把当前音量的值 设置给进度条

viewHolder.myProgressBar.setProgress(volume);

//得到当前的声音模式

mode=viewHolder.audiomanage.getRingerMode();

setImageState();

viewHolder.downButton=btnListener(viewHolder.downButton);

viewHolder.upButton=btnListener(viewHolder.upButton);

viewHolder.muteButton=btnListener(viewHolder.muteButton);

viewHolder.normalButton=btnListener(viewHolder.normalButton);

viewHolder.vibrateButton=btnListener(viewHolder.vibrateButton);

}



//找到控件

void findview(){

viewHolder.downButton=(ImageButton)findViewById(R.id.downButton);

viewHolder.upButton=(ImageButton)findViewById(R.id.upButton);

viewHolder.muteButton=(ImageButton)findViewById(R.id.muteButton);

viewHolder.normalButton=(ImageButton)findViewById(R.id.normalButton);

viewHolder.vibrateButton=(ImageButton)findViewById(R.id.vibrateButton);

viewHolder.myImageView=(ImageView)findViewById(R.id.myImage);

viewHolder.myProgressBar=(ProgressBar)findViewById(R.id.myProgress);

viewHolder.audiomanage=(AudioManager)getSystemService(AUDIO_SERVICE);

}



//按钮 的单击事件

ImageButton btnListener(ImageButton b){

b.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.downButton:

viewHolder.audiomanage.adjustVolume(AudioManager.ADJUST_LOWER, 0);

volume=viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING);

viewHolder.myProgressBar.setProgress(volume);

mode=viewHolder.audiomanage.getRingerMode();

setImageState();

break;

case R.id.upButton:

viewHolder.audiomanage.adjustVolume(AudioManager.ADJUST_RAISE, 0);

volume=viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING);

viewHolder.myProgressBar.setProgress(volume);

mode=viewHolder.audiomanage.getRingerMode();

setImageState();

break;

case R.id.muteButton:

viewHolder.audiomanage.setRingerMode(AudioManager.RINGER_MODE_SILENT);

volume=viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING);

viewHolder.myProgressBar.setProgress(volume);

viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.mute));

break;

case R.id.normalButton:

viewHolder.audiomanage.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

volume=viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING);

viewHolder.myProgressBar.setProgress(volume);

viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.normal));

break;

case R.id.vibrateButton:

viewHolder.audiomanage.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);

volume=viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING);

viewHolder.myProgressBar.setProgress(volume);

viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.vibrate));

break;

}

}



});



return b;

}

//设置图片状态

void setImageState(){

if(mode==AudioManager.RINGER_MODE_NORMAL){

viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.normal));

}

else if(mode==AudioManager.RINGER_MODE_SILENT){

viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.mute));

}

else if(mode==AudioManager.RINGER_MODE_VIBRATE){

viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.vibrate));

}



}



}

 识别音频流

创造优秀音频体验的第一步是了解您的应用程序将使用的音频流类型。
Android 系统保持相互独立的音频流通道来播放音乐,报警,通知,来电铃声,系统声音,呼叫(通话)音量,和 DTMF 音调(键盘拨号)。
这样做主要是为了使用户能够独立地控制每个流的音量。
多数的流仅限于系统事件,所以,除非您的应用程序是要更换闹钟,否则几乎可以肯定的是使用 STREAM_MUSIC 音频流。

使用硬件音量按键来控制应用程序的音量

默认情况下,按音量键控制修改当前获得焦点的音频流的音量。假如您的应用程序当前不是正在播放音乐,或者没有运行,那么音量键将会调整振铃的音量。
如果您有一个游戏或音乐应用程序,当用户点击音量键的时候,即使他们目前正在浏览歌曲,或者没有停留在当前的音乐游戏的位置,他们仍然希望控制游戏或音乐的音量。
您可以通过接收音量控制键的按键消息来修改当前的音频流音量。不过不用那么麻烦,Android 已经提供了方便的 setVolumeControlStream() 方法来根据您指定的音频流来自动调节音量。
首先确定您的应用程序将使用的音频流,然后通过 setVolumeControlStream 方法设置其为当前焦点的音频流。
这个方法应该被及早调用,并且在生命周期中只需要调用一次即可,所以通常应在 Activity或者 Fragment 的 OnCreate() 内 调用。
这将确保只要你的应用程序是可见状态的,音量控制功能就是用户所期望的效果(即控制当前应用程序的音量)。
代码示例:
setVolumeControlStream(AudioManager.STREAM_MUSIC);   

 

从现在开始,按设备上的音量键将影响您指定的(示例“音乐”)的音频流。

使用硬件播放控制按键来控制应用程序的音频播放

很多手机和许多无线耳机都附带有媒体播放控制按钮,如播放,暂停,停止,跳过。每当用户按下这些硬件键,系统就会广播 ACTION_MEDIA_BUTTON  动作。
为了响应媒体按钮的点击事件,您需要注册 BroadcastReceiver 来监听广播。
代码示例:
<receiver android:name=".RemoteControlReceiver"> 

  <intent-filter> 

     <action android:name="android.intent.action.MEDIA_BUTTON"   /> 

  </intent-filter> 

</receiver> 

 

Receiver 中需要知道到底是按下了哪个键的具体信息,Intent 中包括了 EXTRA_KEY_EVENT键值,可以通过它来取得KeyEvent 类型的值 ,KeyEvent中的KEYCODE_MEDIA_*静态常量表示了所有的媒体按钮类型,如 KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT 等等。
代码示例:
public class RemoteControlReceiver extends BroadcastReceiver { 

  @Override 

  public void onReceive(Context context, Intent intent) { 

    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 

      KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

      if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { 

        // Handle key press. 

        // 处理播放按键的消息 

      } 

   } 

} 

} 

 

因为多个应用程序可能会接听和响应媒体按键消息,您必须以编程方式控制您的应用程序何时应该接受媒体按钮事件。
在您的应用程序中可以使用 AudioManager  来注册和取消注册媒体按钮的事件接收器,注册时,使用您的专用事件接收器。
示例代码:
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);

...

// Start listening for button presses 开始 监 听

am.registerMediaButtonEventReceiver(RemoteControlReceiver);

...

// Stop listening for button presses 取消 监 听

am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); 

 

通常情况下,应用程序在失去焦点或不在屏幕显示隐藏到后台的时候,应注销其大部分的接听器(如在 onStop() 回调函数中) 。
然而,对于媒体播放应用程序却没有这么简单,事实上,最重要的是,当您的应用程序是处于不可见的状态时,此时不能由屏幕上的 UI 控制,但是仍然需要响应媒体播放控制按钮(最典型的就是后台播放音乐) 。
所以,一个更好的方法是:当您的应用程序获得和失去音频焦点的时候分别注册和注销媒体按钮的事件接收器,而不仅仅是依赖于应用程序的界面状态。


< ?xml version="1.0" encoding="utf-8"?>

< AbsoluteLayout

android:id="@+id/layout1"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@drawable/white"

xmlns:android="http://schemas.android.com/apk/res/android"

>



< TextView

android:id="@+id/myText1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/str_text1"

android:textSize="16sp"

android:textColor="@drawable/black"

android:layout_x="20px"

android:layout_y="42px"

>

< /TextView>





< ImageView

android:id="@+id/myImage"

android:layout_width="48px"

android:layout_height="48px"

android:layout_x="110px"

android:layout_y="32px"

>

< /ImageView>





< TextView

android:id="@+id/myText2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/str_text2"

android:textSize="16sp"

android:textColor="@drawable/black"

android:layout_x="20px"

android:layout_y="102px"

>

< /TextView>





< ProgressBar

android:id="@+id/myProgress"

style="?android:attr/progressBarStyleHorizontal"

android:layout_width="160dip"

android:layout_height="wrap_content"

android:max="7"

android:progress="5"

android:layout_x="110px"

android:layout_y="102px"

>

< /ProgressBar>



< ImageButton

android:id="@+id/downButton"

android:layout_width="100px"

android:layout_height="100px"

android:layout_x="50px"

android:layout_y="162px"

android:src="@drawable/down"

>

< /ImageButton>





< ImageButton

android:id="@+id/upButton"

android:layout_width="100px"

android:layout_height="100px"

android:layout_x="150px"

android:layout_y="162px"

android:src="@drawable/up"

>

< /ImageButton>



< ImageButton

android:id="@+id/normalButton"

android:layout_width="60px"

android:layout_height="60px"

android:layout_x="50px"

android:layout_y="272px"

android:src="@drawable/normal"

>

< /ImageButton>

  

< ImageButton

android:id="@+id/muteButton"

android:layout_width="60px"

android:layout_height="60px"

android:layout_x="120px"

android:layout_y="272px"

android:src="@drawable/mute"

>

< /ImageButton>

  

< ImageButton

android:id="@+id/vibrateButton"

android:layout_width="60px"

android:layout_height="60px"

android:layout_x="190px"

android:layout_y="272px"

android:src="@drawable/vibrate"

>

< /ImageButton>

  

< /AbsoluteLayout>

 

分享到:
评论

相关推荐

    android设置系统音量、媒体音量Demo

    android系统,通过apk设置系统音量、媒体音量等声音的demo。内含源码及apk。

    Unity开发获取和设置Android系统的音量

    unity开发apk,获取和设置Android系统底层音量值,C#方法可直接调用,不需要jar包。

    android java 自定义音量键seekbar控制系统的媒体音量和通话音量,可自动实现切换

    android 自定义音量键seekBar 可监听系统电话状态,实现媒体音量和通话音量自动切换调整声音大小。

    Android 自定义AlertDialog 的内容view控制系统媒体音量

    最近项目里有个功能点,需要使用定制seekbar调节媒体音量,不能使用【按物理音量上下键】弹出的系统dialog做音量调节。我需要继承AlertDialog,设置自己的内容view,重写onKeyDown方法,设置dialog的位置等...... 写...

    Android 自定义AlertDialog 控制系统媒体音量

    最近项目里有个功能点,需要使用定制seekbar调节媒体音量,不能使用【按物理音量上下键】弹出的系统dialog做音量调节。我需要继承AlertDialog,设置自己的内容view,重写onKeyDown方法,设置dialog的位置等...... 写...

    android音量控制

    对android的系统、通话、铃声、媒体和提示声音的音量分别进行调控

    信息发布系统(安卓+PC).zip

    能播放包含视频、图片、字幕等多媒体节目的 App, 适配安卓大屏终端, 提供完全开源的配套信息发布软件.... 支持音量设置,截图等 支持播放文件数据校验 支持后台下载播放内容 支持多场景轮流播放 支持场景

    FlutterPerfectVolumeControl:Flutter完美的音量控制插件,支持Android和IOS,功能有:显示隐藏音量图标,音量监听,获得音量,设置音量

    Flutter音量控制插件,支持Android和IOS,具有:显示隐藏的音量图标,监视音量变化,设置音量,获取设备的当前音量。 请使用真实机器测试,某些功能不支持仿真器。关联采用获取设备音量PerfectVolumeControl . ...

    Android中默认系统的声音/大小修改和配置详解

    主要给大家介绍了关于Android中默认系统的声音/大小修改和配置的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

    视频播放&流媒体

    1. android上实现mp4文件的高效率切割; 2. Red5+Android 直播系统的架构服务端的直播流工程; 3. SeeJoPlayer(视频播放器); 4. 安卓视音频播放测试工程; 5.手势实现播放器的进度和音量调节。

    Android课程设计---基于Android系统的音乐播放器设计与实现.doc

    课程设计报告书 课程名称: 操作系统原理 题 目: 基于Android系统的音乐播放器设计与实现 2012 年 7 月 5 日 课程设计任务书 设计题目:基于Android 系统的音乐播放器设计与实现 初始条件: Linux操作系统,Android...

    支持流媒体的视频播放器.zip

    支持流媒体的视频播放器是一套出现比较早的的安卓视频播放器项目源码,完美支持1.5-2.3.3中的任意一个系统版本,再高的版本没有测试。支持流媒体和本地sd卡文件播放支持URL input和从浏览器调用SeeJoPlayer播放器...

    Android开发应用实战详解源代码

    3.14 文字字体设置 3.15 拖动相片特效 3.16 简易计算器 3.17 about信息 3.18 加载中的程序 3.19 选择对话框 3.20 主题变换 3.21 小结 第4章 andfosd控件演练 4.1 实现文本处理 4.2 将背景图片作为按钮 4.3 用toast...

    用于音量控制和监视的Flutter插件,支持iOS和Android-Flutter开发

    用于音量控制和监视的Flutter插件,支持iOS和Android flutter_volume用于音量控制和监视的Flutter插件,支持iOS和Android。如果您对Kotlin环境有疑问。 也许您应该在android根项目build.gradle中添加下一个代码。 ...

    iOS控制中心 iControl v2.7.20140917

    当前版本:2.7.20140917 软件语言:中文 软件类别:桌面开关 ...※ 调整媒体音量,铃声音量 ※ 打开/关闭震动 ※ 打开/关闭自动亮度调节功能 ※ 调整亮度 ※ 链接到系统设置,应用程序的设置,墙纸设置

    低音均衡器专业版 Equalizer FX Pro 1.3.2 中文多语免费版.zip

    均衡器,低音助推器和音量助推器(Eq&Bass)还可以增加手机系统的音量,例如媒体音量,语音音量,系统音量,铃声音量,警报音量,提示音量,您可以轻松控制。 均衡器FX,低音增强器和音量增强器(均衡器和低音),...

    深蓝音乐铃声播放系统 v8.0.rar

    深蓝音乐铃声系统是目前铃声软件中唯一支持手机远程控制的铃声系统,可以支持PPC手机,谷歌的安卓(Android)手机,以及普通JAVA手机。使用非常小的网络流量,就可以完美的使用手机来遥控铃声系统。  深蓝音乐铃声...

    基于Android的C语言在线学习系统

    Vitamio简介:Vitamio是一个支持所有Android设备的多媒体框架。Vitamio与Android默认的MediaPlayer工作方式相似,但包含更加强大的功能!(注意:Vitamio商业化后个人免费、公司收费) [vitamio官网]...

    音量控制键控制的音频流(setVolumeControlStream)描述

    在Android系统中有多中音频流,通过Activity中的函数 setVolumeControlStream(int streamType)可以设置该Activity中音量控制键控制的音频流,一般在onCreate函数中设置。 Android中有如下几种音频流: •...

    超爽的手机均横器

    一款支持2.3及以上系统的音效均衡器,可以设置手机播放音乐时的音效,增强你的音乐播放效果和质量,让你的android手机带来前所未有的音乐聆听体验。 功能特点: 媒体音量控制 五波段均衡器 低音增强效果 虚拟...

Global site tag (gtag.js) - Google Analytics