Android Media Playback 中的MediaPlayer的用法及注意事项(一)

声明:以下内容翻译自Android官网,由于译者水平有限,本文出现的错误请大家批评指正,谢谢!

尊重劳动成果,转载请注明出处,http://blog.csdn.net/u014532901/article/details/46580365,谢谢!

0.概述

安卓多媒体框架对于播放各种各样的常见的媒体文件提供了支持,得益与此,我们可以在我们的应用程序中整合音频,视频和图像。我们使用android提供给我们的MediaPlayer的API,我们可以播放存放在应用程序中的文件(Raw Files),文件系统中的独立的文件,或者来自网络连接上的数据流文件。

这篇文档主要展示了:为了程序获得好的性能和一个满意的用户体验,我们该如何去写一个与用户和android系统交互的媒体播放程序。

注意:你仅仅可以在标准的输出设备中播放音频数据。目前常见的就是手机的扬声器,或者一个蓝牙耳机。另外,你并不能在打电话的时候去播放一个声音文件。

1.基本部分:


下面是在android框架中被用来播放音频视频的类

MediaPlayer:这是播放音频视频主要的API

AudioManager:管理音频资源,和音频在设备上的输出;

3.Manifest声明

在开始使用MediaPlayer开发你的程序之前,为了确保你被允许使用一些相关的特性,记得在manifest文件中有对应的权限声明。

.Internet Permission 如果你想使用网络上的内容作为你的播放内容,你必须声明这个权限。

<span style="font-size:18px;"><uses-permission android:name="android.permission.INTERNET" /></span>

.Wake Lock Permission 如果你的程序需要保持屏幕常亮,或者不让CPU休眠,那么你就必须声明这个权限

<uses-permission android:name="android.permission.WAKE_LOCK" />

3.使用MediaPlayer


在android多媒体框架中,MediaPlayer是最重要的组件之一。一个MediaPlayer的实例(或者称为对象)能够让我们使用最少的配置去获取、解码、播放音频和视频。它支持数种不同的资源如下所示:

  • .本地资源(例如那些存放在你的程序包中raw目录下的文件)
  • .内部的URI指向的资源,例如可以通过Content Resolver获取
  • .外部的URL资源(流式文件)(SD卡上的、网络服务器上流式文件等等)

下面是一个关于如何播放一个存放为本地资源的音频文件,(存放在你的程序的res/raw/ 目录下面)

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // 用不着调用prepare()方法,creat()方法已经为我们完成了

在上面的例子中,对于"raw"资源文件,android不会试着用任何方式去解析它。正因为如此,这里面存放的资源不应该是一个原始的音频,它应该是一些适当编码、格式化的、格式被支持的媒体文件。

下面这个例子展示了如何播放可用的内部URI指向的资源。(你可以通过一个Content Resolver实例去获取它)

Uri myUri = ....; // 你的uri的声明
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();mediaPlayer.start();

下面这个例子是通过HTTP协议播放一个远程的URL指向的流

String url = "http://www.baidu.com/music/GoBigOrGoHome.mp3"; //这里是你的URLMediaPlayer
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);mediaPlayer.prepare(); // 也许花费很长的时间,例如为了进行一些缓存的初始化
mediaPlayer.start();

注意:如果你传递的是一个指向在线的媒体文件的URL,这个文件必须是能够获取得到的。因此,你应该去捕获一些异常以防止你给的URL指向的文件可能根本就不存在。

4.异步准备

在原则上来说,使用MediaPlayer是很直接简单的。但是需要记住的一点是,把MediaPlayer正确的整合到我们的程序中,有一些额外的必要的事情是必须做的(但是这是API做)。例如,因为可能涉及到获取、解码多媒体文件,MediaPlayerprepare()方法有时候会花费很长的时间来执行。所以,你不应该在你的UI主线程中去调用它。因为这样会挂起你的UI知道的这个方法返回,结果就是导致了非常差的用户体验,并可能引起ANR的错误。即使你觉得没关系,我从本地加载资源是很快的,那么你也请注意,在UI做任何超过耗时0.1秒的的操作都会引起一个明显的停顿(我觉得0.1秒都有点过长,不是说好的16ms吗?),结果给用户的感受是:这个程序很卡。

为了避免上述的情况的发生,应该创建另一个线程来准备这个MediaPlayer,在准备工作做完后再去通知UI主线程。同时,android框架提供一个很方便的方法来完成这个准备的任务,这就是prepareAsync()方法,这个方法在后台线程去完成MediaPlayer准备的工作,在做完工作后立即返回。搭配使用的是应该自定义一个 实现了MediaPlayer.OnPreparedListener接口的onPrepared()方法的监听器,在调用prepareAsync()方法之前,通过setOnPreparedListener()方法将MediaPlayer注册给监听器,在异步准备工作完成后,系统会回调onPrepared()方法。

5.管理MediaPlayer的状态

关于MediPalyer另一个需要记住的方面就是MediPlayer是基于状态的。这就是说,MediaPlayer有一个内部的状态,当你写你的代码时,你一直要记住这一点。因为你只能在对应的MediaPlayer的状态下,去调用它 的对应的方法。就好比是你不应该让一个不会走路的婴儿去调用他去打篮球一样(译者注),如果你在错误的状态去调用了错误的方法,那么系统就会抛出异常或者程序直接崩掉。

下面是MediaPlayer的状态图,以及一些对应的方法在哪些状态可以被调用。

因此在你对一个MediaPlayer对象操作的时候,时刻记住这张图,因为在错误的状态调用的方法会引发一个BUG.

6.释放MediaPlayer

MediaPlayer会消耗有用的系统资源。因此,你应该始终保持着警惕确保你没有挂起(持有却不用)一个MediaPlayer对象。当你处理这种情况时,你应该调用release()方法来确保系统分配给他的资源被回收。例如,如果你正在使用一个MediaPlayer,同时你的Activity收到了一个onStop()的调用,此时你必须释放MediaPlayer,因为当你的Activity并没有和用户交互的时候,你持有这个MediaPlayer是没有多大意义的(除非你在后台使用这个MediaPlayer,后面的文章会介绍在Service使用MediaPlayer的情况)。当然,当你Activity回来的时候,你需要再一次创建、准备这个一个MediaPlayer对象。

下面是如何释放和置空一个MediaPlayer对象的

mediaPlayer.release();
mediaPlayer = null;

作为一个例子,考虑这么一个情况:当你的Activitystop了,如果你忘记释放一个MediaPlayer,同时当activity被再一次开始的时候,你的MediaPlayer会被再一次创建。你应该知道,当用户翻转屏幕的时候,系统通过重新开始这个activity来处理这种情况。如果用户反复多次的翻转屏幕,你的程序就很快的消耗掉了所有的系统资源。

转载于:https://www.cnblogs.com/Spground/p/9567941.html

Android Media Playback 中的MediaPlayer的用法及注意事项(一)相关推荐

  1. java case switch面试_Java基础篇——Java中switch case语句用法及注意事项面试题9期

    本文主要说一说关于switch case语句用法及注意事项,应对面试官的提问.希望可以帮助那些对switch存在错误和各种细节问题的"码友". switch-case注意事项 sw ...

  2. Android源码中final关键字的用法及final,finally,finalize的区别

    Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...

  3. Android -- 多媒体播放之Media Playback基础介绍

    Android -- MediaPlayer之Media Playback基础介绍 文章翻译自Android官方文档:http://www.android-dev.cn/guide/topics/me ...

  4. 【android】【转】class android.media.MediaPlayer

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于如何使用这个类的方法还可以阅读VideoView类的文档. 1.状态图     对播放音频/视频文件和流的控制是通过一个状态机来管理的. ...

  5. Caused by:java.lang.IllegalStateException at android.media.MediaPlayer._setDataSource(Native Method)

    使用Mediaplayer播放本地音频,在第二次调用mediaplayer.setDataSource()时报错如下: Caused by: java.lang.IllegalStateExcepti ...

  6. socket android用法,Android NDK中socket的用法以及注意事项分析

    与Java层中的套接字相比,本机层中的Socket可以选择更多的配置项,并获得关于当前拥塞状态的更准确的信息,那么 NDK中socket的用法以及注意事项分析,大家清楚吗?下文是爱站技术频道小编为大家 ...

  7. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  8. android开发 java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method)

    最近遇到一个问题,我在service里面播放一段音乐时遇到了IllegalStateException异常,代码是这样的: protected void play() {System.out.prin ...

  9. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  10. Android中各种Span的用法——转载

    转载一篇觉得很好的文章,在转载中成长:https://blog.csdn.net/qq_16430735/article/details/50427978 Android中各种Span的用法 前言 S ...

最新文章

  1. mysql主从(GTID复制模式)
  2. caffe框架下目标检测——faster-rcnn实战篇问题集锦
  3. 《SAS编程与数据挖掘商业案例》学习笔记之十
  4. Qt使用invokeMethod反射机制实现进程间的通信
  5. 电子计算机诞生于1946年第几台,人类第一台电子计算机诞生于1946年2月
  6. php oop 效率,浅谈PHP的oop
  7. Ubuntu安装OpenTSDB
  8. 第一章 什么是数组名?
  9. 如何获取jar包的在执行机上面的路径
  10. 下列关于python2.x和3.x的区别说法正确_1.??下列关于Python2.x和Python3.x的说法,正确的是()...
  11. 大话西游手游服务器维护要多久,2018年11月22日维护公告
  12. html输入QQ自动获取QQ头像,代码实现WordPress评论框输入QQ号码自动获取QQ头像和昵称...
  13. matlab相机标定工具箱讲解,matlab 相机标定工具箱
  14. libreCAD源码阅读笔记2
  15. linux shell 三元运算符,语法 - Bash中的三元运算符(?:)
  16. HTML中的单选按钮实现男女性别选择
  17. java输入两个整数_求平均值._用C语言编写:完成从键盘输入两个整数a和b,求平均值ave,并输出平均值...
  18. RHEL 升级内核和回退步骤
  19. mysql concat 不同字符集_字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?...
  20. 微信企业付款到零钱,查询接口报错<err_code_des><![CDATA[参数错误:必须输入商户号]]></err_code_des>

热门文章

  1. SQL Server的还原
  2. 彻底弄明白之数据结构中的排序七大算法-java实现
  3. 公式字符串转换为公式或结果
  4. 美团程序员吐槽公司蹲位:如厕5分钟找坑两小时
  5. 面试时企业最看中你什么能力?
  6. 到底工资要多少合适?
  7. 标准的软件开发是怎样的?
  8. Django 强大的ORM之增删改查
  9. [Jmeter][基础]Jmeter连接IMPALA
  10. Luogu4491 [HAOI2018]染色 【容斥原理】【NTT】