package com.android.play;
import java.io.File;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.Window;
import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.android.entity.Constant;
import com.android.service.MediaBackService;
import com.android.service.MediaBackService.MyBinder;
import com.android.view.VerticalSeekBar;
/**
* 视频播放类
*
* @author feng
*/
public class PlayVideoActivity extends AppCompatActivity {
private String TAG = Constant.TAG;
private ImageButton btn_pre, btn_play, btn_next;
private SurfaceView surfaceView;
private TextView tv_curtime, tv_totaltime;
private SeekBar seekBar;
private String path;
private SurfaceHolder holder;
private MediaBackService mediaService;
private MediaBackService.MyBinder binder;
private AudioManager audioManager;
private ProgressDialog dialog;
private GestureDetector mGestureDetector = null;
private BroadcastReceiver receiver;
private Window window;
private boolean isRun = false, isLoop = false;
private boolean isStop = true;
private boolean isShow = false;
private VerticalSeekBar verticalSeekBar;
private Intent intent;
private int time;
private int screenWidth, screenHeight;
private int position, progress;
private LinearLayout linearLayout, linear_text;
private FrameLayout ll_playview;
private TextView mVideoName;
private ImageButton mBackBt;
private ImageView mVolumeImage;
private ImageView mBatteryIamge;
private Animation showVoicePanelAnimation;
private Animation hiddenVoicePanelAnimation;
private View mTopVideoview;
private int downX,downY,tempX,tempY,moveX,moveY;
private boolean isShowVolumeBar = false;
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyBinder) service;
mediaService = binder.getResult();
if (mediaService != null) {
mediaService.activityNotify();
Log.i("TAG", "Conn");
}
}
};
private BroadcastReceiver mReceiverBattery = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
int level = intent.getIntExtra("level",0);
int status = intent.getIntExtra("status", 0);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
Log.i(TAG, " Battery changed level : "+level+" , isCharging = "+isCharging);
if(isCharging){
if(level == 100){
mBatteryIamge.setImageResource(R.drawable.battery_full);
}else {
mBatteryIamge.setImageResource(R.drawable.battery_charging);
}
}else {
if(level == 10){
mBatteryIamge.setImageResource(R.drawable.battery_10);
}else if(level == 20){
mBatteryIamge.setImageResource(R.drawable.battery_20);
}else if(level == 50){
mBatteryIamge.setImageResource(R.drawable.battery_50);
}else if(level == 80) {
mBatteryIamge.setImageResource(R.drawable.battery_80);
}else if(level == 100){
mBatteryIamge.setImageResource(R.drawable.battery_100);
}
}
}
}
};
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_video_suface);
fullscreen(true);
initFindView();
setListener();
position = getIntent().getIntExtra("position", 0);
path = Constant.mediaList.get(position).getPath();
Log.i(TAG, "=======oncreat==path====" + path);
tv_curtime.setText("00:00:00");
window = getWindow();
holder = surfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(new MyCallback());
bindService();
receiver = new ServiceBroadcast();
IntentFilter filter = new IntentFilter("mediaplay");
registerReceiver(receiver, filter);
IntentFilter batteryFiltet = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(mReceiverBattery,batteryFiltet);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
verticalSeekBar.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
verticalSeekBar.setVisibility(View.GONE);
verticalSeekBar.setClickable(false);
mVolumeImage.setVisibility(View.GONE);
mVolumeImage.setClickable(false);
showVoicePanelAnimation = AnimationUtils.loadAnimation(PlayVideoActivity.this, R.anim.puch_up_in);
hiddenVoicePanelAnimation = AnimationUtils.loadAnimation(PlayVideoActivity.this, R.anim.push_up_out);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
mediaService.seekTo(progress);
}
}
});
}
private void bindService() {
Log.i(TAG, "====绑定 服务===");
Intent serviceIntent = new Intent();
serviceIntent.setComponent(new ComponentName("com.android.play", "com.android.service.MediaBackService"));
bindService(serviceIntent, conn, Context.BIND_AUTO_CREATE);
}
public void showView() {
linear_text.setVisibility(View.VISIBLE);
linearLayout.setVisibility(View.VISIBLE);
seekBar.setVisibility(View.VISIBLE);
mTopVideoview.setVisibility(View.VISIBLE);
}
public void hideView() {
linear_text.setVisibility(View.GONE);
linearLayout.setVisibility(View.GONE);
seekBar.setVisibility(View.GONE);
mTopVideoview.setVisibility(View.GONE);
}
private void fullscreen(boolean enable) {
if (enable) { //显示状态栏
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(lp);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
} else { //隐藏状态栏
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(lp);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
}
public void getScreenSize() {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
@SuppressWarnings("deprecation")
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
File file = new File(getFilesDir().getParentFile().getPath() + "/shared_prefs/backsetting.xml");
if (file.exists()) {
SharedPreferences sp = getSharedPreferences("backsetting", 0);
int res = sp.getInt("background", -1);
ll_playview.setBackgroundResource(res);
}
Log.i("TAG", "start");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i(TAG, "restart");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Log.i(TAG, "SaveInstanceState play ");
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (mediaService.isPlay()) {
mediaService.pause();
}
time = mediaService.getCurrentPosition();
btn_play.setBackgroundResource(R.drawable.start_button_video);
}
@Override
public void onBackPressed() {
super.onBackPressed();
Log.i(TAG, "PlayVideoActivity : onBackPressed");
if (mediaService.isPlay()) {
mediaService.pause();
isRun = false;
btn_play.setBackgroundResource(R.drawable.start_button_video);
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (time != 0) {
mediaService.seekTo(time);
mediaService.play();
btn_play.setBackgroundResource(R.drawable.pause_button_video);
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(TAG, " PlayVideo : Destroy");
if (mediaService.isPlay()) {
mediaService.pause();
mediaService.stop();
isRun = false;
handler.removeMessages(0x01);
} else {
mediaService.stop();
isRun = false;
handler.removeMessages(0x01);
}
unregisterReceiver(receiver);
unregisterReceiver(mReceiverBattery);
unbindService(conn);
}
//
class ServiceBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra("ok", -1);
switch (status) {
case Constant.PLAY:
Log.i("TAG", "broadcast");
Log.i(TAG, "========start==path====" + path);
mediaService.preparePlay(holder, path);
mediaService.mediaPlayer.setScreenOnWhilePlaying(true);
mediaService.mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
time = mp.getDuration();
seekBar.setMax(time);
tv_totaltime.setText(Constant.movieTimeFormat(time));
mVideoName.setText(Constant.mediaList.get(position).getName());
mediaService.play();
if (progress != 0) {
mediaService.seekTo(progress);
}
isRun = true;
handler.sendEmptyMessage(0x01);
btn_play.setBackgroundResource(R.drawable.pause_button_video);
Log.i("TAG", time + "=time");
}
});
//
mediaService.mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
if (isLoop) {
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
} else {
tv_curtime.setText("00:00:00");
seekBar.setProgress(0);
btn_play.setBackgroundResource(R.drawable.start_button_video);
position++;
if (position < Constant.mediaList.size()) {
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
} else {
position = 0;
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
}
}
}
});
Log.i("TAG", "broadcast");
break;
default:
break;
}
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0x01://
if (isRun) {
if (seekBar.getProgress() <= seekBar.getMax()) {
seekBar.setProgress(mediaService.getCurrentPosition());
tv_curtime.setText(Constant.movieTimeFormat(mediaService.getCurrentPosition()));
}
handler.sendEmptyMessage(0x01);
}
break;
case 0x02:
hideView();
isShow = false;
break;
default:
break;
}
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = tempX = (int)event.getRawX();
downY = tempY = (int)event.getRawY();
Log.i(TAG," PLAYVIDEO Activity ACTION DOWN : downX : "+downX+" , downY : "+downY);
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
moveX = (int) event.getRawX();
moveY = (int) event.getRawY();
Log.i(TAG,"PLAYVIDEO ontuch ACTION MOVE movex : "+moveX+" , moveY : "+moveY);
if(Math.abs(moveX- downX)>100 && Math.abs(moveY - downY) <50){
if(moveX > downX){
fastForward(moveX-downX);
}else {
fastBack(downX-moveX);
}
}
if(Math.abs(moveY-downY)> 20 && Math.abs(moveX - downX)<20){
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
Log.i(TAG, " PLAYVIDEO maxvolume : "+ maxVolume + " isShowVolumeBar : "+isShowVolumeBar);
if(!isShowVolumeBar) {
isShowVolumeBar = true;
showVolumeBar();
}
if(moveY > downY){
mSeekHandler.removeMessages(0x22);
int volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.i(TAG," play VIDEO volume : "+volume);
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);
verticalSeekBar.setProgress(volume);
mSeekHandler.sendEmptyMessageDelayed(0x22,4000);
}else {
mSeekHandler.removeMessages(0x22);
int volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.i(TAG," play VIDEO volume : "+volume);
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
verticalSeekBar.setProgress(volume);
mSeekHandler.sendEmptyMessageDelayed(0x22,4000);
}
}
break;
}
if(!isShow) {
isShow = true;
showView();
handler.sendEmptyMessageDelayed(0x02, 4000);
}
return false;
}
private void showVolumeBar(){
verticalSeekBar.startAnimation(showVoicePanelAnimation);
verticalSeekBar.setVisibility(View.VISIBLE);
mVolumeImage.startAnimation(showVoicePanelAnimation);
mVolumeImage.setVisibility(View.VISIBLE);
}
private Handler mSeekHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0x22) {
isShowVolumeBar = false;
verticalSeekBar.startAnimation(hiddenVoicePanelAnimation);
verticalSeekBar.setVisibility(View.GONE);
mVolumeImage.startAnimation(hiddenVoicePanelAnimation);
mVolumeImage.setVisibility(View.GONE);
}
}
};
//快进
public void fastForward(int moveLong) {
int currentPosition = 1000*(moveLong/100);
Log.i(TAG," PLAYVIDEO fastForward , currentPositon = "+currentPosition);
if (mediaService.isPlay()) {
mediaService.pause();
isRun = false;
if(mediaService.getDuration() > currentPosition) {
mediaService.seekTo(mediaService.getCurrentPosition() + currentPosition);
}
isRun = true;
handler.sendEmptyMessage(0x01);
mediaService.play();
} else {
if(mediaService.getDuration() > currentPosition) {
mediaService.seekTo(mediaService.getCurrentPosition() + currentPosition);
}
seekBar.setProgress(mediaService.getCurrentPosition());
tv_curtime.setText(Constant.movieTimeFormat(mediaService.getCurrentPosition()));
}
}
//快退
public void fastBack(int moveLong) {
int currentPosition = 1000*(moveLong/100);
Log.i(TAG," PLAYVIDEO fastback , currentPositon = "+currentPosition);
if (mediaService.isPlay()) {
mediaService.pause();
isRun = false;
if(mediaService.getCurrentPosition() != 0) {
mediaService.seekTo(mediaService.getCurrentPosition() - currentPosition);
}
isRun = true;
handler.sendEmptyMessage(0x01);
mediaService.play();
} else {
if(mediaService.getCurrentPosition() != 0) {
mediaService.seekTo(mediaService.getCurrentPosition() - currentPosition);
}
seekBar.setProgress(mediaService.getCurrentPosition());
tv_curtime.setText(Constant.movieTimeFormat(mediaService.getCurrentPosition()));
}
}
class MyCallback implements Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "holder");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.i(TAG, "===surfaceDestroyed");
}
}
public void initFindView() {
btn_pre = (ImageButton) findViewById(R.id.ibtn_prev);
btn_play = (ImageButton) findViewById(R.id.ibtn_play);
btn_next = (ImageButton) findViewById(R.id.ibtn_next);
tv_curtime = (TextView) findViewById(R.id.tv_hasPlayed);
tv_totaltime = (TextView) findViewById(R.id.tv_duration);
seekBar = (SeekBar) findViewById(R.id.sbar_progress);
surfaceView = (SurfaceView) findViewById(R.id.sfv_image);
ll_playview = (FrameLayout) findViewById(R.id.fr_playview);
linearLayout = (LinearLayout) findViewById(R.id.layout_control);//
linear_text = (LinearLayout) findViewById(R.id.layout_progress);//
verticalSeekBar = (VerticalSeekBar) findViewById(R.id.vertical_seekbar);
mBackBt = (ImageButton) findViewById(R.id.video_top_back);
mVolumeImage = (ImageView) findViewById(R.id.iv_volume_tag);
mBatteryIamge = (ImageView) findViewById(R.id.iv_video_battery);
mVideoName = (TextView) findViewById(R.id.tv_video_name);
mTopVideoview = findViewById(R.id.video_top_layout);
}
public void setListener() {
btn_pre.setOnClickListener(new MyOnClickListener());
btn_play.setOnClickListener(new MyOnClickListener());
btn_next.setOnClickListener(new MyOnClickListener());
mBackBt.setOnClickListener(new MyOnClickListener());
}
class MyOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibtn_prev:
position--;
if (position >= 0) {
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
} else {
position = Constant.mediaList.size() - 1;
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
}
break;
case R.id.ibtn_play:
handler.sendEmptyMessage(0x01);
if (mediaService.isPlay()) {
mediaService.pause();
isRun = false;
btn_play.setBackgroundResource(R.drawable.start_button_video);
} else {
mediaService.play();
isRun = true;
btn_play.setBackgroundResource(R.drawable.pause_button_video);
}
break;
case R.id.ibtn_next:
position++;
if (position < Constant.mediaList.size()) {
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
} else {
position = 0;
path = Constant.mediaList.get(position).getPath();
mediaService.activityNotify();
}
break;
case R.id.video_top_back:
if (mediaService.isPlay()) {
mediaService.pause();
isRun = false;
btn_play.setBackgroundResource(R.drawable.start_button_video);
}
finish();
break;
default:
break;
}
}
}
}