Android之MediaPlayer的简单介绍之播放音乐

来源:互联网 发布:双系统windows引导修复 编辑:程序博客网 时间:2024/05/27 16:43

Android实现简单音乐播放器(MediaPlayer)

开发工具:Andorid Studio 1.3
运行环境:Android 4.4 KitKat

工程内容

实现一个简单的音乐播放器,要求功能有:

  • 播放、暂停功能;
  • 进度条显示播放进度功能
  • 拖动进度条改变进度功能;
  • 后台播放功能;
  • 停止功能;

  • 退出功能;

Android多媒体之MediaPlayer

 

         Android应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。Android提供了常见音频,视频的编码,解码机制,Android支持的音频格式有MP3,WAV3GP等,支持的视频格式有MP43GP等。                                             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)调用ContextgetAssets()获取AssetManager;

    b)调用AssetManageropenFd(String name)方法打开指定的原生资源.返回AssetFileDescriptor对象

    c)调用AssetFileDescriptorgetFileDescriptor()方法来获取音频文件的FileDescriptor.

    d)创建MediaPlayer对象,调用setDataSource(FileDescriptor)方法。

    e)调用MediaPlayerprepare()方法准备音频

    f)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

  5)播放外部存储器上音频文件

    a)创建MediaPlayer对象,调用setDataSource("/sdcard/apple.mp3")

    b)调用MediaPlayer对象的prepare()方法

    c)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

  6)播放来自网络的音频文件

    a)根据网络上的音频文件所在的位置创建Uri对象。

      Uri  uri = Uri.parse("http://www.baidu.com/song.mp3");

    b)创建MediaPlayer对象,调用setDataSource(Context,Uri);

    c)调用MediaPlayer对象的prepare()方法

    d)调用MediaPlayerstart(),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" />








1 1