视频放在assets文件下,这里的文件不会被编辑,但是使用的时候,需要用流转到本地,然后再使用

关于视频的相关测试数据,在文章最后

需要权限:

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

目录结构:

代码:
1、准备工作:
1.1、

import android.os.Environment;/*** 全局变量*/
public class CHEN {// 引导视频存放路径public static String GuideVideoSavePath = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/chen/guide_video/";// 引导视频播放路径public static String GuideVideoPlayPath = "";}

1.2、工具类

import android.text.TextUtils;public class Utils {/*** 检查字符串是否是空** @param str* @return true:字符串为空*/public static boolean checkStringIsEmpty(String str) {if (TextUtils.isEmpty(str) || "null".equals(str)) {return true;} else {return false;}}
}

1.3、styles.xml文件下:这个属性给展示视频的activity,让视频全屏播放

    <style name="fullscreen" parent="AppTheme"><item name="android:windowFullscreen">true</item></style>

2、自定义的videoview(保证能全屏的videoview)

import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;public class CustomVideoView extends VideoView {private Context context;public CustomVideoView(Context context) {this(context, null);}public CustomVideoView(Context context, AttributeSet attrs) {this(context, attrs, -1);}public CustomVideoView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context = context;init();}private void init() {//do something...}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//重新计算高度。保证全屏显示int width = getDefaultSize(0, widthMeasureSpec);int height = getDefaultSize(0, heightMeasureSpec);setMeasuredDimension(width, height);}}

3、使用:
3.1、一开始的MainActivity,布局文件我不做任何处理,就用新建时默认的就行,核心是下一个展示视频的activity

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class MainActivity extends Activity {private int time = 3000;public Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case 100:if (!Utils.checkStringIsEmpty(CHEN.GuideVideoPlayPath)) {//播放视频成功生成了startActivity(new Intent(MainActivity.this, VideoGuideActivity.class));MainActivity.this.finish();} else {//引导视频没有生成//do something...}break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);creatGuideVideo();//sendEmptyMessageDelayed(int what, long delayMillis)//延时time,发送一个what=100的值mHandler.sendEmptyMessageDelayed(100, time);}/*** 创建视频引导页文件*/private void creatGuideVideo() {new Thread() {public void run() {try {File path_file = new File(CHEN.GuideVideoSavePath);if (!path_file.exists()) {try {path_file.mkdirs();} catch (Exception e) {CHEN.GuideVideoPlayPath = "";}}long start = System.currentTimeMillis();//第二个参数是生成的文件的名字(包括后缀名),一般和assets文件中要打开的一致File file = new File(CHEN.GuideVideoSavePath, "guide_video.mp4");if (!file.exists()) {AssetManager assetManager = getAssets();// 获取asset管理者InputStream in = null;FileOutputStream out = null;try {//assets文件中要打开的文件的名字(包括后缀名)in = assetManager.open("guide_video.mp4");out = new FileOutputStream(file);byte[] b = new byte[1024];int len = -1;while ((len = in.read(b)) != -1) {out.write(b, 0, len);}} catch (IOException e) {e.printStackTrace();CHEN.GuideVideoPlayPath = "";} finally {if (out != null) {out.close();}if (in != null) {in.close();}}}long end = System.currentTimeMillis();Log.e("创建视频引导页播放视频用时===", "" + (end - start));CHEN.GuideVideoPlayPath = file.getAbsolutePath();} catch (Exception e) {CHEN.GuideVideoPlayPath = "";}}}.start();}
}

3.2、VideoGuideActivity(为了保证全屏,在清单文件中)

    <!--android:screenOrientation="portrait"是让屏幕旋转时视频不变--><!--android:theme="@style/fullscreen"是让这个activity全屏,没有状态栏和标题栏--><activity
        android:name=".VideoGuideActivity"android:screenOrientation="portrait"android:theme="@style/fullscreen"/>
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;/*** 视频引导页*/
public class VideoGuideActivity extends Activity {CustomVideoView video_view;private int videoIndex = -1;/*** 监听是否点击了home键将客户端推到后台*/private BroadcastReceiver homeAndLockReceiver = new BroadcastReceiver() {String SYSTEM_REASON = "reason";String SYSTEM_HOME_KEY = "homekey";@Overridepublic 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 (TextUtils.equals(reason, SYSTEM_HOME_KEY)) {//表示按了home键,程序到了后台video_view.pause();//得到当前视频播放的位置。单位是毫秒videoIndex = video_view.getCurrentPosition();Log.e("videoIndex", videoIndex + "");}} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {//按下锁屏键video_view.pause();//得到当前视频播放的位置。单位是毫秒videoIndex = video_view.getCurrentPosition();Log.e("videoIndex", videoIndex + "");}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.video_guide_layout);try {//注册广播,监听home键及锁屏键的按下IntentFilter filter = new IntentFilter();//锁屏广播,由系统发出filter.addAction(Intent.ACTION_SCREEN_ON);//锁屏广播,由系统发出filter.addAction(Intent.ACTION_SCREEN_OFF);//点击home键广播,由系统发出filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);registerReceiver(homeAndLockReceiver, filter);//注册广播结束video_view = (CustomVideoView) findViewById(R.id.video_view);/*** 视频或者音频到结尾时触发的方法*/video_view.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {doSomething();}});/*** 视频或者音频播放出错触发的方法*/video_view.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {doSomething();return false;}});video_view.setVideoURI(Uri.parse(CHEN.GuideVideoPlayPath));//播放video_view.start();} catch (Exception e) {doSomething();}}@Overrideprotected void onRestart() {super.onRestart();Log.e("onRestart", videoIndex + "");//video_view.start();video_view.seekTo(videoIndex == -1 ? 0 : videoIndex);//先start,再seekTo,home键回来是重播;先seekTo,再start,都是续播。但是如果距离开始时间较短(经测试,大约10以内,可能有误差),还是会出现重播现象。这些细节,在用的时候,多测试测试。对效果影响不大video_view.start();}@Overrideprotected void onDestroy() {super.onDestroy();if (homeAndLockReceiver != null) {unregisterReceiver(homeAndLockReceiver);}}//对返回键的监听@Overridepublic void onBackPressed() {super.onBackPressed();doSomething();}/*** 播放失败、异常时做的事。一般都是跳转到下个页面*/private void doSomething() {//do something...Toast.makeText(this, "do something...", Toast.LENGTH_SHORT).show();}}

4、测试数据:
一般的使用视频引导页,之前还会有一个图片启动页,最好在图启动页展示的时候,在本地创建视频,然后在视频引导页直接展示。时间上有要求,既要展示启动页,还要尽可能的给本地生成视频文件留下时间:
我测试了3组数据(单位毫秒):

assets中视频文件大小为5.6M时:
创建视频引导页播放视频用时===: 570assets中视频文件大小为6.6M时:
创建视频引导页播放视频用时===: 648assets中视频文件大小为16M时:
创建视频引导页播放视频用时===: 1697

注:我使用的是小米Note,我再使用魅族系列的一个低配手机的时候,出现过一次6.6M视频,在本地创建,时间为2700毫秒左右的情况。同一个手机,每次创建也会有差距,以上数据仅供参考

videoview实现视频引导页及从assets文件中读取文件到本地SD卡相关推荐

  1. 仿制慕课网app实现斗鱼,全民k歌视频引导页(ViewVideoViewPaper)炫酷效果

    在几个月前,我第一次玩全民k歌,下载完app,它弹出来的引导页吸引了我,不像以前的引导页一样千篇一律,而是用了视频的方式,用一种动态的方式来实现.在今天,我突然又想起了这个效果,就抽出了一点时间在网上 ...

  2. matlab读取表格读成mat文件,MATLAB 视频读取 Excel读写 Excel2txt txt2mat 按文件夹读取文件...

    视频转图片,图片取大小 clc;clear; obj=VideoReader('双闪.avi'); numFrames = obj.NumberOfFrames;% 帧的总数 for i=1:numF ...

  3. android 从assets和res中读取文件(转)

    1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...

  4. Android从assets和res中读取文件

    1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...

  5. Android中从assets资源中读取图片文件并保存到内部存储器并加载显示在ImageView中

    场景 Android系统为每个新设计的程序提供了/assets目录,这个目录保存的文件可以打包在程序里./res和/assets的不同点是,android不为/assets下的文件生成ID.如果使用/ ...

  6. OpenCV 从文件中读取视频并播放

    在OpenCV中要获取一个视频,需要创建一个VideoCapture对象,指定要读取的视频文件: 1.创建读取视频的对象 cap = cv.VideoCapture(filepath) 参数: fil ...

  7. android读取assets中的html文件,android读取assets文件.htm

    android读取assets文件 android读取assets文件 style='FONT-SIZE: 14px; FONT-FAMILY: verdana, "ms song" ...

  8. swift有一句代码搞定APP引导页(图片/GIF/视频)

    APP启动引导页(图片/gif/视频) 在APP启动时候设置引导页,不管图片,gif,还是视频只需要一个方法 视频引导页 视频核心代码如下 URL为本地视频地址,如果为网络视频 建议预下载在本地然后下 ...

  9. Uni-App 简单引导页示例

    Uni-App 简单引导页示例 第一步:建3个页面文件.在pages目录下,新建index/init.vue.index/guide.vue.index/home.vue pages.json: {{ ...

  10. php 移动端隐藏引导页,移动端引导设计技巧1:前置的引导页

    前言: 引导是带领用户更快速更愉悦地达到目标的过程,能在用户使用产品遇到障碍之前给予及时的帮助.在移动互联网的产品的设计中,新手引导的设计则是在用户初次使用该移动产品时,给予的一些必须性的帮助以使得用 ...

最新文章

  1. push与presentModal的 用法详解(转)
  2. 计算机一级b需要学哪些,希望通过江苏省计算机一级B考试的同学千万要看哦!江苏省计算机一级B理论复习资料(绝密资料)...
  3. nginx+tomcat8+memcached实现session共享具体操作
  4. python gui开发_python 开发GUI应用之Dabo
  5. 【script】python通过字符串调用方法
  6. 使用C++编程语言保存数据库查询结果的方法
  7. JAVA编程中异常问题处理方式的区别和分析
  8. 生成验证码易语言代码
  9. 计算机二级c语言考试真题及答案详解,全国计算机二级c语言考试题
  10. node.js与npm下载及配置流程
  11. 菜鸟java基础--1
  12. 单片机简单的计算器c语言程序,AT89S52单片机实现简易计算器(C语言程序)
  13. pcf8591c语言编程,PCF8591应用程序
  14. 同一页面显示不同内容
  15. 微信公众平台开发教程之新手初级入门攻略 附PHP代码实例
  16. JVM-内存与垃圾回收篇!女朋友看了都想当架构师的超详细保姆级笔记!呕心沥血之作!看完还不会你砍我!
  17. 截图转换为gif动图,gif动图制作
  18. ghost网络克隆功能实现【批量】计算机操作【系统的安装】,Ghost怎么网络克隆备份还原系统GhostCast教程...
  19. ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  20. 使用超临界二氧化碳进行精密表面清洁

热门文章

  1. win10 加快开机速度
  2. Unity基础案例讲解:创建小型太空射击游戏(一)
  3. MySQL数据库实验(六):创建学生信息管理系统
  4. “知识付费”的分类及传播特征
  5. Win系统 - 微星 GS65 笔记本电脑开机黑屏
  6. 移动光猫RAISECOM的配置方法
  7. sql查看mysql表结构_MySQL 查看表结构简单命令
  8. Electron“安装已中止,安装程序未成功地运行完成”
  9. 英特尔移动处理器全面解析
  10. element table 导出excel并设置excel样式列宽