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

前言

声音管理系统用来实现声音的输入和输出、声音的控制和路由等功能,包括主和各种音源的音量调节、声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理、音效的播放、音轨设置和播放、录音设置和启动等功能。

最近在做定制需求的时候,需要修改系统通知的声音,将其禁用掉,避免第三方应用发送通知时,声音很大吓到用户。索性就把通知声音关掉。下面就说说关闭声音的几种方法,以及修改系统默认声音的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

本文是基于Android5.1的代码

一、直接修改系统层默认的声音大小

在系统代码frameworks/base/media/java/android/media/AudioService.java的开头定义了两个数组,一个MAX_STREAM_VOLUME 这里面定义了各种声音的最大值(最大值不是100,所以需要AudioManager.getStreamMaxVolume(type)来获取各个音量的最大值),然后进行设置。

还定义了一个数组DEFAULT_STREAM_VOLUME 这里面则和MAX_STREAM_VOLUME里定义的顺序是一样,表明了各种声音的默认的大小。

此块代码如下:

/** @hide Maximum volume index values for audio streams */
 private static int[] MAX_STREAM_VOLUME = new int[] {
  5, // STREAM_VOICE_CALL
  7, // STREAM_SYSTEMX_STREAM_VOLUMEMAX_STREAM_VOLUMEMAX_STREAM_VOLUME
  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
 };
 private static int[] DEFAULT_STREAM_VOLUME = new int[] {
  4, // STREAM_VOICE_CALL
  7, // STREAM_SYSTEM
  5, // STREAM_RING
  11, // STREAM_MUSIC
  6, // STREAM_ALARM
  5, // STREAM_NOTIFICATION
  7, // STREAM_BLUETOOTH_SCO
  7, // STREAM_SYSTEM_ENFORCED
  11, // STREAM_DTMF
  11 // STREAM_TTS
 };

如果我们需要修改默认的通知声音,则可以将STREAM_NOTIFICATION 前面的数值 5 给为 0即可,这样默认声音就为0 了。

二、修改数据库中的通知声音值

媒体声音这些数据在数据库中都会默认的存放数据,我们知道大多数的数据都是系统初次启动的时候在SettingProvider应用中加载初始化的值,当然通知的声音也在里面。

具体的代码在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 其中有个方法loadVolumeLevels(db) 此方法则是加载所有默认声音大小的地方,具体代码如下:

stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" + " VALUES(?,?);");
loadSetting(stmt, Settings.System.VOLUME_MUSIC,  AudioService.getDefaultStreamVolume(AudioManager.STREAM_MUSIC));
loadSetting(stmt, Settings.System.VOLUME_RING,   AudioService.getDefaultStreamVolume(AudioManager.STREAM_RING));
loadSetting(stmt, Settings.System.VOLUME_SYSTEM,  AudioService.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM));
loadSetting(stmt,Settings.System.VOLUME_VOICE,
AudioService.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL));
loadSetting(stmt, Settings.System.VOLUME_ALARM,   AudioService.getDefaultStreamVolume(AudioManager.STREAM_ALARM));
loadSetting(stmt,Settings.System.VOLUME_NOTIFICATION,
AudioService.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION));
loadSetting(stmt,Settings.System.VOLUME_BLUETOOTH_SCO,
AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));

我们发现loadSetting中把所有声音相关默认值大小的都写入数据库中了,那么我们就可以从这里下手了,在Settings.System.VOLUME_NOTIFICATION的设置项中我们就把他设置为0,则系统通知默认的声音就为0 ,我们再看看AudioService.getDefaultStreamVolume这个方法的实现.

public static int getDefaultStreamVolume(int streamType) {
 return DEFAULT_STREAM_VOLUME[streamType];
}

实际就是返回了我们在方案一中系统里面默认音量大小数组里面的值。所以方案一和方案二实际是一个效果

三、修改ro.config.notification_sound的属性值

此属性值的意思就是通知默认的音乐文件文件名,我们在系统代码build/target/product/full_base.mk 中定义了,如果我们不想有声音那么我们可以将默认值改为不存在的文件,则不会播放通知声音了,当然我们也可以在客户定义的mk中使用PRODUCT_PROPERTY_OVERRIDES 去复写此属性,将其指定为不存在文件或者为空,这样就不会有通知声音响了。

四、修改默认的声音

系统默认了很多的声音,那么我们要修改一些系统里默认的音效文件呢,那么我们可以修改frameworks/base/data/sounds下面文件及文件夹中的声音文件,如果改了名字记得要在mk中将原来的替换为新的名字。这下面的mk的作用是将这些音乐文件全部打包到系统system/media/audio下面各个模块的文件,然后在系统开机的时候,扫描这些文件,将其加入到数据库中,之后在设置中更换声音时,则直接从数据库中查询这些音乐文件,然后供用户选择。

总结

系统的媒体这块是很重也很大的一块,这里只是一点点皮毛,只是用到时查到的,要想系统系统学习还得很多工作需要研究。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • android系统在静音模式下关闭camera拍照声音的方法
  • Android中通知Notification使用实例(振动、灯光、声音)
  • Android如何为按键添加声音
  • Android开发中播放声音的两种方法分析
(0)

相关推荐

  • Android中通知Notification使用实例(振动、灯光、声音)

    本文实例讲解了通知Notification使用方法,此知识点就是用作通知的显示,包括振动.灯光.声音等效果,分享给大家供大家参考,具体内容如下 效果图: MainActivity: import java.io.File; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; im

  • Android如何为按键添加声音

    为程序的按钮添加按键声音能更好的亲和用户,产生更好的使用体验,下面就是为按键添加声音的方法: public class MainActivity extends Activity { private Button mButton01; private SoundPool sp;//声明一个SoundPool private int music;//定义一个整型用load():来设置suondID @Override public void onCreate(Bundle savedInstanc

  • android系统在静音模式下关闭camera拍照声音的方法

    话说为了防止偷拍,业内有不成文规定,手机公司在做camera时,点击拍照和录像键的时候,必须要有提示音.因此,google也就非常人性化的将播放拍照声音的函数,放到了cameraService中,防止开发者能开发出不响的camera,从而只要调用拍照函数,一定会响,这是写死在framework中的. 话说这个规定在当今有点不合时宜,这不,今天我收到测试提的一个BUG,说是公司的新需求,要求在静音模式下拍照声音也得取消.这么无耻的需求,也许就在我们中国最大的山寨手机公司才会提到.废话不多说,看看是

  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法.分享给大家供大家参考,具体如下: 在Android中,音频.视频等多媒体元素的加入,使得应用程序的用户体验更好.可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐.办公的必备产品. Android提供了简单的音频API.一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具.这种工具在互联网上有大量的实例,因此在此只做简单的介绍. 对播放行为的控制是三个大家非常熟悉的方法:start().stop()和paus

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

    前言 声音管理系统用来实现声音的输入和输出.声音的控制和路由等功能,包括主和各种音源的音量调节.声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理.音效的播放.音轨设置和播放.录音设置和启动等功能. 最近在做定制需求的时候,需要修改系统通知的声音,将其禁用掉,避免第三方应用发送通知时,声音很大吓到用户.索性就把通知声音关掉.下面就说说关闭声音的几种方法,以及修改系统默认声音的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 本文是基于Android5.1的代

  • C和C++中的基本数据类型的大小及表示范围详解

    本文研究的主要问题时关于C和C++中的基本数据类型int.long.long long.float.double.char.string的大小及表示范围,具体介绍如下. 一.基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下): 字节:byte:位:bit. 1.短整型short:所占内存大小:2byte=16bit: 所能表示范围:-32768~32767:(即-2^15~2^15-1) 2.整型int:所占内存大小:4byte=32bit: 所能表示范围:-2147483648~

  • Android中Spinner(下拉框)控件的使用详解

    android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

  • Android中webview与JS交互、互调方法实例详解

    Android中webview与JS交互.互调方法实例详解 前言: 对于试水的功能,一般公司都会采用H5的方式来开发,可以用很少的资源与很短的项目工期来完成. 但许多情况下,H5页面会需要一些原生持有的一些如用户信息之类的数据,一些交互也需要调用原生的,如toast之类要保持同一个手机风格一致的交互行为.这个时候就需要能够让JS主动调用原生的方法来进行操作或者获取数据.或者是原生调用JS的方法在H5加载的时候传递一些参数. 对于原生调用JS的方法 我们需要实现一个WebViewClient,在这

  • Linux 系统 nginx 服务器安装及负载均衡配置详解

    nginx(engine x) 是一个 高性能 的 HTTP 和 反向代理 服务器.邮件代理服务器以及通用的 TCP/UDP 代理服务器.其特点为轻量级(占用系统资源少).稳定性好.可扩展性(模块化结构).并发能力强.配置简单等. 本文主要介绍在测试环境中通过 nginx 实现基本的 负载均衡 功能. nginx 可以提供 HTTP 服务,包括处理静态文件,支持 SSL 和 TLS SNI.GZIP 网页压缩.虚拟主机.URL 重写等功能,可以搭配 FastCGI.uwsgi 等程序处理动态请求

  • SpringBoot中对应2.0.x版本的Redis配置详解

    properties格式: # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.po

  • android中px、sp与dp之间进行转换详解

    目录 相关名词解释 系统屏幕密度 单位换算方法 利用系统TypeValue类来转换 补充:sp与dp的区别 总结 由于Android手机厂商很多,导致了不同设备屏幕大小和分辨率都不一样,然而我们开发者要保持在不同设备上显示同样的视觉效果,就需要做一些适配效果. 相关名词解释 屏幕大小:通常指的是屏幕对角线的长度,使用“寸”为单位来衡量. 分辨率:指手机屏幕的像素点个数,例如:720*1280,指的是宽有720个像素点,高有1280个像素点. dpi:指的是每英寸像素,是由对角线上的像素点数除以屏

  • Android中ViewFlipper的使用及设置动画效果实例详解

    本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

  • 解析Android中实现滑动翻页之ViewFlipper的使用详解

    1)View切换的控件-ViewFlipper介绍 ViewFilpper类继承于ViewAnimator类.而ViewAnimator类继承于FrameLayout. 查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果.该类有如下几个和动画相关的方法. setInAnimation:设置View进入屏幕时候使用的动画.该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID. setOut

  • Spring中的事务操作、注解及XML配置详解

    事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQL 语句: update Acoount set balance = balance - money where id = 'A'; update Acoount set balance = balance + money where id = 'B' 上面这两条 SQL 就可以要看成是一个事务,必

随机推荐