VideoView播放视频

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){
//          //实体键盘处于合上状态,在此处添加额外的处理代码
//      }
//  }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值