Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)
Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)
- 准备
- 1.储存在raw文件夹
- 2.储存在assets文件夹
- 1.音频
- 1.播放音乐
- 2.暂停音乐
- 3.继续播放音乐
- 4.获取播放时间
- 5.快进到指定位置
- 6.变速播放
- 7.播放data/data/目录下的音频文件
- 8.播放网络歌曲
Android 入门第八讲02-WebView的高级用法(Android调用 JS 代码( loadUrl 方法,案例练习),JS调用 Android 代码,流行框架总结,跨平台技术)
Android里面的多媒体主要是两部分,第一部分是音频和视频,第二部分是动画(帧动画,补间动画,属性动画)
准备
先导入我们需要用到的音频文件和视频文件
1.储存在raw文件夹
第一步,创建raw文件夹
导入文件
2.储存在assets文件夹
第一步,创建assets文件夹
第二步导入文件
1.音频
1.播放音乐
第一步,添加播放音乐按钮
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="40dp"android:layout_marginLeft="40dp"android:layout_marginTop="106dp"android:text="播放音乐"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
第二步,通过MediaPlayer来播放音乐
public class MainActivity extends AppCompatActivity {MediaPlayer mMediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button=findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//播放音乐mMediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.a1);mMediaPlayer.start();}});}
}
运行(这里动态图没有声音,但可以仔细观察,右下角录屏软件悬浮球,一开始是静止的,在点击播放音乐后,有音频波浪变化)
2.暂停音乐
第一步,添加停止播放的按钮
复制代码到之前的布局代码的下面
<Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="116dp"android:layout_marginEnd="40dp"android:layout_marginRight="40dp"android:text="暂停音乐"app:layout_constraintBottom_toBottomOf="@+id/button"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent" />
第二步,调用pause方法暂停音乐
Button button1=findViewById(R.id.button2);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//暂停音乐mMediaPlayer.pause();}});
运行(仔细看悬浮球,在点击暂停后音频波浪不再变化)
但是这里暂停以后再点击播放音乐,会重新加载音乐,也就是从头播放音乐,这个问题下面来解决
3.继续播放音乐
实际上很简单,只需要加一个if判断语句,只在mMediaPlayer==null重新加载文件,不等于空时直接播放,不需要重新加载
Button button=findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMediaPlayer == null) {mMediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.a1);}//播放音乐mMediaPlayer.start();}});
运行(这里好像不能证明是继续播放,哈哈,相信我,一定可以的)
还有一个问题(如果我们运行程序后直接点击暂停文件,会出现闪退)
原因在于,因为一开始我们没有点击播放音乐的话,实际上就没有加载MediaPlayer加载文件,所以直接点击暂停音乐会报空指针错误
解决方法,用if判断,只在MediaPlayer不为空的时候调用pause方法
Button button1=findViewById(R.id.button2);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//因为一开始没有播放音乐的时候,实际上就没有加载音频文件,所以点击暂停会报空指针if (mMediaPlayer !=null) {//暂停音乐mMediaPlayer.pause();}}});
4.获取播放时间
在实现一个进度条的时候,需要获取歌曲当前播放时间和歌曲的总时长
//获取音乐当前播放的时间Log.i("Mainactivity","当前播放时间:"+mMediaPlayer.getCurrentPosition()+"ms");//获取音乐总时长Log.i("Mainactivity","总时长:"+mMediaPlayer.getDuration()+"ms");
5.快进到指定位置
在实现一个拖动进度条来改变音乐播放的位置时,我们需要音乐跳到指定位置,需要用到seekto 这个方法
Button button1=findViewById(R.id.button2);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//快进到50秒的位置mMediaPlayer.seekTo(50*1000);//获取音乐当前播放的时间Log.i("Mainactivity","当前播放时间:"+mMediaPlayer.getCurrentPosition()+"ms");//获取音乐总时长Log.i("Mainactivity","总时长:"+mMediaPlayer.getDuration()+"ms");}});
运行(点击暂停按钮(实际上是快进),可以看打印日志,音乐快进到了50秒的位置)
6.变速播放
Button button1=findViewById(R.id.button2);button1.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.M)@Overridepublic void onClick(View v) {PlaybackParams playbackParams=mMediaPlayer.getPlaybackParams();playbackParams.setSpeed(3.0f);// 3 倍速播放mMediaPlayer.setPlaybackParams(playbackParams);//获取音乐当前播放的时间Log.i("Mainactivity","当前播放时间:"+mMediaPlayer.getCurrentPosition()+"ms");//获取音乐总时长Log.i("Mainactivity","总时长:"+mMediaPlayer.getDuration()+"ms");}});
这里报了个错,表示只有在手机版本在23或者以上才能运行
我们只需要按住alt+enter,添加注释就可以了
运行(可以发现两次播放时间跨度比正常时间大)
7.播放data/data/目录下的音频文件
第一步,上传文件
第二步,拿到音频文件的位置,并且捕获异常
Button button=findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMediaPlayer == null) {mMediaPlayer=new MediaPlayer();try {mMediaPlayer.setDataSource("data/data/com.c201801020224.myapplication/a1.mp3");mMediaPlayer.prepare();//先缓冲一下} catch (IOException e) {e.printStackTrace();}}//播放音乐mMediaPlayer.start();}});
运行
8.播放网络歌曲
第一步,添加权限
<uses-permission android:name="android.permission.INTERNET"/>
application结点下添加
android:usesCleartextTraffic="true"
第二步,获取网络歌曲
Button button=findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMediaPlayer == null) {mMediaPlayer=new MediaPlayer();try {mMediaPlayer.setDataSource("http://148.70.46.9/123.mp3");//网络歌曲地址mMediaPlayer.prepareAsync();//异步缓冲mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//监听是否缓冲完毕,缓冲完成再播放音乐@Overridepublic void onPrepared(MediaPlayer mp) {//播放音乐mMediaPlayer.start();}});} catch (IOException e) {e.printStackTrace();}}}});
第三步,卸载应用(因为添加了权限,所以需要重新生成应用)
第四步,运行(可能开始缓冲会比本地速度慢一点)
关于音频播放就先讲到这里啦,下一讲我们讲视频播放,谢谢您的阅读。
附一张麦迪帅照
Android 入门第九讲02-视频(本地视频播放,暂停,获取播放时间,重新播放,播放到指定位置,MediaController类(实现进度条,快进,播放暂停),播放网络视频)
博主为了可以学到更多的Android知识,创建了一个安卓知识交流群,欢迎大佬入群,当然也欢迎和我一样的安卓小白,我们可以一起交流,最重要的是快乐水群,记得定个小目标,冲击bat
Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)相关推荐
- Android 入门第二讲03-约束布局ConstraintLayout(可视化介绍,Chains链,MATCH_CONSTRAIN,百分比布局,圆形定位,Guideline,Barrier)
Android 入门第二讲03-约束布局ConstraintLayout(可视化介绍,Chains链,MATCH_CONSTRAIN,百分比布局,圆形定位,Guideline,Barrier) 1.可 ...
- Java Web基础入门第九讲 Java Web开发入门——再探Tomcat服务器
web应用程序 web应用程序指供浏览器访问的程序,通常也简称为web应用.例如有a.html.b.html--多个web资源,这多个web资源用于对外提供邮件服务,此时应把这多个web资源放在一个目 ...
- android读取mysql数据库文件_Android开发系列(十七):读取assets目录下的数据库文件...
在做Android应用的时候,不可避免要用到数据库.但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客解决了我前面博客中 ...
- 安卓平板倍速_推荐:安卓上本地音频播放器,可实现5秒快进快退和倍速播放...
前一篇文章推荐过一个app,但那app没倍速播放功能.我又找到了一个更完美的app 安卓手机上我自己需要这样一款app,主要用来听电子书,知识音频等.需要能实现快进快退几秒钟的以及倍速播放功能.这功能 ...
- Android高级第九讲--JVM 与Android Dalvik之间的异同
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有些东西不是不知道,是还没用到,所以才没去仔细了解,昨天被问及 ...
- Android中级第九讲--相机调焦
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 相机调焦:原理,使用竖直seekbar,根据用户拖拉来获得距离 ...
- python编程入门第九讲,第九讲作业---函数
# 1.用函数实现判断用户输入的年份是否是闰年? def fn(): year = int(input('请随意输入一个年份:')) if year%400 == 0 or (year%4 == 0 ...
- python编程入门第九讲_python 基础 19 习题9 讲解
第9次课编程题 梳理编程思路 1.把老虎的类建好 2.把羊的类建好 3.把房间的类建好 4.把老虎或羊放入房间 5.写游戏的相关代码 class Tiger: def init(self): self ...
- android json 解析图片路径,Android 使用Gson解析Asset 目录下的.json文件
配合Rxjava,直接代码 Observable.create((ObservableOnSubscribe) e -> { StringBuilder stringBuilder = new ...
最新文章
- oracle集群图例
- 今晚直播 | 清华大学NLP组秦禹嘉:基于自然语言解释的数据增强
- 基于HTML5技术的电力3D监控应用(二)
- 【CodeForces - 558C】Amr and Chemistry(位运算,bfs,计数,思维,tricks)
- html如何设置三列列宽相等,CSS分割宽度100%到3列
- oc代码混淆_OC代码混淆工具
- IEEE 研究类型 小木虫
- 痛与快乐有一个代码是什么_痛与快乐有一个代码是什么_痛苦与快乐
- 微信公众号前端html,微信公众号开发(前端)
- C#监控设备(PLC)状态仿真模拟器
- Youtube——如何将视频中的英文字幕转换成中文字幕
- 终端不需要主机的服务器,要实现云桌面需要哪些硬件?云终端必不可少
- 设置表格单元格的背景颜色
- 恢复PyCharm顶部菜单栏
- 接口文档编辑工具+接口文档编写
- python getA() 函数
- 5-ipv6服务器之-dns
- found duplicated code in this file
- 【程序设计】浅拷贝与深拷贝
- 谷歌员工年薪中位数近190万元!科技公司年薪排行,哪家强?
热门文章
- java计算机毕业设计Vue垃圾分类指南平台设计与实现源码+数据库+系统+lw文档
- linux无法运行sssverify,Synopsys Design Compiler在fedora Core 9下面的安装
- 多台路由器,不同网段的设备之间如何互访?
- html5 运动轨迹绘画,冷知识|简单几步教你用跑步轨迹绘画,用跑画刷爆你的朋友圈!...
- ubuntu18.04 安装软件中心(software-center)
- 怎样记账才能清楚、简单
- 汽车之家精选论坛图片下载
- (2019春)软件构造:雨课堂试卷(第3章)
- ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)
- getcount php,物联网方案之“Android+Apache服务器(PHP+Mysql)+Arduino(+以太网盾板)”(四.点播客户端)...