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

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

目录

概述

使用音量控制

程序化地控制流的音量

在固定音量的设备上工作

不要很大声的噪音


概述

用户期望能够控制一个音频APP的音量大小。标准的行为包括

使用音量控制的能力(在设备上的按钮或者是用户界面上的滑动条)

还有如果当耳机断开连接时,要避免突然间的播放很大的声音。

使用音量控制

当一个用户在一个游戏或者是音乐APP中使用一个音量键时,音量应该被改变,

甚至当播放器在歌曲之间的暂停时,还有当前的游戏位置没有音乐时也是有效的。

安卓使用单独的声音流来播放音乐,报警,通知,打进来的电话的铃声,系统声音,

呼入的声音等。这允许用户来控制每个单独的声音流的音量。

默认情况下,进行音量控制改变的是当前的活动的声音流的音量。

如果你的APP当前没有播放任何内容,按了音量键,调整的是音乐的音量

(在安卓9之前是铃声的音量)。

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

AudioAttributes.USAGE_MEDIA.

为了确保音量控制调整的是正确的流,你应该调用setVolumeControlStream()

来传递流的类型,来匹配从AudioAttributes.getVolumeControlStream中检索

到的属性。

Kotlin

Kotlin 复制代码
setVolumeControlStream(AudioManager.STREAM_MUSIC)

在你的APP的生命周期中,做这个调用,一般是从活动或者是片段的onResume()方法中调用,

进而来控制你的媒体。这连接着音乐流的音量控制。

程序化地控制流的音量

在很少的情况下,你能程序化地设置一个音频流的音量。例如,当你的APP替换了一个已存在的

用户界面。这是不被推荐的,因为安卓的音频管理器混合了同一类型的所有的音频流。

这些方法改变了每一个APP的音量。避免使用它们:

adjustStreamVolume()

adjustSuggestedStreamVolume()

adjustVolume()

setStreamVolume() setStreamVolume()

setStreamSolo()

setStreamMute()

在固定音量的设备上工作

一些设备有音量控制,但是不允许APP使用音频管理器的方法来修改一个音频流的等级。

这叫做固定音量的设备。你能发现你的APP是否运行在一个固定音量的设备上。使用的方法

是调用isVolumeFixed()。

一个音频APP应该提供与可能在同一个流上播放声音的其它的APP的输出的音量上的协调能力。

在固定音量的设备上,APP应该连接它的音量控制到如下表的播放器中的合适的方法:

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

不要很大声的噪音

当用户从他们的安卓设备上享受音乐时,用户有许多的选择。绝大多数的设备有一个内嵌的

扬声器,有线的耳机,还有蓝牙特性的设备。

当一个耳机被拔出或者是蓝牙设备断开时,音频流自动地被重路由到内嵌的扬声器上。

如果你听音乐的音量很高,这能产生很大的噪音。

用户通常期望APP包括一个音乐播放器,就是在屏幕上进行播放控制的那一种,在产生

很大噪音的情况下,能够自动地暂停播放。其它的APP,例如不包括音量控制的游戏,

应该保持播放。用户能使用设备的硬件控制来调整音量。

当音频输出从后端到内嵌的扬声器,系统广播一个ACTION_AUDIO_BECOMING_NOISY的通知。

当你播放音频时,你应该创建一个广播接收器来接收这个通知。你的接收器应该有如下的代码:

Kotlin

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

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)
    }
}
相关推荐
会python的小孩1 小时前
SD-WebUI视频重绘:TemporalKit+EbsynthUtility避坑指南
人工智能·tcp/ip·安全·ai作画·stable diffusion·音视频
bagell3 小时前
Stable Diffusion教程:如何实现人脸一致
人工智能·深度学习·机器学习·ai作画·stable diffusion·音视频·midjourney
ChatGPT研究院4 小时前
ChatGPT自媒体创作秘籍:高效生成优质文章和视频
人工智能·ai·chatgpt·音视频·媒体
静止了 所有的花开5 小时前
FFmpeg 实现从摄像头获取流并通过RTMP推流
ffmpeg·音视频·h.264
美狐美颜sdk19 小时前
实时美颜技术解析:视频直播中的美颜SDK
深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk·视频美颜sdk
weixin_5783718821 小时前
视频去水印在线工具,视频去水印网站在线使用
音视频
loong_XL1 天前
pydub、ffmpeg 音频文件声道选择转换、采样率更改
ffmpeg·音视频·音频·采样率·声音处理
人工智能培训咨询叶梓1 天前
Lumière:开创性的视频生成模型及其应用
人工智能·深度学习·机器学习·语言模型·自然语言处理·音视频·多模态
玩电脑的辣条哥1 天前
如何快速去除视频里面的水印字幕等信息?(内附工具)
ai·音视频·短视频
Susu_afmx1 天前
音乐伴奏提取?唱歌剪辑好用的音频人声分离软件!提取步骤很简单!
深度学习·新媒体运营·电脑·音视频·音频