Android中的MediaPlayer的使用详解

Android中的MediaPlayer的使用详解今天本文介绍的是Andriod系统自带的Mediaplayer,和VideoView实现简单的音乐和视频的播放,至于想做出如酷狗音乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer来实现的。一、播放音频文件首先看看MediaPlaer的生命周期下面是MediaPlayer提供的常用方法方法

今天本文介绍的是Andriod系统自带的Mediaplayer,和VideoView实现简单的音乐和视频的播放,至于想做出如酷狗音乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。

Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer来实现的。

一、播放音频文件

     首先看看MediaPlaer的生命周期

在这里插入图片描述

下面是MediaPlayer提供的常用方法

方法 说明
MediaPlayer 构造方法
create 创建一个要播放的多媒体
getCurrentPosition 得到当前播放位置
getDuration 得到文件的时间
getVideoHeight 得到视频的高度
getVideoWidth 得到视频的宽度
isLooping 是否循环播放
isPlaying 是否正在播放
pause 暂停
prepare 准备(同步)
prepareAsync 准备(异步)
release 释放MediaPlayer对象相关的资源
reset 重置MediaPlayer对象为刚刚创建的状态
seekTo 指定播放的位置(以毫秒为单位的时间)
setAudioStreamType 设置流媒体的类型
setDataSource 设置多媒体数据来源(位置)
setDisplay 设置用SurfaceHolder来显示多媒体
setLooping 设置是否循环播放
setOnButteringUpdateListener 网络流媒体的缓冲监听
setOnErrorListener 设置错误信息监听
setOnVideoSizeChangedListener 视频尺寸监听
setScreenOnWhilePlaying 设置是否使用SurfaceHolder来保持屏幕显示
setVolume 设置音量
start 开始播放
stop 停止播放

MediaPlayer的工作流程是这样的:

1、首先创建MediaPlaer对象;

2、然后调用setDataSource()方法来设置音频文件的路径;

3 、再调用prepare()方法使MediaPlayer进入到准备状态;

4 、调用start方法就可以播放音频。

创建MediaPlaer对象有两种方式

1、直接new出来

MediaPlayer mp = new MediaPlayer();  

2、使用create方式

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了 

当然上面首先得在res文件夹下新建raw文件夹,并放置一个test文件

设置播放的文件

MediaPlayer要播放的文件主要包括3个来源:

a. 用户在应用中事先自带的resource资源

例如:

MediaPlayer.create(this, R.raw.test);

b. 存储在SD卡或其他文件路径下的媒体文件

例如:

mp.setDataSource("/sdcard/test.mp3");

c. 网络上的媒体文件

例如:

mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

MediaPlayer的setDataSource一共四个方法:

setDataSource (String path) 
setDataSource (FileDescriptor fd) 
setDataSource (Context context, Uri uri) 
setDataSource (FileDescriptor fd, long offset, long length)
 

其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

下面是实现代码

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:layout_margin="3dp"  
    android:orientation="vertical" >  
  
    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:orientation="horizontal" >  
  
        <Button  
            android:id="@+id/play"  
            android:layout_width="0dp"  
            android:layout_height="wrap_content"  
            android:layout_weight="1"  
            android:text="播放" />  
  
        <Button  
            android:id="@+id/pause"  
            android:layout_width="0dp"  
            android:layout_height="wrap_content"  
            android:layout_weight="1"  
            android:text="暂停" />  
  
        <Button  
            android:id="@+id/stop"  
            android:layout_width="0dp"  
            android:layout_height="wrap_content"  
            android:layout_weight="1"  
            android:text="停止" />  
    </LinearLayout>  
  
    <SeekBar  
        android:id="@+id/seekbar"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:max="0"  
        android:progress="0"  
        android:secondaryProgress="0" />  
  
    <RelativeLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content" >  
  
        <TextView  
            android:id="@+id/tv"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:text="当前时间" />  
  
        <TextView  
            android:id="@+id/tv2"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentRight="true"  
            android:text="总时间" />  
    </RelativeLayout>  
  
</LinearLayout>  

MainActivity.java

package com.example.musicplayer;  
  
import java.io.File;  
import java.io.IOException;  
  
import android.R.integer;  
import android.app.Activity;  
import android.media.MediaPlayer;  
import android.os.Bundle;  
import android.os.Environment;  
import android.os.Handler;  
import android.os.Message;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.SeekBar;  
import android.widget.SeekBar.OnSeekBarChangeListener;  
import android.widget.TextView;  
  
public class MainActivity extends Activity implements OnClickListener,  
        OnSeekBarChangeListener { 
     
    private Button play, pause, stop;  
    private MediaPlayer player;  
    private SeekBar mSeekBar;  
    private TextView tv, tv2;  
    private boolean hadDestroy = false;  
    private Handler mHandler = new Handler() { 
     
        public void handleMessage(android.os.Message msg) { 
     
  
            switch (msg.what) { 
     
            case 0x01:  
  
                break;  
  
            default:  
                break;  
            }  
        };  
    };  
    Runnable runnable = new Runnable() { 
     
  
        @Override  
        public void run() { 
     
  
            if (!hadDestroy) { 
     
                mHandler.postDelayed(this, 1000);  
                int currentTime = Math  
                        .round(player.getCurrentPosition() / 1000);  
                String currentStr = String.format("%s%02d:%02d", "当前时间 ",  
                        currentTime / 60, currentTime % 60);  
                tv.setText(currentStr);  
                mSeekBar.setProgress(player.getCurrentPosition());  
            }  
        }  
    };  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) { 
     
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        play = (Button) findViewById(R.id.play);  
        pause = (Button) findViewById(R.id.pause);  
        stop = (Button) findViewById(R.id.stop);  
        mSeekBar = (SeekBar) findViewById(R.id.seekbar);  
        tv = (TextView) findViewById(R.id.tv);  
        tv2 = (TextView) findViewById(R.id.tv2);  
        mSeekBar.setOnSeekBarChangeListener(this);  
        play.setOnClickListener(this);  
        pause.setOnClickListener(this);  
        stop.setOnClickListener(this);  
        player = new MediaPlayer();  
        initMediaplayer();  
  
    }  
  
    /** * 初始化播放器 */  
    private void initMediaplayer() { 
     
        try { 
     
            File file = new File(Environment.getExternalStorageDirectory()  
                    + "/Download/", "aiqiu.mp3");  
            player.setDataSource(file.getPath());  
            Log.e("播放器", file.toString());  
            player.prepare();  
        } catch (Exception e) { 
     
            e.printStackTrace();  
        }  
    }  
  
    @Override  
    public void onClick(View v) { 
     
        switch (v.getId()) { 
     
        case R.id.play:  
            if (!player.isPlaying()) { 
     
                player.start();  
                int totalTime = Math.round(player.getDuration() / 1000);  
                String str = String.format("%02d:%02d", totalTime / 60,  
                        totalTime % 60);  
                tv2.setText(str);  
                mSeekBar.setMax(player.getDuration());  
                mHandler.postDelayed(runnable, 1000);  
            }  
  
            break;  
        case R.id.pause:  
            if (player.isPlaying()) { 
     
                player.pause();  
            }  
            break;  
        case R.id.stop:  
            if (player.isPlaying()) { 
     
                player.reset();  
                initMediaplayer();  
            }  
            break;  
  
        default:  
            break;  
        }  
    }  
  
    @Override  
    public void onProgressChanged(SeekBar seekBar, int progress,  
            boolean fromUser) { 
     
        if (player != null) { 
     
            player.seekTo(seekBar.getProgress());  
        }  
  
    }  
  
    @Override  
    public void onStartTrackingTouch(SeekBar seekBar) { 
     
        // TODO 自动生成的方法存根 
  
    }  
  
    @Override  
    public void onStopTrackingTouch(SeekBar seekBar) { 
     
        // TODO 自动生成的方法存根 
    }  
  
    @Override  
    protected void onDestroy() { 
     
        // TODO 自动生成的方法存根 
        super.onDestroy();  
        if (player != null) { 
     
            player.stop();  
            hadDestroy = true;  
            player.release();  
        }  
    }  
}  

二、播放视频文件

 播放视频文件相比播放音频文件并不比它复杂,
 这里使用VideoView类来实现。这个类将视频的显示和控制集于一身。
 VideoView和MediaPlaer也比较类似,主要有以下常用方法
方法名 功能描述
setVideoPath() 设置要播放的视频文件的位置。
start() 开始或继续播放视频。
pause() 暂停播放视频。
resume() 将视频重头开始播放。
seekTo() 从指定的位置开始播放视频。
isPlaying() 判断当前是否正在播放视频。
getDuration() 获取载入的视频文件的时长。

因为VideoView是包装过的MediaPlayer,所以使用起来很相似。
比如:

private void initVideoPlayer() { 
     
        File file = new File(Environment.getExternalStorageDirectory()  
                + "/Download/", "Sample.3gp");  
        videoPlayer.setVideoPath(file.getPath());// 指定视频文件的路径 
    }  

事件处理

@Override  
 public void onClick(View v) { 
     
        switch (v.getId()) { 
     
        case R.id.play:  
            if (!videoPlayer.isPlaying()) { 
     
                videoPlayer.start();  
            }  
            break;  
        case R.id.pause:  
            if (videoPlayer.isPlaying()) { 
     
                videoPlayer.pause();  
            }  
            break;  
        case R.id.stop:  
            if (videoPlayer.isPlaying()) { 
     
                videoPlayer.resume();  
            }  
            break;  
        default:  
            break;  
        }  
    }  

三、常见的MediaPlayer错误

    也就是它的错误状态。比如这样的错误 start called in state 0,0表示他的错误状态,下面是MediaPlayer的状态,源码中找到的:
enum media_player_states { 
     
       MEDIA_PLAYER_STATE_ERROR        = 0,           // 0状态 
       MEDIA_PLAYER_IDLE               = 1 << 0,     // 1状态 
       MEDIA_PLAYER_INITIALIZED        = 1 << 1,    // 2 状态 
       MEDIA_PLAYER_PREPARING          = 1 << 2,    // 4 状态 
       MEDIA_PLAYER_PREPARED           = 1 << 3,   // 8状态 
       MEDIA_PLAYER_STARTED            = 1 << 4,   // 16状态 
       MEDIA_PLAYER_PAUSED             = 1 << 5,  // 32状态 
       MEDIA_PLAYER_STOPPED            = 1 << 6,  // 64 状态 
       MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 7,  // 128 状态 
   }  
可以参照报错的状态和MediaPlayer的生命周期(上图)进行错误分析。

今天的文章Android中的MediaPlayer的使用详解分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24439.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注