使用VideoView播放视频,视频路径有三种:

1. SD卡中

2. Android的资源文件中

3. 网络视频

第一种,SD卡中的方法。

路径写绝对路径,如果不能播放,可以赋予读取权限。

效果图:

MainActivity.java

  1. package com.example.aimee.videotest;
  2.  
  3. import android.Manifest;
  4. import android.content.pm.PackageManager;
  5. import android.net.Uri;
  6. import android.os.Build;
  7. import android.support.annotation.NonNull;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.os.Bundle;
  10. import android.view.WindowManager;
  11. import android.widget.MediaController;
  12. import android.widget.Toast;
  13. import android.widget.VideoView;
  14.  
  15. public class MainActivity extends AppCompatActivity {
  16. private final int REQUESTCODE=101;
  17. private VideoView videoView;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.layout);
  23.  
  24. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  25. if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
  26. int checkSelfPermission=checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
  27. if(checkSelfPermission== PackageManager.PERMISSION_DENIED){
  28. requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUESTCODE);
  29. }
  30. }
  31. play_mp4();
  32.  
  33. }
  34.  
  35. private void play_mp4(){
  36. String videoUrl1 = "/storage/emulated/0/save/a1.mp4";
  37. Uri uri = Uri.parse( videoUrl1 );
  38. videoView = (VideoView)this.findViewById(R.id.videoView );
  39. videoView.setMediaController(new MediaController(this));
  40. videoView.setVideoURI(uri);
  41. videoView.start();
  42. }
  43.  
  44. @Override
  45. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
  46. super.onRequestPermissionsResult(requestCode,permissions,grantResults);
  47. if(requestCode==REQUESTCODE){
  48. if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults[0]== PackageManager.PERMISSION_GRANTED){
  49. Toast.makeText(this,"ok", Toast.LENGTH_LONG).show();
  50.  
  51. }else {
  52. Toast.makeText(this,"无权限",Toast.LENGTH_LONG).show();
  53. }
  54. }
  55. }
  56. }

layout.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5.  
  6. <VideoView
  7. android:id="@+id/videoView"
  8. android:layout_width="wrap_content"
  9. android:layout_height="match_parent"
  10. />
  11. </LinearLayout>

androidmanifest.xml中要添加权限

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.INTERNET" />

注意:使用模拟器播放时,要确保路径下有那个视频。从电脑传视频到模拟器的方法在上一篇中有。不过,每次传完当时可以用,重启电脑或重启模拟器时,那个视频文件会丢失,所以下次想用时得重新上传。我是用的ADV tools里面创建的模拟器,不知道其他模拟器会不会同样如此。另外提醒一点,关于视频取名字的问题,好像是有规则的,应该是小写字母,数字和下划线,不知道记得准不准,尽量用小写字母吧。

另外说一点,这个是放在sd卡中,如果将APP删除了,这个里面的文件是不会被删除的。如果想要卸载APP的同时将它生成的文件全部删除掉的话,可以将文件放在android里面data文件夹,找到自己的域名代表的文件夹,其中又会有files的文件夹,卸载APP其实就是删除的这个域名的文件夹。它的路径获取可以用getExternalFileDir(null).getPath()获取。所以,路径也可以String videoUrl1 = this.getExternalFileDir(null).getPath() + "此处填路径下的文件夹名" + “文件名”;

创建文件夹

  1. public void createResourceFolder(Context context){
  2. String directory_Path = context.getExternalFilesDir(null).getPath()+RESOURCE_FOLDER;
  3. File directory = new File(directory_Path);
  4. if(!directory.exists()){
  5. Log.i(TAG, "Create resource folder");
  6. directory.mkdir();
  7. }
  8. }

第二种,Android的资源文件raw中。

获取路径的方法是"android.resource://" + getPackageName() + "/raw/" + R.raw.名字,值得注意的是,不要放入过大的视频,R资源文件对大小是有限制的。如果文件过大,R会飘红,放一个10s的视频都飘红了,这时候增加或修改android studio的文件就好了。

help-->Edit Custom Properties,文件打开后,加入一行idea.max.intellisense.filesize=10000就行了。

  1. public void play_mp4(){
  2. String video_path = "android.resource://" + getPackageName() + "/raw/" + R.raw.videotest;
  3. Uri uri = Uri.parse(video_path);
  4. videoView.setMediaController(new MediaController(this));
  5. videoView.setVideoURI(uri);
  6. videoView.start();
  7.  
  8. videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  9. @Override
  10. public void onCompletion(MediaPlayer mp) {
  11. videoView.setVisibility(View.GONE);
  12. Toast.makeText(MainActivity.this,"播放完毕",Toast.LENGTH_LONG).show();
  13. }
  14. });
  15. }

解决几个小问题:

1. 视频无法充满屏幕?

由于视频源不一样,可能有人会遇到视频并没有全部充满屏幕的情况。这时候我们需要创建一个CustomVideoView类重写VideoView的onMeasure方法。

CustomVideoView.java

  1. package com.example.aimee.oner;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.widget.VideoView;
  6.  
  7. public class CustomVideoView extends VideoView {
  8. public CustomVideoView(Context context) {
  9. super(context);
  10. }
  11.  
  12. public CustomVideoView(Context context, AttributeSet attrs) {
  13. super(context, attrs);
  14. }
  15.  
  16. public CustomVideoView(Context context, AttributeSet attrs, int defStyle) {
  17. super(context, attrs, defStyle);
  18. }
  19.  
  20. @Override
  21. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //我们重新计算高度
  22. int width = getDefaultSize(0, widthMeasureSpec);
  23. int height = getDefaultSize(0, heightMeasureSpec);
  24. setMeasuredDimension(width, height);
  25. }
  26. }

然后修改layout.xml中将VideoView换成com.example.aimee.oner.CustomVideoView,前面那一串是域名,自己的是什么就写什么。

2. 上面总是显示oner那一栏怎么办?

在styles.xml文件中添加一行,设置windowNoTitle为true

  1. <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
  2. <!-- Customize your theme here. -->
  3. <item name="colorPrimary">@color/colorPrimary</item>
  4. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  5. <item name="colorAccent">@color/colorAccent</item>
  6. <item name="windowNoTitle">true</item>
  7. </style>

3. 若视频放完,还需要进行别的操作怎么办?

videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){

@Override

public void onCompletion(MediaPlayer mp(){

当视频放完所需的操作

})

});

4. 关于Toast第一个参数的引用问题?

关于Toast里面的第一个参数context,如果是在MainActivity中,用的是MainActivity.this,还有种情况可以用this就行了,这些都行不通的话,可是试试先在class里面声明private Context context;然后在onstart()里面写context=this,接下来在函数中用Toast时第一个参数就是context就OK了。上述代码中之所以加了一句videoView.setVisibility(View.GONE)就是将videoView给隐藏,就是让其提示播放完毕更明显。

5. 怎么去掉最上面显示的wifi,移动,电池那一栏呢?

在MainActivity.java的onCreate方法开头写

  1. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  3. WindowManager.LayoutParams.FLAG_FULLSCREEN);

第二十四篇-用VideoView制作一个简单的视频播放器的更多相关文章

  1. 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法

    第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我 ...

  2. 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器

    来自:http://blog.csdn.net/dawanganban/article/details/17679069 在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的 ...

  3. SpringBoot第二十四篇:应用监控之Admin

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章(S ...

  4. 第二十四篇configparser(**)

    configparser模块 config:配置,parser:解析.字面意思理解configparser模块就是配置文件的解析模块. 来看一个好多软件的常见文档格式如下: [DEFAULT] # 标 ...

  5. (转) SpringBoot非官方教程 | 第二十四篇: springboot整合docker

    这篇文篇介绍,怎么为 springboot程序构建一个Docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...

  6. SpringBoot非官方教程 | 第二十四篇: springboot整合docker

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot24-docker/ 本文出自方志朋的博客 这篇文 ...

  7. Python之路【第二十四篇】:Python学习路径及练手项目合集

      Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...

  8. Python之路【第二十四篇】Python算法排序一

    什么是算法 1.什么是算法 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出.简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果. ...

  9. Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

随机推荐

  1. Linux基础学习笔记4-文本处理

    本章内容 抽取文本的工具 文件内容:less和cat 文件截取:head和tail 按列抽取:cut 按关键字抽取:grep 文件查看 文件查看命令:cat,tac,rev cat [OPTION] ...

  2. docker学习笔记一

    知识点: 1)docker简介 2)docker安装,仓库配置 3)docker仓库镜像拉取,导出,导入,删除 4)docker容器操作,容器的创建,删除,运行,停止,日志查看等. 5)  docke ...

  3. LeetCode & Online Programming Learning Platform

    leetcode LeetCode is the best platform to help you enhance your skills, expand your knowledge and pr ...

  4. Delphi调用MSSQL存储过程返回的多个数据集的方法

    varaintf:_Recordset;RecordsAffected:OleVariant; begin ADOStoredProc1.Close;ADOStoredProc1.Open;aintf ...

  5. vscode实现vue.js项目的过程

    https://blog.csdn.net/weixin_37567150/article/details/81291433 https://blog.csdn.net/ywl570717586/ar ...

  6. ES 6 系列 - 赋值的新方式:解构赋值

    变量的解构赋值 es 6 允许按照一定的模式,从数组和对象中提取值,然后对变量进行赋值,这被称之为解构: 一.数组的解构赋值 最基本写法: let [a, b, c] = [1, 2, 3]; a / ...

  7. 4.namespace

    命名空间( namespace)是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便 利. 利用这一特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在 独立的操作系统环境 ...

  8. Nginx 如何限制响应速度

    在 location 里设置 location { set $limit_rate 1k; 表示每秒只响应1k的速度 }

  9. python第三方库的四种安装方法

    1,直接pip install安装 2,在python-->default setting-->project interprer-->add 3,在这个链接里找到需要的包,下载 h ...

  10. C语言实现字符串逆序输出

    方法一: #include <stdio.h> #include <stdlib.h> #include <string.h> void Reverse(char ...