MediaPlayer MediaController

来源:互联网 发布:淘宝店铺规格怎么填写 编辑:程序博客网 时间:2024/05/09 14:19

最近为了比较全面的了解一下Android的知识体系结构,买了一个Android4 高级编程研读一下,在学习第十五章音频、视频以及摄像头的使用的时候,书本上的MediaPlayer和MediaController联合使用的例子没有调通。搜索良久找到答案在此记录一下。

1.MediaPlayer 播放视频

使用的布局文件如下:

<?xml version="1.0" encoding="utf-8"?><!-- Listing 15-3: Sample layout using a Surface View --><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <SurfaceView        android:id="@+id/surfaceView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_weight="30" />    <LinearLayout        android:id="@+id/ll"        android:layout_width="match_parent"        android:layout_height="100dp"        android:orientation="horizontal" >    </LinearLayout></LinearLayout>

相关Java代码如下:

package com.paad.mediaplayer;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.widget.MediaController;import constant.Constants;public class AudioPlayer extends Activity implements OnPreparedListener,        MediaController.MediaPlayerControl {    private static final String TAG = "AudioPlayer";    private MediaPlayer mediaPlayer;    private MediaController mediaController;    private Handler handler = new Handler();    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.surfaceviewvideoviewer);        mediaPlayer = new MediaPlayer();        mediaPlayer.setOnPreparedListener(this);        try {            //TODO 这里填写你的本地视频文件路径            mediaPlayer.setDataSource(Constants.PATH_VEDIO);            mediaPlayer.prepare();            mediaPlayer.start();        } catch (IOException e) {            Log.e(TAG, "Could not open file xxx for playback.", e);        }        final SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);        surfaceView.setKeepScreenOn(true);        SurfaceHolder surfaceHolder = surfaceView.getHolder();        surfaceHolder.addCallback(new SurfaceHolder.Callback() {            @Override            public void surfaceDestroyed(SurfaceHolder holder) {                mediaPlayer.release();            }            @Override            public void surfaceCreated(SurfaceHolder holder) {                mediaPlayer.setDisplay(holder);            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format,                    int width, int height) {                // TODO Auto-generated method stub            }        });        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        surfaceHolder.setFixedSize(400, 300);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        // the MediaController will hide after 3 seconds - tap the screen to        // make it appear again        mediaController.show();        return false;    }    // --MediaPlayerControl    // methods----------------------------------------------------    public void start() {        mediaPlayer.start();    }    public void pause() {        mediaPlayer.pause();    }    public int getDuration() {        return mediaPlayer.getDuration();    }    public int getCurrentPosition() {        return mediaPlayer.getCurrentPosition();    }    public void seekTo(int i) {        mediaPlayer.seekTo(i);    }    public boolean isPlaying() {        return mediaPlayer.isPlaying();    }    public int getBufferPercentage() {        return 0;    }    public boolean canPause() {        return true;    }    public boolean canSeekBackward() {        return true;    }    public boolean canSeekForward() {        return true;    }    // --------------------------------------------------------------------------------    public void onPrepared(MediaPlayer mediaPlayer) {        Log.d(TAG, "onPrepared");        mediaController = new MediaController(this);        mediaController.setMediaPlayer(this);        mediaController.setAnchorView(findViewById(R.id.ll));        mediaController.setEnabled(true);        handler.post(new Runnable() {            public void run() {                mediaController.show();            }        });    }    @Override    public int getAudioSessionId() {        // TODO Auto-generated method stub        return 0;    }}

代码罗列在这里了,我还想啰嗦几句:
1.OnPreparedListener不是必须的,主要是为mediaController.show();服务的,将onPrepared中的代码块移动到onCreate里面也是ok的,但是,要做稍微的调整,将handler.post修改为了handler.postDelayed,设置一个延迟执行的时间(让mediaPlayer完成播放前的初始化)也是ok的。
2.至于为什么在代码初始化后,调用mediaController.show()必须放到handler.post中,我猜想是因为mediaController的初始化也是通过handler机制进行更新的,通过handler是通过队列机制对消息进行处理了,这样就保证了mediaController的初始化和mediaController.show的顺序。
3.至于为什么将mediaPlayer.setDisplay(holder);设置放到surfaceCreated方法中,SurfaceView的创建是异步的,实例化后,并没有完成创建。

2.MediaPlayer播放音频

这个就要简单的多了,不需要SurfaceView来展示视频了,下面贴一下代码:

package com.paad.mediaplayer;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.MotionEvent;import android.widget.LinearLayout;import android.widget.MediaController;import constant.Constants;public class AudioPlayer extends Activity implements OnPreparedListener,        MediaController.MediaPlayerControl {    private static final String TAG = "AudioPlayer";    private MediaPlayer mediaPlayer;    private MediaController mediaController;    private Handler handler = new Handler();    private LinearLayout mControllLayout;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mControllLayout=new LinearLayout(this);        setContentView(mControllLayout);        mediaPlayer = new MediaPlayer();        mediaPlayer.setOnPreparedListener(this);        try {            //TODO 这里写你的音频路径            mediaPlayer.setDataSource(Constants.PATH_AUDIO);            mediaPlayer.prepare();            mediaPlayer.start();        } catch (IOException e) {            Log.e(TAG, "Could not open file xxx for playback.", e);        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        // the MediaController will hide after 3 seconds - tap the screen to        // make it appear again        mediaController.show();        return false;    }    // --MediaPlayerControl    // methods----------------------------------------------------    public void start() {        mediaPlayer.start();    }    public void pause() {        mediaPlayer.pause();    }    public int getDuration() {        return mediaPlayer.getDuration();    }    public int getCurrentPosition() {        return mediaPlayer.getCurrentPosition();    }    public void seekTo(int i) {        mediaPlayer.seekTo(i);    }    public boolean isPlaying() {        return mediaPlayer.isPlaying();    }    public int getBufferPercentage() {        return 0;    }    public boolean canPause() {        return true;    }    public boolean canSeekBackward() {        return true;    }    public boolean canSeekForward() {        return true;    }    public void onPrepared(MediaPlayer mediaPlayer) {        Log.d(TAG, "onPrepared");        mediaController = new MediaController(this);        mediaController.setMediaPlayer(this);        mediaController.setAnchorView(mControllLayout);        mediaController.setEnabled(true);        handler.post(new Runnable() {            public void run() {                mediaController.show();            }        });    }    @Override    public int getAudioSessionId() {        // TODO Auto-generated method stub        return 0;    }}
1 0
原创粉丝点击