Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放

简介: 原文地址:http://android.xsoftlab.net/training/managing-audio/index.html引言如果APP需要播放音频,允许用户可以控制音频的播放状态是很重要的一点。

原文地址:http://android.xsoftlab.net/training/managing-audio/index.html

引言

如果APP需要播放音频,允许用户可以控制音频的播放状态是很重要的一点。为了保证有极佳的用户体验,还有很重要的一点就是,APP需要管理音频的焦点来确保不会有多个APP同时播放音频。

在稍后的课程中,将会学习如何使APP响应物理按键的按下事件,这需要在播放音频时,请求音频的焦点,以及需要适当的响应由系统或者其它应用程序引起的音频焦点改变。

控制APP的音量以及播放状态

一个良好的用户体验是可预测的。如果APP可以播放媒体,那么用户可以通过设备上的物理按键或者虚拟按键来控制APP的音量是非常重要的一点。比如蓝牙耳机或者头戴式耳机。

同样,在适当的情况下,通过APP所使用的音频流基础之上来控制播放,停止,暂停,跳过,以及原始的媒体播放按键都应该执行其各自的行为和功能。

识别所用的音频流

创建可预测的音频体验的第一步是理解APP将使用的音频流。

Android对播放音乐、闹钟、通知以及电话铃声、系统声音、呼叫音量和DTMF铃声都维护了单独的音频流。这么做主要是允许用户可以控制每个流各自的音频。

大部分流都会受限于系统事件,所以除非APP是个闹钟应用,否则,几乎可以确定APP播放音频所使用的就是STREAM_MUSIC流。

使用物理按键控制APP声音的音量

默认情况下,按下音量键会修改当前正在活动的音频流的音量。如果APP当前没有播放任何东西,按下音量键只会调整铃声的音量。

如果正在使用一款游戏APP或者音乐APP,那么当用户按下音量键的时候调整音量是极好的,因为用户想要控制游戏或者音乐的音量,即使现在在两首歌之间或者当前的游戏界面上没有播放音乐。

你可能想试着监听音量按键的按下事件,然后修改音频流的音量。忍住这股冲动吧。Android提供了更方便的setVolumeControlStream()方法来让音量键直接用于到你所指定的音频流。

如果已经确认使用的音频流类型,你应该将其设置为音量流的目标。你应该确保这个调用在APP的生命周期之前,因为只需要在Activity的生命周期中调用一次,你应该在具有代表性的方法中调用它,比如onCreate()方法。这可以确保每当APP处于可见状态时,音量控制功能可用更符合用户的期望。

setVolumeControlStream(AudioManager.STREAM_MUSIC);

从这点往后,每当目标activity或者fragment可见时,按下设备上的音量键会影响你所指定的音频流(在这个例子中是”音乐”)。

使用物理播放控制键来控制APP的音频播放

媒体播放按钮,如播放、暂停、停止、跳跃,和以前的一些手机和许多有线连接或无线连接的耳机。当用户按下了其中的某个键时,系统会广播一个ACTION_MEDIA_BUTTON行为的意图。

为了响应媒体按钮的点击事件,你需要在清单文件中注册一个BroadcastReceiver,以便监听这个广播行为:

<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

接收器的实现需要提取出哪一个键被按下而引起的广播。Intent会包含EXTRA_KEY_EVENT这个依据,类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.
            }
        }
    }
}

因为可能存在多个程序想要监听媒体按钮的按下事件,所以APP应该接收媒体按钮按下事件时,你还必须通过编程来进行动态的控制。

下面的代码可以直接应用到APP中去,它可以通过AudioManager来注册与解注媒体按钮事件接收器。当被注册后,广播接收器会专门接收所有的媒体按钮广播。

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...
// Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

从通常情况上讲,APP应该在不活动时或者不可见时解注其它的接收器(比如onStop()回调方法)。然而,对媒体播放APP来说没有那么简单,实际上,当程序不可见以及不能够屏幕上的UI来控制媒体播放时,这时,通过广播响应媒体播放按钮事件就非常重要了。

更进一步的方法就是当程序获取或者失去音频焦点时注册或者解注媒体按钮事件接收器。这些知识将会在下节课详细讨论。

目录
相关文章
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
开发工具
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
阿里云点播服务web播放器sdk,短剧视频类App实现参考。仿抖音 仿陌陌 短视频 无限滑动播放 视频流。无uniapp video 原生组件的层级、遮挡、覆盖问题,适合与不同功能视图组合使用,实现丰富的应用功能。
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
|
Android开发
Android 利用MediaPlayer实现音乐播放
本文提供了一个简单的Android MediaPlayer音乐播放示例,包括创建PlayerActivity、配置AndroidManifest.xml和activity_player.xml布局,以及实现播放和暂停功能的代码。
343 0
Android 利用MediaPlayer实现音乐播放
|
编解码 网络协议 开发工具
Android平台如何实现多路低延迟RTSP|RTMP播放?
本文档详细介绍了大牛直播SDK在Android平台上实现RTSP与RTMP流媒体播放及录像功能的技术细节。早在2015年,SDK的第一版就已经支持了多实例播放,并且通过简单的实例封装就能轻松实现。文档中提供了代码示例,展示了如何开启播放、停止播放以及开始和停止录像等功能。此外,SDK还提供了丰富的配置选项,例如设置录像目录、文件大小限制、转码选项等。总结部分列出了该SDK的关键特性,包括但不限于高稳定性和低延迟的播放能力、多实例支持、事件回调、硬解码支持、网络状态监控以及复杂的网络环境处理等。这些功能使得SDK能够应对各种应用场景,特别是在对延迟和稳定性有极高要求的情况下表现优异。
422 5
|
编解码 网络协议 vr&ar
Android平台下VR头显如何低延迟播放4K以上超高分辨率RTSP|RTMP流
这段内容讲述了VR头显中实现高分辨率视频播放的技术背景与实现方法,并强调了其重要性。高分辨率对于提升VR体验至关重要,它能提供更清晰的画面、增强沉浸感、补偿透镜放大效应,并维持宽广视场角下的图像质量。文中提到的大牛直播SDK具备极低的延迟(200-400ms),支持多种协议与格式,并具有丰富的功能特性,如多实例播放、事件回调、视频及音频格式支持等。此外,提供了基于Unity的播放器示例代码,展示了如何配置播放参数并开始播放。最后,作者指出此类技术在远程控制、虚拟仿真等应用场景中的重要意义。
232 3
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
505 4
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的宠物饲养管理APP的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的宠物饲养管理APP的详细设计和实现(源码+lw+部署文档+讲解等)
202 6
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物饲养管理APP附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物饲养管理APP附带文章源码部署视频讲解等
132 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的宠物饲养管理APP的详细设计和实现
基于SpringBoot+Vue+uniapp的宠物饲养管理APP的详细设计和实现
186 8