Android 音量调节

对于Android的音量调节,可以分为按键调节音量和设置中调节音量。我们首先说一说设置中的音量调节。

一、音量的分类:

1.AudioManager.STREAM_VOICE_CALL

2.AudioManager.STREAM_RING

3.AudioManager.STREAM_MUSIC,

4.AudioManager.STREAM_ALARM

5.AudioManager.STREAM_NOTIFICATION

二、音量的范围:

对于不同类型的音量Android规定了不同的范围,在AudioService中有一个数组,定义了不同音量的范围。

private final int[] MAX_STREAM_VOLUME = new int[] {
  5, // STREAM_VOICE_CALL
  7, // STREAM_SYSTEM
  7, // STREAM_RING
  15, // STREAM_MUSIC
  7, // STREAM_ALARM
  7, // STREAM_NOTIFICATION
  15, // STREAM_BLUETOOTH_SCO
  7, // STREAM_SYSTEM_ENFORCED
  15, // STREAM_DTMF
  15 // STREAM_TTS
};

三:调节音量的方法:

int streamValue = am.getStreamVolume(streamType); 获取当前类型的音量值

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 获取音频服务

audioManager.setStreamVolume(mStreamType, streamValue, 0);  设置音量

现在说一下使用按键调节音量

使用按键调节音量,首先会在PhoneWinManager中收到一个按键的事件,然后调用AudioService中的adjustStreamVolume方法,源码如下:

/**
* Tell the audio service to adjust the volume appropriate to the event.
* @param keycode
*/
void handleVolumeKey(int stream, int keycode) {
IAudioService audioService = getAudioService();
if (audioService == null) {
return;
}
try {
// since audio is playing, we shouldn‘t have to hold a wake lock
// during the call, but we do it as a precaution for the rare possibility
// that the music stops right before we call this
// TODO: Actually handle MUTE.
mBroadcastWakeLock.acquire();
audioService.adjustStreamVolume(stream,
keycode == KeyEvent.KEYCODE_VOLUME_UP
? AudioManager.ADJUST_RAISE
: AudioManager.ADJUST_LOWER,
0);
} catch (RemoteException e) {
Log.w(TAG, "IAudioService.adjustStreamVolume() threw RemoteException " + e);
} finally {
mBroadcastWakeLock.release();
}
}

在adjustStreamVolume会启动VolumePanel,也就是我们按音量键出现的界面。在VolumePanel中会调用AudioManager的setStreamVolume进行设置音量。

时间: 2024-10-27 13:08:45

Android 音量调节的相关文章

Android 音量调节View

导语 手机直播一般都会通过移动屏幕来调节音量的大小,本篇只实现了图例,并不能改变音量. 先看效果: 需要的素材:小喇叭图片,点击这里获取 预热 如果你对Path,PathMeasure,RectF,Canvas等不适很了解的话,强烈建议看这位哥们的教程: 点击这里查看教程 如果你将这哥们的十几篇帖子都看完了的话,这个View实际上是非常简单的 步骤介绍 用动态图来介绍: 这里用文字翻译下: 将小喇叭画到中心位置 围绕着喇叭画一个圆圈,浅色的 画一个圆弧,深色的 根据触摸的位置来改变圆弧的大小 分

Android 4.4 音量调节流程分析(二)

之前在Android 4.4 音量调节流程分析(一)里已经有简单的分析音量控制的流程,今天想接着继续分析下音量大小计算的方法.对于任一播放文件而言其本身都有着固定大小的音量Volume_Max,而在AudioPolicyManagerBase.cpp文件中音量调节可以理解为在Volume_Max的基础上乘以系数κ(0≤κ≤1). 现在对AudioPolicyManagerBase.cpp中volIndexToAmpl函数做具体分析,volIndexToAmpl的函数定义如下: 1 float A

Android 4.4 音量调节流程分析(一)

最近在做Android Audio方面的工作,有需求是在调节Volume_Up_Key & Volume_Down_key时,Spearker or Headset每音阶的衰减变为3db左右.所以利用Source Insight分析Android源码中音量控制的流程,如有错误,欢迎指正,谢谢! 以下是调节音量的流程: Step_1.首先在调节机台Volume_Up_Key & Volume_Down_Key操作时,系统会调用到AudioManager.java中handleKeyUp &a

自定义音量调节控件的实现

本篇文章,将介绍如何实现自定义的音量调节控件. 话不多少,先看效果图 本篇文章将介绍两种实现的方式,上面的是通过继承RatingBar,然后设置样式获得的效果,下面的是通过继承自View,完全自定义的方式实现. 我们首先介绍第一种方式,也就是继承自RatingBar实现. public class WmtRatingBar extends RatingBar { private OnRatingBarChanging mOnRatingBarChanging; public WmtRatingB

Android6.0 源码修改之Settings音量调节界面增加通话音量调节

前言 今天客户提了个需求,因为我们的设备在正常情况下无法调节通话音量,只有在打电话过程中,按物理音量加减键才能出现调节通话音量seekBar,很不方便,于是乎需求就来了.需要优化两个地方 1.在正常情况下,按物理音量加减键都显示 通话音量调节seekBar,可方便快速调节通话音量 2.在Settings中提示音界面点击设置进入,增加通话音量调节seekBar 修改前 修改后 实现 第一个功能 先来完成第一个功能,还是通过Hierarchy View查看布局结构,查找到布局文件id为volume_

洛谷 P1877 [HAOI2012]音量调节

P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低. 音量用一个整数描述.输入文件中整数beginLevel,代表吉他刚开始的音量,整数maxLevel,代表吉他的最大音量.音量不能小于0也不能大于maxLevel.输入中还给定了n个整数c1,c2,c3,...,cn

bzoj-2748 2748: [HAOI2012]音量调节(dp)

题目链接: 2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MB Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低.音量用一个整数描述.输入文件中给定整数beginLevel,代表吉他刚开始的音量,以及整数maxLevel,

BZOJ 2748: [HAOI2012]音量调节 dp

2748: [HAOI2012]音量调节 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2748 Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低.音量

BZOJ 2748 音量调节

一看这是一道很简单的题,写了暴力,就走了,的确仅4毫秒就AC了.但后来我以为或许BFS会更快(加之,太久没写搜索了),就回来重写了一下,不写不知道一写吓一跳,MLE了.这才仔细一想,暴力的状态转移是 O(n^2)的,但暴力的搜索是O(2^n)的,把我吓死了.看来以后写算法一定得多想啊! dp的好处就在于可以不用算很多重复的子问题,否则就和暴力的搜索一模一样.给暴力的搜索,加个去重,加个剪枝后速度便会加快.这道题算是加深了我对dp和爆搜的理解吧! 这是dp的代码! 1 #include<cstdi