Android之MediaPlayer的简单介绍之播放音乐
来源:互联网 发布:双系统windows引导修复 编辑:程序博客网 时间:2024/05/27 16:43
Android实现简单音乐播放器(MediaPlayer)
开发工具:Andorid Studio 1.3
运行环境:Android 4.4 KitKat
工程内容
实现一个简单的音乐播放器,要求功能有:
- 播放、暂停功能;
- 进度条显示播放进度功能
- 拖动进度条改变进度功能;
- 后台播放功能;
- 停止功能;
- 退出功能;
Android多媒体之MediaPlayer
Android应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。Android提供了常见音频,视频的编码,解码机制,Android支持的音频格式有MP3,WAV和3GP等,支持的视频格式有MP4和3GP等。 Android提供了这些多媒体的支持类,可以非常方便地在手机应用中播放音频,视频等。这些多媒体数据可以来自Android应用的资源文件,也可以来自外部存储器上的文件,也可以来自网络的文件流。
不仅如此,Android也提供了对摄像头,麦克风的支持,因此也可以十分方便地从外部采集照片,视频,音频等多媒体信息。
——音频和视频的播放
——MediaPlayer播放音频
1)MediaPalyer进行播放控制的方式:
start():开始或者恢复播放
stop():停止播放
pause():暂停播放
2)MediaPlayer装载指定音频文件的方式
static MediaPlayer create(Content,Uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。
static MediaPlayer create(Content,int resid):从redid资源ID来装载音频文件,并返回新创建的MediaPlayer对象。
上面这两个方法使用起来很简单,但这两个方法每次都会返回新的MediaPlayer.如果程序需要播放多个音频文件,使用该方法就不太合适了。此时可通过setDataSource方法装载指定的音频文件。
MediaPlayer m = new MediaPlayer():只需要创建一个对象
setDataSource(String path):指定装载path路径所代表的文件
setDataSource(FileDescriptor fs,long offset,long length):指定装载fd所代表的文件中从offset开始,长度为length的文件内容。
setDataSource(FileDescriptor fd):指定装载fd所代表的文件
setDataSource(Context,Uri):指定装载Uri所代表的文件
执行setDataSource方法之后,MediaPlayer并未真正装载那些音频文件,还需要调用prepare()方法准备装载音频。
3)播放应用raw的资源文件
MediaPlayer m=MediaPlayer.create(this,R.raw.apple);
m.start();
4)播放应用raw的资源文件
MediaPlayer m=new MediaPlayer();
m.setDataSource(Context,Uri.parse(
"android.resource://"+getPackageName()+"/"+R.raw.apple"))
5)播放应用的原始资源文件
a)调用Context的getAssets()获取AssetManager;
b)调用AssetManager的openFd(String name)方法打开指定的原生资源.返回AssetFileDescriptor对象
c)调用AssetFileDescriptor的getFileDescriptor()方法来获取音频文件的FileDescriptor.
d)创建MediaPlayer对象,调用setDataSource(FileDescriptor)方法。
e)调用MediaPlayer的prepare()方法准备音频
f)调用MediaPlayer的start(),stop(),pause()方法控制播放即可
5)播放外部存储器上音频文件
a)创建MediaPlayer对象,调用setDataSource("/sdcard/apple.mp3")
b)调用MediaPlayer对象的prepare()方法
c)调用MediaPlayer的start(),stop(),pause()方法控制播放即可
6)播放来自网络的音频文件
a)根据网络上的音频文件所在的位置创建Uri对象。
Uri uri = Uri.parse("http://www.baidu.com/song.mp3");
b)创建MediaPlayer对象,调用setDataSource(Context,Uri);
c)调用MediaPlayer对象的prepare()方法
d)调用MediaPlayer的start(),stop(),pause()方法控制播放即可
7)如播放下一首歌曲的代码:
mPlayer.reset();//空闲状态
mPlayer.setDataSource("/sdcard/gequ.mp3");
mPlayer.prepare();
mPlayer.start();
8)MediaPlayer还提供了事件监听器的方法
setOnCompletionListener():播放完成事件绑定事件监听器
setOnErrorListener():播放错误事件绑定事件监听器
setOnPreparedListener():调用prepare()方法时触发该监听器
setOnSeekCompleteListener():调用seek()方法时触发该监听器
9)Mediaplayer除了调用prepare()方法准备声音之外,
还可以调用
prepareAsync()来准备声音,他们的区别在于:
prepareAsync()是异步的,它不会阻塞当前的UI线程。
10)MediaPlayer的状态图
reset():清空MediaPlayer中的数据
setDataSource():设置音频数据
prepare():准备装载音频数据
prepareAsync():准备装载音频数据(异步)
seekTo():重新定位到音频数据的什么位置,单位毫秒
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
start():
pause():
stop():
release():释放MediaPlayer资源
11)其他的方法
setLooping(true):是否重复播放
setAudioStreamType()设置使用的音频流
A(播放音乐的界面)—>B
onPause()—>onCreate,onStart/onResume
—>onStop
实例:
简单布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_mediaplayer" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.myapplication.MediaPlayerActivity"> <SeekBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/seekBar" android:layout_weight="1" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/ic_media_play" android:onClick="isPlayOrPause" /></LinearLayout>
MediaPlayerActivity:
package com.example.myapplication;import android.media.AudioManager;import android.media.MediaPlayer;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;import java.io.IOException;public class MediaPlayerActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; private SeekBar seekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mediaplayer); seekBar= (SeekBar) findViewById(R.id.seekBar); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { //获取拖动结束之后的位置 int progress=seekBar.getProgress(); //跳转到某个位置播放 mediaPlayer.seekTo(progress); } }); } public void isPlayOrPause(View view){ final ImageButton imageButton=(ImageButton)view; if(mediaPlayer==null){ //实例化MediaPlayer //播放应用内 // mediaPlayer=MediaPlayer.create(this,R.raw.abc); //播放内存卡中音频文件 mediaPlayer=new MediaPlayer(); //设置音源 try { // mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/Music/f.mp3")); //播放网络音乐 mediaPlayer.setDataSource(this, Uri.parse("http://192.168.43.234:8080/abc.mp3")); //准备一下(内存卡)// mediaPlayer.prepare(); //准备(网络) mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); //把图标修改为暂停的图标 imageButton.setImageResource(android.R.drawable.ic_media_pause); //获取音乐的总时长 int duration=mediaPlayer.getDuration(); //设置进度条的最大值为音乐的总时长 seekBar.setMax(duration); new MyThread().start(); } }); }else if(mediaPlayer.isPlaying()){ mediaPlayer.pause(); imageButton.setImageResource(android.R.drawable.ic_media_play); }else{ mediaPlayer.start(); imageButton.setImageResource(android.R.drawable.ic_media_pause); } } class MyThread extends Thread{ @Override public void run() { super.run(); while (seekBar.getProgress()<=seekBar.getMax()){ //获取当前音乐播放的位置 int currentPosition=mediaPlayer.getCurrentPosition(); //让进度条动起来 seekBar.setProgress(currentPosition); } } }}别忘了加联网的权限哦<!-- 联网的权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- Android之MediaPlayer的简单介绍之播放音乐
- Android之MediaPlayer的简单介绍之播放音乐
- Android之MediaPlayer(多媒体之音乐播放)
- android MediaPlayer实现简单的音乐播放
- Android之Mediaplayer音乐播放器
- Android开发学习之路--MediaPlayer之简单音乐播放器初体验
- 音乐播放器之简单播放(MediaPlayer、Service、BroadcastRecevier的结合用法)
- Android之多媒体MediaPlayer(一个简单的音乐播放器)
- Android之MediaPlayer播放音乐并实现进度条实例
- android学习之利用MediaPlayer制作音乐播放器
- Android仿虾米音乐播放器之MediaPlayer使用
- 传智播客 Android 音乐播放器笔记 之mediaplayer
- Android之MediaPlayer播放音乐并实现进度条实例
- Android开发---MediaPlayer简单音乐播放器
- Android实现简单音乐播放器(MediaPlayer)
- Android开发---MediaPlayer简单音乐播放器
- Android实现简单音乐播放器(MediaPlayer)
- MediaPlayer简单的音乐播放器
- linux学习笔记(2)
- {模板}long long快速乘?
- jquery源码----初步认识源码
- OpenWRT(十一)LuCi开发(一)
- 【Python】Centos7下部署Django(nginx+gunicorn)
- Android之MediaPlayer的简单介绍之播放音乐
- Python自学笔记六、socket编程
- js下的冒泡排序与选择排序
- CentOS 6.5下安装KVM
- nginx端口转发内网使用yum
- 批量修改文件夹名称
- 算法提高 学霸的迷宫
- 每日170209
- 正则的捕获