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){// //实体键盘处于合上状态,在此处添加额外的处理代码// }// }}
阅读全文
0 0
- Android VideoView播放视频
- VideoView播放视频
- Android VideoView播放视频
- 使用VideoView播放视频
- 播放视频-VideoView用法
- VideoView简单视频播放
- Android VideoView播放视频
- Android VideoView播放视频
- Android VideoView播放视频
- VideoView播放视频
- android videoview播放视频
- android---视频播放---VideoView
- 利用VideoView播放视频
- 使用VideoView播放视频
- videoview实现视频播放
- 利用VideoView播放视频
- 使用VideoView播放视频
- 使用VideoView播放视频
- 马云自动收银系统淘咖啡店系统开发
- qt中的toUtf8, toLatin1, Local8bit, toUcs4
- UIWebView在修改字体大小出现闪烁及取消放缩效果
- USBASP烧录出现的几种错误
- HTTP 协议
- VideoView播放视频
- LINUX内核进程调度学习笔记(一)
- Python:深拷贝,浅拷贝import copy
- 图解转载 原创代码适合新手入门
- Qt开源参考项目 收集
- Mysql多个LEFT JOIN使用ORDER不能使用索引导致查询过慢的解决方案
- linux jdk的环境变量配置
- [StackExchage]Redis 的连接与操作(跨机器)
- Java学习笔记-《Java程序员面试宝典》-第5章Java Web-5.3框架(5.3.14-5.3.15)