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){
// //实体键盘处于合上状态,在此处添加额外的处理代码
// }
// }
}
VideoView播放视频
最新推荐文章于 2022-05-17 21:57:39 发布