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
原创粉丝点击