安卓手机APP开发__媒体开发部分__处理在声音输出中的变化

安卓手机APP开发__媒体开发部分__处理在声音输出中的变化

目录

概述

使用音量控制

程序化地控制流的音量

在固定音量的设备上工作

不要很大声的噪音



概述

用户期望能够控制一个音频APP的音量大小。标准的行为包括
使用音量控制的能力(在设备上的按钮或者是用户界面上的滑动条)
还有如果当耳机断开连接时,要避免突然间的播放很大的声音。

使用音量控制

当一个用户在一个游戏或者是音乐APP中使用一个音量键时,音量应该被改变,
甚至当播放器在歌曲之间的暂停时,还有当前的游戏位置没有音乐时也是有效的。

安卓使用单独的声音流来播放音乐,报警,通知,打进来的电话的铃声,系统声音,
呼入的声音等。这允许用户来控制每个单独的声音流的音量。

默认情况下,进行音量控制改变的是当前的活动的声音流的音量。
如果你的APP当前没有播放任何内容,按了音量键,调整的是音乐的音量
(在安卓9之前是铃声的音量)。

如果你的APP不是一个闹钟的话,你应该播放声音,使用的是
AudioAttributes.USAGE_MEDIA.

为了确保音量控制调整的是正确的流,你应该调用setVolumeControlStream()
来传递流的类型,来匹配从AudioAttributes.getVolumeControlStream中检索
到的属性。

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

在你的APP的生命周期中,做这个调用,一般是从活动或者是片段的onResume()方法中调用,
进而来控制你的媒体。这连接着音乐流的音量控制。


程序化地控制流的音量

在很少的情况下,你能程序化地设置一个音频流的音量。例如,当你的APP替换了一个已存在的
用户界面。这是不被推荐的,因为安卓的音频管理器混合了同一类型的所有的音频流。
这些方法改变了每一个APP的音量。避免使用它们:


    adjustStreamVolume()
    adjustSuggestedStreamVolume()
    adjustVolume()
    setStreamVolume() setStreamVolume()
    setStreamSolo()
    setStreamMute()

在固定音量的设备上工作

一些设备有音量控制,但是不允许APP使用音频管理器的方法来修改一个音频流的等级。
这叫做固定音量的设备。你能发现你的APP是否运行在一个固定音量的设备上。使用的方法
是调用isVolumeFixed()。

一个音频APP应该提供与可能在同一个流上播放声音的其它的APP的输出的音量上的协调能力。
在固定音量的设备上,APP应该连接它的音量控制到如下表的播放器中的合适的方法:

播放器的使用方法列表
播放器 使用方法
AudioTrackAudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer SimpleExoPlayer.setVolume()

不要很大声的噪音

当用户从他们的安卓设备上享受音乐时,用户有许多的选择。绝大多数的设备有一个内嵌的
扬声器,有线的耳机,还有蓝牙特性的设备。

当一个耳机被拔出或者是蓝牙设备断开时,音频流自动地被重路由到内嵌的扬声器上。
如果你听音乐的音量很高,这能产生很大的噪音。

用户通常期望APP包括一个音乐播放器,就是在屏幕上进行播放控制的那一种,在产生
很大噪音的情况下,能够自动地暂停播放。其它的APP,例如不包括音量控制的游戏,
应该保持播放。用户能使用设备的硬件控制来调整音量。

当音频输出从后端到内嵌的扬声器,系统广播一个ACTION_AUDIO_BECOMING_NOISY的通知。
当你播放音频时,你应该创建一个广播接收器来接收这个通知。你的接收器应该有如下的代码:


Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {// Pause the playback}}
}

当你开始播放时,注册你的接收器,当你停止时注销这个接收器。如果你设计你的APP
符合了这里的指导建议,这些调用应该出现在媒体会话回调方法 onPlay()和 onStop()中。

Kotlin

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()private val callback = object : MediaSessionCompat.Callback() {override fun onPlay() {registerReceiver(myNoisyAudioStreamReceiver, intentFilter)}override fun onStop() {unregisterReceiver(myNoisyAudioStreamReceiver)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 解读:如何使用 ceil 和 floor 函数进行数学运算

在 Python 中,ceil 和 floor 函数是用于数学计算的两个非常重要的函数,它们分别表示对一个数执行向上取整和向下取整的操作。这两个函数位于 Python 的math模块中,因此在使用前需要先导入此模块。 1. ceil函数 ceil函数会将一个数向上舍入到…

python烟花代码

在Python中,可以使用多种方式来模拟烟花效果,其中一种常见的方法是使用turtle图形库来绘制。以下是一个简单的示例,展示了如何使用turtle来创建一个烟花效果的动画: import turtle import random# 设置屏幕和背景 screen turtle…

【数据库主从架构】

【数据库主从架构】 1. 什么是数据库的主从架构1.1 主从复制1.1.1 MySQL的主从主从复制技术三级目录 1. 什么是数据库的主从架构 随着公司业务线的增多,各种数据都在迅速增加,并且数据的读取流量也大大增加,就面临着数据安全问题,…

Mac 电脑 vscode 终端提示 zsh: command not found

问题 Mac上装好node后,使用npm install安装依赖时,终端却提示zsh: command not found 解决方案 【1】在~目录下创建.zshrc文件; 【2】编辑source ~/.bash_profile至.zshrc文件中; 【3】source ~/.zshrc; cd ~ touch .zshrc echo source ~…

06.Git远程仓库

Git远程仓库 #仓库种类,举例说明 github gitlab gitee #以这个仓库为例子操作登录码云 https://gitee.com/projects/new 创建仓库 选择ssh方式 需要配置ssh公钥 在系统上获取公钥输入命令:ssh-keygen 查看文件,复制公钥信息内…

【设计模式】16、state 状态模式

文章目录 十六、state 状态模式16.1 自动购物机16.1.1 vending_machine_test.go16.1.2 vending_maching.go16.1.3 state.go16.1.4 no_good_state.go16.1.5 has_good_state.go 16.2 player16.2.1 player_test.go16.2.2 player.go16.2.3 state.go16.2.4 stopped_state.go16.2.5 p…

go的grpc的三种流模式通信

go的grpc的三种流模式通信 1、grpc通信模式简介2、stream.proto文件3、服务端代码 server.go4、客户端代码client.go5、测试说明 1、grpc通信模式简介 grpc的数据传输可以分为4种模式: 简单模式 (一元调用) 服务端流模式 (服务端返回实时股票数据给前台) 客户端流模…

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志:Logstash 2、存储日志:Elasticsearch 3、展示日志:Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…

npm许可证检查

node开发做项目,很少有人去纯手工打造,大多是采用一些开源框架,还会使用前人做好的轮子,所以咱们的项目文件里,除了自己编写的js文件,还会带有一些拿来主义的npm模块,从其他开源发布网站上下载的…

2024-05-02 商业分析-杭州小万科技-商业模式分析

摘要: 对杭州小万科技的商业模式进行分析,以对其做出客观的评估。 杭州小万科技的资料: 杭州小万科技有限公司 - 企知道 (qizhidao.com) 杭州小万科技有限公司网站备案查询 - 天眼查 (tianyancha.com) 杭州小万科技有限公司 - 爱企查 (baidu.com) ​ 2023年年报:

SMB 协议详解之-TreeID原理和SMB数据包分析技巧

在前面分析SMB协议数据包的过程中,这里,可以看到在SMB协议中存在很多的ID,即Unique Identifiers。那么这些ID表示什么含义?在实际分析数据包的过程中如何根据这些ID进行过滤分析?本文将介绍SMB/SMB2中的tree id ,并介绍如何通过tree id 快速的分析SMB数据包中各种命令交互…

Django响应‘表单请求’过程

(1)用户通过自己的浏览器(客户端)第一次向服务器发出含有表单页面的请求,Django会创建一个未绑定数据的表单实例(例如form LoginForm(), form实例就是未绑定实例),即空表单&#xf…

现代JavaScript:对ES6+的深入讲解,新型的JS特性以及怎样在项目中使用它们

现代JavaScript,也就是ES6(ECMAScript 6)和更高版本,引入了很多新的语言特性来增强JavaScript的编程能力。以下为一些关键的新特性及其在项目中的使用: 1、let 和 const 关键字: 在ES6之前,我们…

使用jdbc方式操作ClickHouse

1、创建测试表,和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

MR混合现实情景实训教学系统在商务接待课堂上的应用

随着科技的不断发展,MR混合现实情景实训教学系统已经逐渐应用于商务接待课堂。这种新型的实训教学系统将虚拟现实技术与现实环境相结合,为商务接待课堂带来了全新的教学方式和体验。 首先,MR混合现实情景实训教学系统能够为学生提供真实的商务…

Agent AI智能体:如何借助机器学习引领科技新潮流

文章目录 📑前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 📑前言…

App异常汇总与对策

UI交互异常 空显示/白屏 一般是因为数据为空或获取失败。要请产品定义加载中、加载失败、数据为空的UI。显示不完整、错位 开发时考虑不同屏幕大小、窗体大小、内容量的兼容,做好对齐和层级的设置。内容量会引起折行、显示不全等问题。如果有改变字体大小或多语言设…

Java基础(10)反射

Java反射是Java语言中的一个功能强大且复杂的机制,它允许程序在运行时访问、检查和修改它本身的结构(类、接口、字段、方法等)。反射机制主要在java.lang.reflect包中定义。 反射的核心组件 Class类:它的实例表示正在运行的Java…

【网站项目】高校推免报名

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

K8s: Kubernetes扩展之自定义资源

自定义资源 自定义资源是 K8s 的扩展,有时候需要对K8s进行一个扩展在默认的K8s集群里面提供的资源对象是一个有限的集合比如常用的pod, deployment, service,这些都是K8s原生的资源之所以它资源,是因为它能够对外提供API接口变成一个resourc…