package cn.qylk;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import cn.qylk.database.MediaDatabase;
import cn.qylk.utils.StringUtils;
/**
* @author qylk2012
*
*/
// TODO 按下home见后回来无法继续播放的问题
public class VideoActivity extends Activity implements OnClickListener {
private class OnDoubleClick extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
surfaceView
.getHolder()
.setFixedSize(
(int) (height * (widescale ? scale_43 : scale_169)),
height);
widescale = !widescale;
return super.onDoubleTap(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
showControls();
return super.onSingleTapConfirmed(e);
}
}
private final class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer.setDisplay(holder);
mediaPlayer.setScreenOnWhilePlaying(true);
PowerManager pm = (PowerManager) getApplicationContext()
.getSystemService(Context.POWER_SERVICE);
wakeLock = pm
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Service");
wakeLock.acquire();
play(position);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer != null) {
position = mediaPlayer.getCurrentPosition();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
}
}
private class task extends TimerTask {
@Override
public void run() {
if (mediaPlayer.isPlaying()) {
handler.sendEmptyMessage(0);
}
}
}
private static final float scale_169 = 16.0f / 9;// 16:9尺寸
private static final float scale_43 = 4.0f / 3;// 16:9尺寸
private RelativeLayout controller;
private Cursor cursor;
private GestureDetector gd;
private Handler handler;
private int height;
private MediaPlayer mediaPlayer;
private ImageView playButton;
private TextView pos, dura, title;
private int position;
private SurfaceView surfaceView;
private Timer timer;
private SeekBar videobar;
private WakeLock wakeLock;
private boolean widescale;
private void next() {
if (!cursor.moveToNext())
cursor.moveToFirst();
play(0);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.videoplay:
if (mediaPlayer.isPlaying())
mediaPlayer.pause();
else
mediaPlayer.start();
playButton
.setImageResource(mediaPlayer.isPlaying() ? R.drawable.btn_pause_bg
: R.drawable.btn_play_bg);
break;
case R.id.videopre:
pre();
break;
case R.id.videonext:
next();
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.video);
int index;
if (savedInstanceState == null)
index = getIntent().getExtras().getInt("position");
else {
index = savedInstanceState.getInt("index");
position = savedInstanceState.getInt("pos");
}
playButton = (ImageView) this.findViewById(R.id.videoplay);
videobar = (SeekBar) findViewById(R.id.videobar);
title = (TextView) findViewById(R.id.videotitle);
pos = (TextView) findViewById(R.id.videopos);
dura = (TextView) findViewById(R.id.videodura);
controller = (RelativeLayout) findViewById(R.id.controller);
playButton.setOnClickListener(this);
this.findViewById(R.id.videonext).setOnClickListener(this);
this.findViewById(R.id.videopre).setOnClickListener(this);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
videobar.setProgress(mediaPlayer.getCurrentPosition());
super.handleMessage(msg);
}
};
gd = new GestureDetector(this, new OnDoubleClick());
cursor = MediaDatabase.VideoCursor();
cursor.moveToPosition(index);
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
if (wakeLock != null) {
wakeLock.release();// 释放睡眠锁
wakeLock = null;
}
super.onDestroy();
}
@Override
protected void onPause() {
mediaPlayer.pause();
timer.cancel();
super.onPause();
}
@Override
protected void onResume() {
surfaceView = (SurfaceView) this.findViewById(R.id.surface);
surfaceView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gd.onTouchEvent(event);// 处理双击事件
return true;
}
});
mediaPlayer = new MediaPlayer();
SurfaceHolder holder = surfaceView.getHolder();
height = getWindowManager().getDefaultDisplay().getHeight();
holder.addCallback(new SurfaceCallback());
surfaceView.setFocusable(true);
surfaceView.requestFocus();
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
next();
}
});
videobar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
pos.setText(StringUtils.TimeFormat(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
}
});
super.onResume();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("index", cursor.getPosition());
outState.putInt("pos", mediaPlayer.getCurrentPosition());
super.onSaveInstanceState(outState);
}
public void play(int pos) {
try {
title.setText(cursor.getString(0));
if (timer != null)
timer.cancel();
videobar.setMax(cursor.getInt(2));
timer = new Timer();
timer.schedule(new task(), 0, 1000);
dura.setText(StringUtils.TimeFormat(cursor.getInt(2)));
mediaPlayer.reset();
mediaPlayer.setDataSource(cursor.getString(3));
mediaPlayer.prepare();
mediaPlayer.seekTo(pos);
mediaPlayer.start();
setScale();
} catch (Exception e) {
}
}
private void pre() {
if (!cursor.moveToPrevious())
cursor.moveToLast();
play(0);
}
private void setScale() {
int w = mediaPlayer.getVideoWidth();
int h = mediaPlayer.getVideoHeight();
float wh = w * 1.0f / h;
if (wh - 1.3f < 0.2f)
widescale = false;
else
widescale = true;
surfaceView.getHolder().setFixedSize(
(int) (height * (widescale ? scale_169 : scale_43)), height);
}
private void showControls() {
if (controller.getVisibility() == View.INVISIBLE) {
controller.setVisibility(View.VISIBLE);
} else
controller.setVisibility(View.INVISIBLE);
}
}