MediaPlayer_视频播放器
来源:互联网 发布:java extends super 编辑:程序博客网 时间:2024/04/29 13:20
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text" />
<EditText
android:id="@+id/music"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="a.mp4"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/playbut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play"
android:onClick="onClick"
/>
<Button
android:id="@+id/pausebut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pause"
android:onClick="onClick"
/>
<Button
android:id="@+id/respalybut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/replay"
android:onClick="onClick"
/>
<Button
android:id="@+id/shopbut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/shop"
android:onClick="onClick"
/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="200"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="20"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
package com.examplemediaplayer;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText pathText;
private SurfaceView surfaceView;
private MediaPlayer mediaPlayer;
private String path;
private Button pausebut;
private int position;
private SeekBar seekBar;
private TextView text;
private boolean isplay; //正在播放的标记
private boolean shopNotProgress = true;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
String s=(String) msg.obj;
text.setText(s);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = new MediaPlayer();//实例化MediaPlayer
pathText=(EditText) findViewById(R.id.music);
surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
pausebut = (Button) findViewById(R.id.pausebut);
seekBar = (SeekBar) findViewById(R.id.seekBar1);
text=(TextView) findViewById(R.id.text);
//把输送给sufaceview的视频画面,直接显示到屏幕上,不要维持它自身的缓冲区
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置视频分辨率
surfaceView.getHolder().setFixedSize(176, 144);
surfaceView.getHolder().setKeepScreenOn(true);//保持屏幕不锁屏
//当SurfaceView所在的Activity离开了前台,SurfaceView会被destory,执行surfaceDestroyed()方法
//当Ativity又重新回到前台时,SurfaceView会被重新新建,调用surfaceChanged和surfaceCreated方法
//如果不在surfaceCreated方法中调用播放方法的话,Ativity重新回到前台,SurfaceView无法播放视频
//因为mediaPlayer.setDisplay(surfaceView.getHolder()); 中的surfaceView.getHolder()已经被变化了
surfaceView.getHolder().addCallback(new MyCallback());
seekBar.setOnSeekBarChangeListener(new MySeekBarChangeListener());
}
private final class MyCallback implements SurfaceHolder.Callback{
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(position>0&&path!=null){
play(position);
position=0;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer.isPlaying()){
position=mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
}
/**
* 按钮触发方法
* @param view
*/
public void onClick(View view){
switch(view.getId()){
case R.id.playbut:
play(position);
break;
case R.id.pausebut:
pause();
break;
case R.id.respalybut:
replayer();
break;
case R.id.shopbut:
shop();
break;
}
}
private void shop() {
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
shopNotProgress=false;
isplay=false;
}
}
private void replayer() {
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);
}else{
if(path!=null){
play(0);
}
}
}
private void pause() {
String title=pausebut.getText().toString();
if("暂停".equals(title)){
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
position=mediaPlayer.getCurrentPosition();
}
pausebut.setText("继续");
}else if("继续".equals(title)){
mediaPlayer.start();
pausebut.setText("暂停");
}
}
private void play(int position) {
String mv = pathText.getText().toString();
File file = new File(Environment.getExternalStorageDirectory(), mv);
if(file.exists()){
path=file.getAbsolutePath(); //获取视频
//path="http://192.168.144.1:8080/WEB/a.mp4";
try{
mediaPlayer.reset();//从设置
mediaPlayer.setDataSource(path); //设置视频资源
mediaPlayer.setDisplay(surfaceView.getHolder());//设置显示视频
mediaPlayer.prepare();//缓冲
mediaPlayer.setOnPreparedListener(new PreparedListener(position));//监听缓冲是否完成
}catch(Exception e){
e.printStackTrace();
}
}else{
Toast.makeText(MainActivity.this, "视频不存在", 2).show();
}
}
/**
* 缓冲监听类
* @author olay
*
*/
public final class PreparedListener implements MediaPlayer.OnPreparedListener{
int position;
public PreparedListener(int position){
this.position=position;
}
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
final long max=mediaPlayer.getDuration(); //得到视频的总长度(毫秒)
final String time = converLongTimeToStr(max); //得到mm:ss格式的时长的字符串
seekBar.setMax((int)max); //设置进度条的总长度
new Thread(){
public void run(){
isplay=true;
while(isplay){ //是否正在播放
int current=mediaPlayer.getCurrentPosition(); //获取当前播放的时间
seekBar.setProgress(current); //设置进度条的进度
String reaplay=converLongTimeToStr(current); //当前播放时间格式
Message msg = new Message();
msg.what=1;
msg.obj=reaplay+"/"+time;
handler.sendMessage(msg);
}
}
}.start();
if(position>0){
mediaPlayer.seekTo(position);
}
}
/**
* 毫秒转换 mm:ss格式方法
* @param max
* @return
*/
public String converLongTimeToStr(long time) {
int ss = 1000;
int mi = ss * 60;
int hh = mi * 60;
long hour = (time) / hh;
long minute = (time - hour * hh) / mi;
long second = (time - hour * hh - minute * mi) / ss;
String strHour = hour < 10 ? "0" + hour : "" + hour;
String strMinute = minute < 10 ? "0" + minute : "" + minute;
String strSecond = second < 10 ? "0" + second : "" + second;
if (hour > 0) {
return strHour + ":" + strMinute + ":" + strSecond;
} else {
return strMinute + ":" + strSecond;
}
}
}
/**
* 进度条监听类
* @author olay
*
*/
public final class MySeekBarChangeListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
/**
* 手动拉进度条,当进度条触摸拉动停止时,调用次方法
*/
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int position = seekBar.getProgress(); //获取当前进度条的进度
if(mediaPlayer!=null&&shopNotProgress){
play(position); //播放
}
}
}
}
- MediaPlayer_视频播放器
- 视频预览,视频播放器
- 视频播放器
- 视频播放器
- phonon 视频 播放器
- flex3 视频播放器
- 网页视频播放器
- web视频播放器
- FFMpeg视频播放器
- 网页 视频 播放器
- Android 视频播放器
- android 视频播放器
- 页面视频播放器
- flv视频播放器
- android视频播放器
- 视频播放器
- dav视频播放器
- 简易视频播放器
- Java中堆内存和栈内存详解
- 【算法导论】动态规划之矩阵链乘法
- ZOJ 3726 Alice's Print Service 二分+rmq
- 用户/服务器进程概念及v$session/V$PROCESS视图简介
- 光流法简单介绍
- MediaPlayer_视频播放器
- WIN8系统如何分区
- STL string
- zoj 3726 Pocket Cube(搜索)
- assert() 宏用法
- 0.driverbase-WDM和NT驱动
- java学习02-java基础知识、基本数据类型、运算符
- [Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现
- ACE_Task介绍(生产者/消费者)v3.0