MediaPlayer

MediaPlayer 可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用 MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。 SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <SeekBar
        android:id="@+id/seb1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    
    <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button 
            android:id="@+id/btn_audio_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="播放音频"
            />
        <Button 
            android:id="@+id/btn_audio_stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="停止播放"
            />
    </LinearLayout>

    <SurfaceView 
        android:id="@+id/suf"
        android:layout_width="match_parent"
            android:layout_height="200dp"
        />
    <SeekBar
        android:id="@+id/seb2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    
       <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button 
            android:id="@+id/btn_video_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="播放视频"
            />
        <Button 
            android:id="@+id/btn_video_stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="停止播放"
            />
    </LinearLayout>
</LinearLayout>

主Activity:

package com.example.testmediaplayer2;


import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Toast;


public class MediaActivity extends Activity implements OnClickListener{


private SeekBar mSekAudio;
private Button mBtnStartAudio;
private Button mBtnStopAudio;
private SeekBar mSekVidio;
private Button mBtnStartVidio;
private Button mBtnStopVidio;
private SurfaceView mSurView;
private SurfaceHolder mSurViewHolder;
private MediaPlayer mPlayer;
private boolean isChange = false; //互斥变量,防止定时器与SeekBar拖动时进度冲突
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mSekAudio = (SeekBar) findViewById(R.id.seb1);
mBtnStartAudio = (Button) findViewById(R.id.btn_audio_start);
mBtnStopAudio = (Button) findViewById(R.id.btn_audio_stop);
mSekVidio = (SeekBar) findViewById(R.id.seb2);
mBtnStartVidio = (Button) findViewById(R.id.btn_video_start);
mBtnStopVidio = (Button) findViewById(R.id.btn_video_stop);
mSurView = (SurfaceView) findViewById(R.id.suf);
mSurViewHolder = mSurView.getHolder();
mSurViewHolder.setFixedSize(200, 200);
mSurViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

mSurViewHolde.setKeepScreenOn(true)  //避免锁屏

//----------Media控件设置---------//
mPlayer = new MediaPlayer();
//播放结束之后弹出提示
/*mPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
Toast.makeText(MediaActivity.this, "play over", Toast.LENGTH_SHORT).show();
mPlayer.release();//释放
}
});*/
mBtnStartAudio.setOnClickListener(this);
mBtnStopAudio.setOnClickListener(this);
mBtnStartVidio.setOnClickListener(this);
mBtnStopVidio.setOnClickListener(this);

mSekAudio.setOnSeekBarChangeListener(new OnSeekBarChangeEvent());
mSekAudio.setOnSeekBarChangeListener(new OnSeekBarChangeEvent());

//----------定时器记录播放进度---------//
Timer timer = new Timer();
TimerTask task = new TimerTask(){


@Override
public void run() {
// TODO Auto-generated method stub
if(isChange){
return;
}
if(mPlayer.getVideoHeight() == 0){
mSekAudio.setProgress(mPlayer.getCurrentPosition());
}else{
mSekVidio.setProgress(mPlayer.getCurrentPosition());
}
}

};
timer.schedule(task,0,10);
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mPlayer.release();
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_audio_start:
{
mPlayer.reset(); //恢复到未初始化的状态 ,MediaPlayer从error状态到idle状态
mPlayer = MediaPlayer.create(MediaActivity.this,R.raw.a );
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mSekAudio.setMax(mPlayer.getDuration());
mPlayer.start();
}
break;
case R.id.btn_audio_stop:
{
if(mPlayer != null){
mPlayer.stop();
}
}
break;
case R.id.btn_video_start:
{
mPlayer.reset();
mPlayer = MediaPlayer.create(MediaActivity.this,R.raw.b);
mPlayer.setDisplay(mSurViewHolder); //设置屏幕
mSekVidio.setMax(mPlayer.getDuration());
try {
mPlayer.prepare(); //准备,同步调用
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mSekAudio.setMax(mPlayer.getDuration());
mPlayer.start();
}
break;
case R.id.btn_video_stop:
{
if(mPlayer != null){
mPlayer.stop();
}
}
break;
default:
break;
}
}


class OnSeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
mPlayer.seekTo(seekBar.getProgress());
isChange = false;
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
isChange = true;
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub

}
};


}

/********************************MediaPlayer的使用***************************************/

Android MediaPlayer使用方法简单介绍

1)如何获得MediaPlayer实例:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
 

2) 如何设置要播放的文件:
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());
来设置datasource
 
3)对播放器的主要控制方法:
Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,
pause()和stop()比较简单,起到暂停和停止播放的作用,

seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。

4)设置播放器的监听器:
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、
setOnErrorListener(MediaPlayer.OnErrorListener listener),setOnInfoListener(MediaPlayer.OnInfoListener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值