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
- MediaPlayer MediaController
- android mediaplayer 自定义 mediacontroller
- MediaController
- MediaController
- MediaController
- 视频播放器(SurfaceView+MediaPlayer+SeekBar,VideoView+MediaController)
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- Android两种播放视频的方法(SurfaceView+MediaPlayer+SeekBar)跟(VideoView+MediaController)
- Android两种播放视频的方法(SurfaceView、MediaPlayer、SeekBar)和(VideoView、MediaController)等两种方法。
- MediaController+VideoView
- mediaplayer
- mediaplayer
- mediaplayer
- MediaPlayer
- MediaPlayer
- MediaPlayer
- MediaPlayer
- mediaplayer
- bzoj1026: [SCOI2009]windy数-数位DP
- 淘宝网提供的国内NPM镜像简介和使用方法
- Knapsack problem (FZU_2214,福建省第六届ACM-problemC) 01背包+初始化问题+渐缩问题
- u盘安装linux,将grub安装到了u盘,将U盘拔掉后系统无法引导启动的解决方法
- ARC下OC对象和CF对象之间的桥接(bridge)
- MediaPlayer MediaController
- Android动态设定GridView的高度,固定column,实现高度自适应
- 在sql中用dataadd添加时间
- 【小镇的技术天梯】MySQL 查询缓存
- 为什么用流数据方式读取lob数据能减少内存的占用
- R语言定义多维数组
- cmd删除Temporary ASP.NET Files方法
- android Listview,gridview局部刷新,部分刷新
- android面试题