VideoView播放视频

来源:互联网 发布:mac里的视频导出到u盘 编辑:程序博客网 时间:2024/06/15 01:38
package com.example.testvideoview;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.ComponentCallbacks;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.pm.ActivityInfo;import android.graphics.PixelFormat;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.KeyEvent;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.MediaController;import android.widget.Toast;import android.widget.VideoView;public class MainActivity extends Activity implements ComponentCallbacks {    private static final  Uri uri = Uri.parse("http://tb-video.bdstatic.com/tieba-smallvideo-transcode/91570716_36f237911a9fe8528ca95bf5b4b9fb1b_50e0840d_1.mp4");    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.i("linux","--onCreate--");        Context context=getApplicationContext();        mVideoView = new VideoView(context);        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        mWindowManager.addView(mVideoView, getWindowParams());//      MediaController mediaController=new MediaController(context);//      mediaController.setMediaPlayer(mVideoView);//      mediaController.setAnchorView(mVideoView);//      mVideoView.setMediaController(mediaController);        initListener();        mVideoView.setVideoURI(uri);        mVideoView.start();        mVideoView.requestFocus();    }    private WindowManager mWindowManager;    private void initListener() {        mVideoView.setClickable(true);//http://blog.csdn.net/joshuaxx316/article/details/47802497        mVideoView.setOnClickListener(mOnClickListener);        mVideoView.setOnKeyListener(mOnKeyListener);        //注册广播        registerReceiver(mHomeKeyEventReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));    }    //////////////////////响应返回键和home键/////////////////////////    //使用WindowManager addView来显示一个窗口,响应返回按钮小技巧    // http://blog.csdn.net/eddylei/article/details/9014107    //http://www.shirlman.com/tec/20160426/362//    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        try {            int keyCode=event.getKeyCode();            Log.i("linux", "--dispatchKeyEvent---" + keyCode);            Toast.makeText(getApplicationContext(),"--dispatchKeyEvent---" + keyCode, Toast.LENGTH_SHORT).show();            if (keyCode == KeyEvent.KEYCODE_BACK||keyCode == KeyEvent.KEYCODE_HOME||keyCode ==KeyEvent.KEYCODE_MENU) {                if (mOnKeyListener != null&&mVideoView != null) {                    mOnKeyListener.onKey(mVideoView, keyCode, event);                    return false;                }            }        } catch (Exception e) {            e.printStackTrace();        }        return super.dispatchKeyEvent(event);    }    //监听home键//http://blog.csdn.net/com360/article/details/6663586    /**     * 监听是否点击了home键将客户端推到后台     */    private BroadcastReceiver mHomeKeyEventReceiver = new BroadcastReceiver() {        String SYSTEM_REASON = "reason";        String SYSTEM_HOME_KEY = "homekey";        String SYSTEM_HOME_KEY_LONG = "recentapps";        @Override        public void onReceive(Context context, Intent intent) {            String action = intent.getAction();            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {                String reason = intent.getStringExtra(SYSTEM_REASON);                if (SYSTEM_HOME_KEY.equals(reason)) {                    //表示按了home键,程序到了后台                    Toast.makeText(getApplicationContext(), "按了home键", Toast.LENGTH_SHORT).show();                }else if(SYSTEM_HOME_KEY_LONG.equals(reason)){                    //表示长按home键,显示最近使用的程序列表                    Toast.makeText(getApplicationContext(), "长按home键", Toast.LENGTH_SHORT).show();                }                if (SYSTEM_HOME_KEY.equals(reason)||SYSTEM_HOME_KEY_LONG.equals(reason)) {                    try {                        mWindowManager.removeView(mVideoView);                    } catch (Exception e) {                        e.printStackTrace();                        //当activity已经调用了onDestroy销毁的时候,mVideoView已经销毁了,这时候mWindowManager.removeView(mVideoView)这句是会                        // 报错View not attached to window manager                        //点击home键的时候会常常出现这个情况,此时可以转发给back键处理,人为的将home事件转发到back上                        //参考http://blog.csdn.net/yihongyuelan/article/details/9829313                        // 关于java.lang.IllegalArgumentException: View not attached to window manager 错误的分析                        Log.i("linux","--KEYCODE_HOME ---- KEYCODE_BACK--");//                      mOnKeyListener.onKey(mVideoView, KeyEvent.KEYCODE_BACK, new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK));//                      mOnKeyListener.onKey(mVideoView, KeyEvent.KEYCODE_BACK, new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BACK));//                      dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BACK));                    }                }            }        }    };    private final View.OnKeyListener mOnKeyListener=new View.OnKeyListener() {        @Override        public boolean onKey(View view, int i, KeyEvent keyEvent) {            Log.i("linux","--onKey--"+view);            Log.i("linux","--keyEvent--"+keyEvent);            removeWindow();            return false;        }    };    private VideoView mVideoView;//////////////////////响应返回键和home键/////////////////////////    private final View.OnClickListener mOnClickListener=new View.OnClickListener() {        @Override        public void onClick(View view) {            Log.i("linux","--onClick--"+view);        }    };    //设置广告位置    protected  int getGravity(){        return  Gravity.CENTER;    }    //移除广告弹窗    private void removeWindow() {        try {            Log.i("linux","--removeWindow--");            // remove view            if (mWindowManager != null&&mVideoView.isShown()) {                try {                    if(mVideoView.isPlaying()){                        mVideoView.stopPlayback();                    }                } catch (Exception e) {                    e.printStackTrace();                }                mVideoView.setVisibility(View.GONE);                // mWindowManager.removeView(this);//Attempting to destroy the window while drawing!解决参考http://www.mamicode.com/info-detail-302525.html                mVideoView.post(new Runnable() {                    @Override                    public void run() {                        try {                            mWindowManager.removeView(mVideoView);//将整个窗口移除,没有这句会出现窗口残留                        } catch (Exception e) {                            e.printStackTrace();                        }                    }                });            }        } catch (Exception e) {            e.printStackTrace();        }    }    @Override    protected void onDestroy() {        Log.i("linux","--onDestroy--");        //注册广播        unregisterReceiver(mHomeKeyEventReceiver);        mVideoView.stopPlayback();        super.onDestroy();    }    //设置弹出窗口的样式    private WindowManager.LayoutParams getWindowParams( ) {//参考柠檬sdk和http://www.jianshu.com/p/167fd5f47d5c        WindowManager.LayoutParams params = new WindowManager.LayoutParams();        params.format = PixelFormat.RGBA_8888;        params.width = ViewGroup.LayoutParams.MATCH_PARENT;        params.height = ViewGroup.LayoutParams.MATCH_PARENT;        params.gravity =getGravity();//设置弹窗位置//          params.type = android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;//部分手机不允许弹出(必需权限android.permission.SYSTEM_ALERT_WINDOW)        params.type = WindowManager.LayoutParams.TYPE_PHONE;//优先级比TYPE_SYSTEM_ALERT会降低一些,即拉下通知栏不可见(必需权限android.permission.SYSTEM_ALERT_WINDOW)        params.flags|=WindowManager.LayoutParams.FLAG_FULLSCREEN;//设置全屏//      params.flags|= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//没有这句的话,手机会出现一个奇怪的现象。除了点击广告,屏幕上的其他东西都点不了,用户看到的手机就像卡死了一样。如果广告没有正常显示,用户就感觉手机莫名其妙的卡,卡爆了。//      // /悬浮框可以获得焦点触发事件,并且其他键盘按键也可以相应        params.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;        //设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)//      params.flags|= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//没有这句的话,手机会出现一个奇怪的现象。除了点击广告,屏幕上的其他东西都点不了,用户看到的手机就像卡死了一样。如果广告没有正常显示,用户就感觉手机莫名其妙的卡,卡爆了。        // 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,弹出的View收不到Back键的事件        {//想办法尽可能将广告界面全屏显示            params.flags|= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;//允许窗口扩展到屏幕之外,全屏显示(4.2以上不支持)            params.flags|= WindowManager.LayoutParams.FLAG_FULLSCREEN;//让window进行全屏显示            params.flags|= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;//让window占满整个手机屏幕,不留任何边界(border)        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT&&Build.VERSION.SDK_INT <24) {// 无需权限,即可让View显示。API 19以下因无法接收无法接收触摸(点击)和按键事件,故无法达到目的//注意:Android 7.1.1起不能再用Toast的问题(先解决crash)                params.type= WindowManager.LayoutParams.TYPE_TOAST;        }        params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;//设置为横屏  //Activity在横屏转竖屏的的时候,会先销毁这个Activity,然后重新开始OnCreate        params.horizontalMargin=0;        params.verticalMargin=0;        Log.i("linux","--type--"+params.type);        return params;    }//  /**//   * onConfigurationChanged//   * the package:android.content.res.Configuration.//   * @param newConfig, The new device configuration.//   * 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,//   * 并且如果此时有activity正在运行,系统会调用这个函数。//   * 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过//   * android:configChanges="xxxx"指定的配置类型的改动;//   * 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。//   *///  public void onConfigurationChanged(Configuration newConfig) {//      super.onConfigurationChanged(newConfig);//      // 检测屏幕的方向:纵向或横向//      if (this.getResources().getConfiguration().orientation//              == Configuration.ORIENTATION_LANDSCAPE) {//          //当前为横屏, 在此处添加额外的处理代码//      }//      else if (this.getResources().getConfiguration().orientation//              == Configuration.ORIENTATION_PORTRAIT) {//          //当前为竖屏, 在此处添加额外的处理代码//      }//      //检测实体键盘的状态:推出或者合上//      if (newConfig.hardKeyboardHidden//              == Configuration.HARDKEYBOARDHIDDEN_NO){//          //实体键盘处于推出状态,在此处添加额外的处理代码//      }//      else if (newConfig.hardKeyboardHidden//              == Configuration.HARDKEYBOARDHIDDEN_YES){//          //实体键盘处于合上状态,在此处添加额外的处理代码//      }//  }}
原创粉丝点击