Android VideoPlayer
来源:互联网 发布:sql注入入侵网站 编辑:程序博客网 时间:2024/06/03 17:48
Video的两个属性:名称和路径
public class VideoInfo { /** * 名称 */ String name; /** * 路径 */ String path; public VideoInfo(String name,String path){ this.name = name; this.path = path; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
VideoView:
package com.tchip.autoplayer.view;import android.content.Context;import android.content.Intent;import android.content.res.Resources;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaPlayer.OnErrorListener;import android.net.Uri;import android.util.AttributeSet;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.MediaController;import android.widget.MediaController.MediaPlayerControl;import java.io.IOException;/** * Displays a video file. The VideoView class * can load images from various sources (such as resources or content * providers), takes care of computing its measurement from the video so that * it can be used in any layout manager, and provides various display options * such as scaling and tinting. */public class VideoView extends SurfaceView implements MediaPlayerControl { private String TAG = "VideoView"; private Context mContext; // settable by the client private Uri mUri; private int mDuration; // All the stuff we need for playing and showing a video private SurfaceHolder mSurfaceHolder = null; private MediaPlayer mediaPlayer = null; private boolean isPrepared; private int videoWidth; private int videoHeight; private int surfaceWidth; private int surfaceHeight; private MediaController mediaController; private OnCompletionListener myOnCompletionListener; private MediaPlayer.OnPreparedListener myOnPreparedListener; private int currentBufferPercentage; private OnErrorListener myOnErrorListener; private boolean startWhenPrepared; private int seekWhenPrepared; private MySizeChangeLinstener mMyChangeLinstener; public int getVideoWidth() { return videoWidth; } public int getVideoHeight() { return videoHeight; } public void setVideoScale(int width, int height) { LayoutParams lp = getLayoutParams(); lp.height = height; lp.width = width; setLayoutParams(lp); } public interface MySizeChangeLinstener { public void doMyThings(); } public void setMySizeChangeLinstener(MySizeChangeLinstener l) { mMyChangeLinstener = l; } public VideoView(Context context) { super(context); mContext = context; initVideoView(); } public VideoView(Context context, AttributeSet attrs) { this(context, attrs, 0); mContext = context; initVideoView(); } public VideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initVideoView(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //Log.i("@@@@", "onMeasure"); int width = getDefaultSize(videoWidth, widthMeasureSpec); int height = getDefaultSize(videoHeight, heightMeasureSpec); /*if (mVideoWidth > 0 && mVideoHeight > 0) { if ( mVideoWidth * height > width * mVideoHeight ) { //Log.i("@@@", "image too tall, correcting"); height = width * mVideoHeight / mVideoWidth; } else if ( mVideoWidth * height < width * mVideoHeight ) { //Log.i("@@@", "image too wide, correcting"); width = height * mVideoWidth / mVideoHeight; } else { //Log.i("@@@", "aspect ratio is correct: " + //width+"/"+height+"="+ //mVideoWidth+"/"+mVideoHeight); } }*/ //Log.i("@@@@@@@@@@", "setting size: " + width + 'x' + height); setMeasuredDimension(width, height); } public int resolveAdjustedSize(int desiredSize, int measureSpec) { int result = desiredSize; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSpec.UNSPECIFIED: /* Parent says we can be as big as we want. Just don't be larger * than max size imposed on ourselves. */ result = desiredSize; break; case MeasureSpec.AT_MOST: /* Parent says we can be as big as we want, up to specSize. * Don't be larger than specSize, and don't be larger than * the max size imposed on ourselves. */ result = Math.min(desiredSize, specSize); break; case MeasureSpec.EXACTLY: // No choice. Do what we are told. result = specSize; break; } return result; } private void initVideoView() { videoWidth = 0; videoHeight = 0; getHolder().addCallback(mSHCallback); getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); setFocusable(true); setFocusableInTouchMode(true); requestFocus(); } public void setVideoPath(String path) { setVideoURI(Uri.parse(path)); } public void setVideoURI(Uri uri) { mUri = uri; startWhenPrepared = false; seekWhenPrepared = 0; openVideo(); requestLayout(); invalidate(); } public void stopPlayback() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } private void openVideo() { if (mUri == null || mSurfaceHolder == null) { // not ready for playback just yet, will try again later return; } // Tell the music playback service to pause // TODO: these constants need to be published somewhere in the framework. Intent i = new Intent("com.android.music.musicservicecommand"); i.putExtra("command", "pause"); mContext.sendBroadcast(i); if (mediaPlayer != null) { mediaPlayer.reset(); mediaPlayer.release(); mediaPlayer = null; } try { mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(mPreparedListener); mediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); isPrepared = false; Log.v(TAG, "reset duration to -1 in openVideo"); mDuration = -1; mediaPlayer.setOnCompletionListener(mCompletionListener); mediaPlayer.setOnErrorListener(mErrorListener); mediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); currentBufferPercentage = 0; mediaPlayer.setDataSource(mContext, mUri); mediaPlayer.setDisplay(mSurfaceHolder); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setScreenOnWhilePlaying(true); mediaPlayer.prepareAsync(); attachMediaController(); } catch (IOException ex) { Log.w(TAG, "Unable to open content: " + mUri, ex); return; } catch (IllegalArgumentException ex) { Log.w(TAG, "Unable to open content: " + mUri, ex); return; } } public void setMediaController(MediaController controller) { if (mediaController != null) { mediaController.hide(); } mediaController = controller; attachMediaController(); } private void attachMediaController() { if (mediaPlayer != null && mediaController != null) { mediaController.setMediaPlayer(this); View anchorView = this.getParent() instanceof View ? (View) this.getParent() : this; mediaController.setAnchorView(anchorView); mediaController.setEnabled(isPrepared); } } MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() { public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { videoWidth = mp.getVideoWidth(); videoHeight = mp.getVideoHeight(); if (mMyChangeLinstener != null) { mMyChangeLinstener.doMyThings(); } if (videoWidth != 0 && videoHeight != 0) { getHolder().setFixedSize(videoWidth, videoHeight); } } }; MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { // briefly show the mediacontroller isPrepared = true; if (myOnPreparedListener != null) { myOnPreparedListener.onPrepared(mediaPlayer); } if (mediaController != null) { mediaController.setEnabled(true); } videoWidth = mp.getVideoWidth(); videoHeight = mp.getVideoHeight(); if (videoWidth != 0 && videoHeight != 0) { //Log.i("@@@@", "video size: " + mVideoWidth +"/"+ mVideoHeight); getHolder().setFixedSize(videoWidth, videoHeight); if (surfaceWidth == videoWidth && surfaceHeight == videoHeight) { // We didn't actually change the size (it was already at the size // we need), so we won't get a "surface changed" callback, so // start the video here instead of in the callback. if (seekWhenPrepared != 0) { mediaPlayer.seekTo(seekWhenPrepared); seekWhenPrepared = 0; } if (startWhenPrepared) { mediaPlayer.start(); startWhenPrepared = false; if (mediaController != null) { mediaController.show(); } } else if (!isPlaying() && (seekWhenPrepared != 0 || getCurrentPosition() > 0)) { if (mediaController != null) { // Show the media controls when we're paused into a video and make 'em stick. mediaController.show(0); } } } } else { // We don't know the video size yet, but should start anyway. // The video size might be reported to us later. if (seekWhenPrepared != 0) { mediaPlayer.seekTo(seekWhenPrepared); seekWhenPrepared = 0; } if (startWhenPrepared) { mediaPlayer.start(); startWhenPrepared = false; } } } }; private OnCompletionListener mCompletionListener = new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { if (mediaController != null) { mediaController.hide(); } if (myOnCompletionListener != null) { myOnCompletionListener.onCompletion(mediaPlayer); } } }; private OnErrorListener mErrorListener = new OnErrorListener() { public boolean onError(MediaPlayer mp, int framework_err, int impl_err) { Log.d(TAG, "Error: " + framework_err + "," + impl_err); if (mediaController != null) { mediaController.hide(); } /* If an error handler has been supplied, use it and finish. */ if (myOnErrorListener != null) { if (myOnErrorListener.onError(mediaPlayer, framework_err, impl_err)) { return true; } } /* Otherwise, pop up an error dialog so the user knows that * something bad has happened. Only try and pop up the dialog * if we're attached to a window. When we're going away and no * longer have a window, don't bother showing the user an error. */ if (getWindowToken() != null) { Resources r = mContext.getResources(); int messageId;/* if (framework_err == MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) { messageId = com.android.internal.R.string.VideoView_error_text_invalid_progressive_playback; } else { messageId = com.android.internal.R.string.VideoView_error_text_unknown; } new AlertDialog.Builder(mContext) .setTitle(com.android.internal.R.string.VideoView_error_title) .setMessage(messageId) .setPositiveButton(com.android.internal.R.string.VideoView_error_button, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { If we get here, there is no onError listener, so * at least inform them that the video is over. if (mOnCompletionListener != null) { mOnCompletionListener.onCompletion(mMediaPlayer); } } }) .setCancelable(false) .show();*/ } return true; } }; private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { currentBufferPercentage = percent; } }; /** * Register a callback to be invoked when the media file * is loaded and ready to go. * * @param l The callback that will be run */ public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) { myOnPreparedListener = l; } /** * Register a callback to be invoked when the end of a media file * has been reached during playback. * * @param l The callback that will be run */ public void setOnCompletionListener(OnCompletionListener l) { myOnCompletionListener = l; } /** * Register a callback to be invoked when an error occurs * during playback or setup. If no listener is specified, * or if the listener returned false, VideoView will inform * the user of any errors. * * @param l The callback that will be run */ public void setOnErrorListener(OnErrorListener l) { myOnErrorListener = l; } SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback() { public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { surfaceWidth = w; surfaceHeight = h; if (mediaPlayer != null && isPrepared && videoWidth == w && videoHeight == h) { if (seekWhenPrepared != 0) { mediaPlayer.seekTo(seekWhenPrepared); seekWhenPrepared = 0; } mediaPlayer.start(); if (mediaController != null) { mediaController.show(); } } } public void surfaceCreated(SurfaceHolder holder) { mSurfaceHolder = holder; openVideo(); } public void surfaceDestroyed(SurfaceHolder holder) { // after we return from this we can't use the surface any more mSurfaceHolder = null; if (mediaController != null) mediaController.hide(); if (mediaPlayer != null) { mediaPlayer.reset(); mediaPlayer.release(); mediaPlayer = null; } } }; @Override public boolean onTouchEvent(MotionEvent ev) { if (isPrepared && mediaPlayer != null && mediaController != null) { toggleMediaControlsVisiblity(); } return false; } @Override public boolean onTrackballEvent(MotionEvent ev) { if (isPrepared && mediaPlayer != null && mediaController != null) { toggleMediaControlsVisiblity(); } return false; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (isPrepared && keyCode != KeyEvent.KEYCODE_BACK && keyCode != KeyEvent.KEYCODE_VOLUME_UP && keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_MENU && keyCode != KeyEvent.KEYCODE_CALL && keyCode != KeyEvent.KEYCODE_ENDCALL && mediaPlayer != null && mediaController != null) { if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { if (mediaPlayer.isPlaying()) { pause(); mediaController.show(); } else { start(); mediaController.hide(); } return true; } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP && mediaPlayer.isPlaying()) { pause(); mediaController.show(); } else { toggleMediaControlsVisiblity(); } } return super.onKeyDown(keyCode, event); } private void toggleMediaControlsVisiblity() { if (mediaController.isShowing()) { mediaController.hide(); } else { mediaController.show(); } } public void start() { if (mediaPlayer != null && isPrepared) { mediaPlayer.start(); startWhenPrepared = false; } else { startWhenPrepared = true; } } public void pause() { if (mediaPlayer != null && isPrepared) { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } startWhenPrepared = false; } public int getDuration() { if (mediaPlayer != null && isPrepared) { if (mDuration > 0) { return mDuration; } mDuration = mediaPlayer.getDuration(); return mDuration; } mDuration = -1; return mDuration; } public int getCurrentPosition() { if (mediaPlayer != null && isPrepared) { return mediaPlayer.getCurrentPosition(); } return 0; } public void seekTo(int msec) { if (mediaPlayer != null && isPrepared) { mediaPlayer.seekTo(msec); } else { seekWhenPrepared = msec; } } public boolean isPlaying() { if (mediaPlayer != null && isPrepared) { return mediaPlayer.isPlaying(); } return false; } public int getBufferPercentage() { if (mediaPlayer != null) { return currentBufferPercentage; } return 0; } @Override public boolean canPause() { return false; } @Override public boolean canSeekBackward() { return false; } @Override public boolean canSeekForward() { return false; } @Override public int getAudioSessionId() { return 0; }}
VolumeView:
package com.tchip.autoplayer.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Rect;import android.media.AudioManager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import com.tchip.autoplayer.R;public class VolumeView extends View { public final static String TAG = "SoundView"; private Context context; /** * 音量条高亮 */ private Bitmap bitmapVolumeLineOn; private Bitmap bitmapVolumeLineOff; private int bitmapWidth, bitmapHeight; private int index; private OnVolumeChangedListener mOnVolumeChangedListener; private final static int HEIGHT = 11; public final static int MY_HEIGHT = 163; public final static int MY_WIDTH = 44; public interface OnVolumeChangedListener { public void setYourVolume(int index); } public void setOnVolumeChangeListener(OnVolumeChangedListener l) { mOnVolumeChangedListener = l; } public VolumeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); context = context; init(); } public VolumeView(Context context, AttributeSet attrs) { super(context, attrs); context = context; init(); } public VolumeView(Context context) { super(context); context = context; init(); } private void init() { bitmapVolumeLineOn = BitmapFactory.decodeResource(context.getResources(), R.drawable.volume_line_on); bitmapVolumeLineOff = BitmapFactory.decodeResource(context.getResources(), R.drawable.volume_line_off); bitmapWidth = bitmapVolumeLineOn.getWidth(); bitmapHeight = bitmapVolumeLineOn.getHeight(); //setIndex(5); AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); setIndex(am.getStreamVolume(AudioManager.STREAM_MUSIC)); } @Override public boolean onTouchEvent(MotionEvent event) { int y = (int) event.getY(); int n = y * 15 / MY_HEIGHT; setIndex(15 - n); Log.d(TAG, "setIndex: " + (15 - n)); return true; } @Override protected void onDraw(Canvas canvas) { int reverseIndex = 15 - index; for (int i = 0; i != reverseIndex; ++i) { canvas.drawBitmap(bitmapVolumeLineOff, new Rect(0, 0, bitmapWidth, bitmapHeight), new Rect(0, i * HEIGHT, bitmapWidth, i * HEIGHT + bitmapHeight), null); } for (int i = reverseIndex; i != 15; ++i) { canvas.drawBitmap(bitmapVolumeLineOn, new Rect(0, 0, bitmapWidth, bitmapHeight), new Rect(0, i * HEIGHT, bitmapWidth, i * HEIGHT + bitmapHeight), null); } super.onDraw(canvas); } private void setIndex(int n) { if (n > 15) { n = 15; } else if (n < 0) { n = 0; } if (index != n) { index = n; if (mOnVolumeChangedListener != null) { mOnVolumeChangedListener.setYourVolume(n); } } invalidate(); }}
VideoPlayerActivity:
package com.tchip.autoplayer;import java.io.File;import java.io.FileFilter;import java.util.LinkedList;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.ActivityInfo;import android.content.res.Configuration;import android.database.Cursor;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaPlayer.OnErrorListener;import android.media.MediaPlayer.OnPreparedListener;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.os.MessageQueue.IdleHandler;import android.provider.MediaStore;import android.util.Log;import android.view.Display;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.view.View.OnClickListener;import android.view.View.OnLongClickListener;import android.view.ViewGroup.LayoutParams;import android.widget.ImageButton;import android.widget.PopupWindow;import android.widget.SeekBar;import android.widget.TextView;import android.widget.SeekBar.OnSeekBarChangeListener;import android.view.GestureDetector;import android.view.GestureDetector.SimpleOnGestureListener;import com.tchip.autoplayer.model.VideoInfo;import com.tchip.autoplayer.view.VolumeView;import com.tchip.autoplayer.view.VideoView;public class VideoPlayerActivity extends Activity { private final static String TAG = "VideoPlayerActivity"; private boolean isOnline = false; private boolean isChangedVideo = false; public static LinkedList<VideoInfo> playList = new LinkedList<VideoInfo>(); private Uri videoListUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; private static int position; private static boolean backFromAD = false; private int playedTime; /** * 视频视图 */ private VideoView videoView; private SeekBar seekBar; /** * 视频总时间 */ private TextView textTimeTotal; /** * 已播放时间 */ private TextView textTimePlay; private GestureDetector mGestureDetector = null; private AudioManager mAudioManager = null; private int maxVolume = 0; private int currentVolume = 0; /** * 视频列表按钮 */ private ImageButton btnList; /** * 上一部按钮 */ private ImageButton btnPrevious; /** * 播放/暂停 */ private ImageButton btnState; /** * 下一部按钮 */ private ImageButton btnNext; /** * 调节音量按钮 */ private ImageButton btnVolume; private View controlView = null; private PopupWindow popupControl; /** * 音量视图 */ private VolumeView volumeView; private PopupWindow popupVolume; private View extralView; private PopupWindow extralWindow = null; private static int screenWidth = 0; private static int screenHeight = 0; private static int controlHeight = 0; private final static int TIME = 6868; private boolean isControllerShow = true; private boolean isPaused = false; private boolean isFullScreen = false; private boolean isSilent = false; private boolean isSoundShow = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);// initialLayout(); Looper.myQueue().addIdleHandler(new IdleHandler() { @Override public boolean queueIdle() { if (popupControl != null && videoView.isShown()) { popupControl.showAtLocation(videoView, Gravity.BOTTOM, 0, 0); // controler.update(screenWidth, controlHeight); popupControl.update(0, 0, screenWidth, controlHeight); } if (extralWindow != null && videoView.isShown()) { extralWindow.showAtLocation(videoView, Gravity.TOP, 0, 0); extralWindow.update(0, 25, screenWidth, 60); } // myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME); return false; } }); controlView = getLayoutInflater().inflate(R.layout.controler, null); popupControl = new PopupWindow(controlView); textTimeTotal = (TextView) controlView.findViewById(R.id.textTimeTotal); textTimePlay = (TextView) controlView.findViewById(R.id.textTimePlay); volumeView = new VolumeView(this); volumeView.setOnVolumeChangeListener(new VolumeView.OnVolumeChangedListener() { @Override public void setYourVolume(int index) { cancelDelayHide(); updateVolume(index); hideControllerDelay(); } }); popupVolume = new PopupWindow(volumeView); extralView = getLayoutInflater().inflate(R.layout.extral, null); extralWindow = new PopupWindow(extralView); ImageButton btnBack = (ImageButton) extralView .findViewById(R.id.btnBack); position = -1; btnBack.setOnClickListener(myOnClickListener); btnList = (ImageButton) controlView.findViewById(R.id.btnList); btnPrevious = (ImageButton) controlView.findViewById(R.id.btnPrevious); btnState = (ImageButton) controlView.findViewById(R.id.btnState); btnNext = (ImageButton) controlView.findViewById(R.id.btnNext); btnVolume = (ImageButton) controlView.findViewById(R.id.btnVolume); videoView = (VideoView) findViewById(R.id.videoView); videoView.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { videoView.stopPlayback(); isOnline = false; new AlertDialog.Builder(VideoPlayerActivity.this) .setTitle("Error") .setMessage("?") .setPositiveButton("Confirm", new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { videoView.stopPlayback(); } }).setCancelable(false).show(); return false; } }); Uri uri = getIntent().getData(); if (uri != null) { videoView.stopPlayback(); videoView.setVideoURI(uri); isOnline = true; btnState.setImageResource(R.drawable.pause); } else { btnState.setImageResource(R.drawable.play); } getVideoFile(playList, new File("/sdcard/")); if (android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { Cursor cursor = getContentResolver() .query(videoListUri, new String[]{"_display_name", "_data"}, null, null, null); int n = cursor.getCount(); cursor.moveToFirst(); LinkedList<VideoInfo> playList2 = new LinkedList<VideoInfo>(); for (int i = 0; i != n; ++i) { VideoInfo videoInfo = new VideoInfo(cursor.getString(cursor .getColumnIndex("_display_name")), cursor.getString(cursor.getColumnIndex("_data"))); playList2.add(videoInfo); cursor.moveToNext(); } if (playList2.size() > playList.size()) { playList = playList2; } } videoView.setMySizeChangeLinstener(new VideoView.MySizeChangeLinstener() { @Override public void doMyThings() { setVideoScale(SCREEN_DEFAULT); } }); btnList.setAlpha(0xBB); btnPrevious.setAlpha(0xBB); btnState.setAlpha(0xBB); btnNext.setAlpha(0xBB); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); currentVolume = mAudioManager .getStreamVolume(AudioManager.STREAM_MUSIC); btnVolume.setAlpha(getAlphaByVolume()); btnList.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(); intent.setClass(VideoPlayerActivity.this, VideoChooseActivity.class); VideoPlayerActivity.this.startActivityForResult(intent, 0); cancelDelayHide(); } }); btnNext.setOnClickListener(myOnClickListener); btnState.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cancelDelayHide(); if (isPaused) { videoView.start(); btnState.setImageResource(R.drawable.pause); hideControllerDelay(); } else { videoView.pause(); btnState.setImageResource(R.drawable.play); } isPaused = !isPaused; } }); btnPrevious.setOnClickListener(myOnClickListener); btnVolume.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cancelDelayHide(); if (isSoundShow) { popupVolume.dismiss(); } else { if (popupVolume.isShowing()) { popupVolume.update(15, 0, VolumeView.MY_WIDTH, VolumeView.MY_HEIGHT); } else { popupVolume.showAtLocation(videoView, Gravity.RIGHT | Gravity.CENTER_VERTICAL, 15, 0); popupVolume.update(15, 0, VolumeView.MY_WIDTH, VolumeView.MY_HEIGHT); } } isSoundShow = !isSoundShow; hideControllerDelay(); } }); btnVolume.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View arg0) { if (isSilent) { btnVolume.setImageResource(R.drawable.soundenable); } else { btnVolume.setImageResource(R.drawable.sounddisable); } isSilent = !isSilent; updateVolume(currentVolume); cancelDelayHide(); hideControllerDelay(); return true; } }); seekBar = (SeekBar) controlView.findViewById(R.id.seekbar); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) { if (fromUser) { if (!isOnline) { videoView.seekTo(progress); } } } @Override public void onStartTrackingTouch(SeekBar arg0) { myHandler.removeMessages(HIDE_CONTROLER); } @Override public void onStopTrackingTouch(SeekBar seekBar) { myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME); } }); getScreenSize(); mGestureDetector = new GestureDetector(new SimpleOnGestureListener() { @Override public boolean onDoubleTap(MotionEvent e) { if (isFullScreen) { setVideoScale(SCREEN_DEFAULT); } else { setVideoScale(SCREEN_FULL); } isFullScreen = !isFullScreen; Log.d(TAG, "onDoubleTap"); if (isControllerShow) { showController(); } // return super.onDoubleTap(e); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (!isControllerShow) { showController(); hideControllerDelay(); } else { cancelDelayHide(); hideController(); } // return super.onSingleTapConfirmed(e); return true; } @Override public void onLongPress(MotionEvent e) { if (isPaused) { videoView.start(); btnState.setImageResource(R.drawable.pause); cancelDelayHide(); hideControllerDelay(); } else { videoView.pause(); btnState.setImageResource(R.drawable.play); cancelDelayHide(); showController(); } isPaused = !isPaused; // super.onLongPress(e); } }); // vv.setVideoPath("http://202.108.16.171/cctv/video/A7/E8/69/27/A7E86927D2BF4D2FA63471D1C5F97D36/gphone/480_320/200/0.mp4"); videoView.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer arg0) { setVideoScale(SCREEN_DEFAULT); isFullScreen = false; if (isControllerShow) { showController(); } int i = videoView.getDuration(); Log.d("onCompletion", "" + i); seekBar.setMax(i); i /= 1000; int minute = i / 60; int hour = minute / 60; int second = i % 60; minute %= 60; textTimeTotal.setText(String.format("%02d:%02d:%02d", hour, minute, second)); /* * controler.showAtLocation(vv, Gravity.BOTTOM, 0, 0); * controler.update(screenWidth, controlHeight); * myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME); */ videoView.start(); btnState.setImageResource(R.drawable.pause); hideControllerDelay(); myHandler.sendEmptyMessage(PROGRESS_CHANGED); } }); videoView.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer arg0) { int n = playList.size(); isOnline = false; if (++position < n) { videoView.setVideoPath(playList.get(position).getPath()); } else { videoView.stopPlayback(); VideoPlayerActivity.this.finish(); } } }); } @Override protected void onResume() { if (!isChangedVideo) { videoView.seekTo(playedTime); videoView.start(); } else { isChangedVideo = false; } // if(videoView.getVideoHeight()!=0){ if (videoView.isPlaying()) { btnState.setImageResource(R.drawable.pause); hideControllerDelay(); } if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } super.onResume(); } @Override protected void onDestroy() { if (popupControl.isShowing()) { popupControl.dismiss(); extralWindow.dismiss(); } if (popupVolume.isShowing()) { popupVolume.dismiss(); } myHandler.removeMessages(PROGRESS_CHANGED); myHandler.removeMessages(HIDE_CONTROLER); if (videoView.isPlaying()) { videoView.stopPlayback(); } playList.clear(); super.onDestroy(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 0 && resultCode == Activity.RESULT_OK) { videoView.stopPlayback(); int result = data.getIntExtra("CHOOSE", -1); Log.d("RESULT", "" + result); if (result != -1) { isOnline = false; isChangedVideo = true; videoView.setVideoPath(playList.get(result).getPath()); position = result; } else { String url = data.getStringExtra("CHOOSE_URL"); if (url != null) { videoView.setVideoPath(url); isOnline = true; isChangedVideo = true; } } return; } super.onActivityResult(requestCode, resultCode, data); } private final static int PROGRESS_CHANGED = 0; private final static int HIDE_CONTROLER = 1; Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case PROGRESS_CHANGED: int i = videoView.getCurrentPosition(); seekBar.setProgress(i); if (isOnline) { int j = videoView.getBufferPercentage(); seekBar.setSecondaryProgress(j * seekBar.getMax() / 100); } else { seekBar.setSecondaryProgress(0); } i /= 1000; int minute = i / 60; int hour = minute / 60; int second = i % 60; minute %= 60; textTimePlay.setText(String.format("%02d:%02d:%02d", hour, minute, second)); sendEmptyMessageDelayed(PROGRESS_CHANGED, 100); break; case HIDE_CONTROLER: hideController(); break; } super.handleMessage(msg); } }; @Override public boolean onTouchEvent(MotionEvent event) { boolean result = mGestureDetector.onTouchEvent(event); if (!result) { if (event.getAction() == MotionEvent.ACTION_UP) { /* * if(!isControllerShow){ showController(); * hideControllerDelay(); }else { cancelDelayHide(); * hideController(); } */ } result = super.onTouchEvent(event); } return result; } @Override public void onConfigurationChanged(Configuration newConfig) { getScreenSize(); if (isControllerShow) { cancelDelayHide(); hideController(); showController(); hideControllerDelay(); } super.onConfigurationChanged(newConfig); } @Override protected void onPause() { playedTime = videoView.getCurrentPosition(); videoView.pause(); btnState.setImageResource(R.drawable.play); super.onPause(); } private void getScreenSize() { Display display = getWindowManager().getDefaultDisplay(); screenHeight = display.getHeight(); screenWidth = display.getWidth(); controlHeight = screenHeight / 4; // adView = (AdView) extralView.findViewById(R.id.ad); // LayoutParams lp = adView.getLayoutParams(); // lp.width = screenWidth*3/5; } private void hideController() { if (popupControl.isShowing()) { popupControl.update(0, 0, 0, 0); extralWindow.update(0, 0, screenWidth, 0); isControllerShow = false; } if (popupVolume.isShowing()) { popupVolume.dismiss(); isSoundShow = false; } } private void hideControllerDelay() { myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME); } private void showController() { popupControl.update(0, 0, screenWidth, controlHeight); if (isFullScreen) { extralWindow.update(0, 0, screenWidth, 60); } else { extralWindow.update(0, 25, screenWidth, 60); } isControllerShow = true; } private void cancelDelayHide() { myHandler.removeMessages(HIDE_CONTROLER); } private final static int SCREEN_FULL = 0; private final static int SCREEN_DEFAULT = 1; private void setVideoScale(int flag) { LayoutParams lp = videoView.getLayoutParams(); switch (flag) { case SCREEN_FULL: Log.d(TAG, "screenWidth: " + screenWidth + " screenHeight: " + screenHeight); videoView.setVideoScale(screenWidth, screenHeight); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); break; case SCREEN_DEFAULT: int videoWidth = videoView.getVideoWidth(); int videoHeight = videoView.getVideoHeight(); int mWidth = screenWidth; int mHeight = screenHeight - 25; if (videoWidth > 0 && videoHeight > 0) { if (videoWidth * mHeight > mWidth * videoHeight) { // Log.i("@@@", "image too tall, correcting"); mHeight = mWidth * videoHeight / videoWidth; } else if (videoWidth * mHeight < mWidth * videoHeight) { // Log.i("@@@", "image too wide, correcting"); mWidth = mHeight * videoWidth / videoHeight; } else { } } videoView.setVideoScale(mWidth, mHeight); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); break; } } private int getAlphaByVolume() { if (mAudioManager != null) { // int currentVolume = // mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); int alpha = currentVolume * (0xCC - 0x55) / maxVolume + 0x55; return alpha; } else { return 0xCC; } } private void updateVolume(int index) { if (mAudioManager != null) { if (isSilent) { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); } else { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0); } currentVolume = index; btnVolume.setAlpha(getAlphaByVolume()); } } private void getVideoFile(final LinkedList<VideoInfo> videoList, File file) { file.listFiles(new FileFilter() { @Override public boolean accept(File file) { String name = file.getName(); int i = name.indexOf('.'); if (i != -1) { name = name.substring(i); if (name.equalsIgnoreCase(".mp4") || name.equalsIgnoreCase(".3gp")) { VideoInfo videoInfo = new VideoInfo(file.getName(), file.getAbsolutePath()); videoList.add(videoInfo); return true; } } else if (file.isDirectory()) { getVideoFile(videoList, file); } return false; } }); } private MyOnClickListener myOnClickListener = new MyOnClickListener(); class MyOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnBack: { VideoPlayerActivity.this.finish(); } break; case R.id.btnPrevious: { isOnline = false; if (--position >= 0) { videoView.setVideoPath(playList.get(position).getPath()); cancelDelayHide(); hideControllerDelay(); } else { VideoPlayerActivity.this.finish(); } } break; case R.id.btnNext: { int n = playList.size(); isOnline = false; if (++position < n) { videoView.setVideoPath(playList.get(position).getPath()); cancelDelayHide(); hideControllerDelay(); } else { VideoPlayerActivity.this.finish(); } } break; default: break; } } }}
0 0
- Android VideoPlayer
- Android VideoPlayer 1
- videoPlayer
- VideoPlayer
- android 4.0 videoPlayer上层代码分析
- android之videoplayer视频实现示例收集
- Rexsee API介绍:Android视频播放,Rexsee的VideoPlayer函数说明与源码
- Android 后台播放FM或者Music,前台进入VideoPlayer再退出,后台不能恢复
- (更新版)Android VideoPlayer 在滚动列表实现item视频播放(ListView控件和RecyclerView)
- cocos2d-x lua 播放视频,VideoPlayer在Android和IOS下的坑,
- 个人收集 AS3 VideoPlayer
- videoPlayer 无法播放视频
- Unity VideoPlayer的使用
- unity VideoPlayer的使用
- Qt Mobility videoplayer 源码剖析
- Spark VideoPlayer and VideoDisplay controls
- Flex VideoPlayer组件 属性详解
- (其他2)VideoPlayer 介绍
- activemq , spring 多个ip监听同一个mq
- 输入字符串和输出字符串的方法
- httpsclient 报错 timeout waiting for connection from pool
- NOIPTGA组T3 Mahjong
- linux文件共享
- Android VideoPlayer
- IP首部校验和计算
- 【15】python 列表补充+orientdb更新属性值
- Windows命令行设置永久环境变量
- 【codevs 3500】快速幂
- 告诉孩子:远离那些勤奋,但不动脑子的人
- Elasticsearch 中文分词器 IK 配置和使用
- 数据库设计文档编写模板
- OneNote 开发与使用