一、案例效果

二、主界面的设计与功能

2.1 案例效果

2.2 布局界面 activity_main.xml 参考代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:background="@drawable/bg_picture" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button" android:text="进入视频列表" android:textColor="#000000" android:textSize="30sp" android:textStyle="bold" android:layout_gravity="center" android:layout_marginTop="60dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout> 

2.3、类文件 MainActivity.java 参考代码:

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity { //定义对象 Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定控件 button=findViewById(R.id.button); //点击跳转事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(MainActivity.this,VideoActivity.class); startActivity(intent); } }); }
} 

三、视频列表界面的设计与功能

3.1 案例效果

3.2、布局界面 activity_video.xml 参考代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".VideoActivity"> <TextView android:text="视频列表" android:textColor="#00007f" android:textSize="40sp" android:textStyle="bold" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"/>
</LinearLayout> 

3.3、类文件 VideoActivity.java 参考代码:

package com.example.myvideoplayer;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class VideoActivity extends AppCompatActivity { //定义对象 RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); initView();//控件初始化 initData();//数据初始化 } private void initView() { recyclerView=findViewById(R.id.recyclerview); } private void initData() { //准备视频数据 List<Video> videolist=new ArrayList<>(); //1、网络视频 Video firstvideo=new Video("紧急救援 ","http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4"); videolist.add(firstvideo); Video secondvideo=new Video("玩具总动员 ","http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4"); videolist.add(secondvideo); //2、本工程中的视频 Video thirdvideo=new Video("see you again","android.resource://"+getPackageName()+"/"+R.raw.seeyouagain); videolist.add(thirdvideo); Video fourthvideo=new Video("why live","android.resource://"+getPackageName()+"/"+R.raw.whylive); videolist.add(fourthvideo); //3、模拟器中的视频 Video fifthvideo=new Video("天生我材必有用","file:///storage/emulated/0/Pictures/天生我材必有用.mp4"); videolist.add(fifthvideo); Video sixthvideo=new Video("罗密欧与朱丽叶","file:///storage/emulated/0/Pictures/罗密欧与朱丽叶.mp4"); videolist.add(sixthvideo); //适配器 VideoAdapter adapter=new VideoAdapter(videolist); //让数据显示到 recyclerview 控件上 StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapter); } } 

3.4、类文件 MusicAdapter.java 参考代码:

package com.example.myvideoplayer;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class VideoAdapter extends
RecyclerView.Adapter<VideoAdapter.ViewHolder> { private List<Video> videolist; public VideoAdapter(List<Video> videolist) { this.videolist = videolist; } //方法 1:用于创建 ViewHolder 实例 @NonNull @Override public VideoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.video_item,parent,false);final ViewHolder holder=new ViewHolder(view); holder.videoview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //单击任意视频跳转到播放界面 int position=holder.getAdapterPosition(); Video video =videolist.get(position); String myvideoname=video.getVideoName(); String myvideoUrl=video.getVideoUrl(); Intent intent=new Intent(view.getContext(),PlayActivity.class); intent.putExtra("videoname",myvideoname); intent.putExtra("videourl",myvideoUrl); view.getContext().startActivity(intent); } }); return holder; } //方法 2:用于对 Recyclerview 中子项的数据进行赋值的 @Override public void onBindViewHolder(@NonNull VideoAdapter.ViewHolder holder, int position) { Video video=videolist.get(position); holder.video_name.setText(video.getVideoName());  } //方法 3:返回 Recyclerview 中数据源长度 @Override public int getItemCount() { return videolist.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView video_name; View videoview; public ViewHolder(@NonNull View view) { super(view); video_name=view.findViewById(R.id.video_name); videoview=view; } }
} 

3.5、布局界面 video_item.xml 参考代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <ImageView android:src="@drawable/video_icon" android:layout_width="60dp" android:layout_height="60dp" android:layout_marginLeft="5dp" android:layout_marginTop="5dp"/> <TextView android:id="@+id/video_name" android:text="视频的名字" android:textColor="#000000" android:textSize="30sp" android:textStyle="bold" android:layout_gravity="center" android:layout_marginLeft="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout>

3.6、类文件 Video.java 参考代码:

package com.example.myvideoplayer;
public class Video { private String videoName; private String videoUrl; public String getVideoName() { return videoName; } public String getVideoUrl() { return videoUrl; } public Video(String videoName, String videoUrl) { this.videoName = videoName; this.videoUrl = videoUrl; }
}

3.7、代码详解:

提醒:

(1)添加依赖,由于 RecyclerView 是 android 5.0 新增的控件,所以需要在 build.gradle 里面添加依赖:如下                                                                                                

implementation'com.android.support:recyclerview-v7:28.0.0' 

(2)因为要读写 sd 卡上的歌曲,所以需要在配置文件中添加权限,如下

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" />

(3)在配置文件中,开通网络权限

<uses-permission android:name="android.permission.INTERNET"/>

(4)右击 res 文件夹,new---Directory,文件名:raw(文件名不能自定义),让一个视频文件粘贴到该文件夹下。

(5)选择视频,将该视频存储到模拟器 sdcard 文件夹中的 Movies 文件夹里。(本案例实用的方法二)

模拟器中的Url应该怎么书写???

方法一:String path1 = Environment.getExternalStorageDirectory().getPath() + “/文件所在子目录/视频文件名.MP4";

方法二:String path2 = “file:///路径/视频文件名.MP4";

(6)这里的view.getContext()返回的是Activity,表示上下文环境

四、视频播放界面的设计与功能

4.1 案例效果

4.2、布局界面 activity_play.xml 参考代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".PlayActivity"> <TextView android:id="@+id/my_videoname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="视频名称" android:textStyle="bold" android:textSize="30sp" android:textColor="#00008F" android:layout_gravity="center" android:layout_marginTop="30dp"/> <VideoView android:layout_width="match_parent" android:layout_height="400dp" android:id="@+id/my_videoview"/>
</LinearLayout>

4.3、类文件 PlayActivity.java 参考代码:

package com.example.myvideoplayer;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;
public class PlayActivity extends AppCompatActivity { //定义对象 private TextView my_videoname; private VideoView my_videoview; //视频播放器 private MediaController mediaController;//定义媒体控制柄 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_play); initView();//控件初始化 initData();//数据初始化 } private void initView() { my_videoname=findViewById(R.id.my_videoname); my_videoview=findViewById(R.id.my_videoview); mediaController=new MediaController(this); } private void initData() { //1、获取从音乐列表传过来的视频名称和视频地址 String myvideoname=getIntent().getStringExtra("videoname"); String myvideourl=getIntent().getStringExtra("videourl"); //2、将视频名称显示在文本框中,将视频地址关联到播放器中 my_videoname.setText(myvideoname); my_videoview.setVideoPath(myvideourl); //视频播放器和媒体控制柄关联起来 my_videoview.setMediaController(mediaController); //媒体控制柄和视频播放器关联起来 mediaController.setMediaPlayer(my_videoview); //3、启动视频播放器播放视频 my_videoview.start(); }
} 

4.4、代码讲解:

(1)VideoView详解

在Android的界面控件中有一个视频播放控件VideoView,可以直接在手机上 面开辟一个视频播放的UI,播放视频。程序中利用控件进行播放比较简单,几 个重要的方法如下:

// 指定需要播放的视频的地址videoView.setVideoURI(Uri.parse("android.resource://poet.android.factory/"+R.raw.demo));

//设置视频路径 videoView.setVideoPath();

// 设置播放器的控制条 videoView.setMediaController(new MediaController(this));

// 开始播放视频 videoView.start();

(2)媒体控制柄MediaController详解

VideoView控制视频播放的功能相对较少,具体而言,它只有start和pause方 法。为了提供更多的控制,可以实例化一个MediaController,并通过 setMediaController方法设置其为VideoView的控制器。

默认的MediaController有后退(rewind)、暂停(pause)、播放(play)和快进 (fast-forward)按钮,还有一个清除和进度条组合控件,可以用来定位到视频中的任何一个位置。

到目前为止,程序的功能都已经完成了;

假如我们有200个视频需要存储,显然存储到raw文件夹下和模拟器中都是不可取的。

接下来是补充内容!!!

五、获取 Bmob 服务器上的视频

5.1 案例效果

注意:                                                                                                                                                         在百度中输入“比目后端云”,进入主页。注册账号,登录 创建应用。名称任意。比如我的应用名称为:MyOne 类型其他,创建应用。

接下来,通过 5 个步骤让程序有服务器关联起来。

步骤 1

第一步:在 Project 的 build.gradle 文件中添加 Bmob 的 maven 仓库地址:如下:

allprojects {repositories {google()jcenter()//第一步:在 Project 的 build.gradle 文件中添加 Bmob 的 maven 仓库地址://Bmob 的 maven 仓库地址--必填maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }}
}

步骤 2

第二步: 在 app 的 build.gradle 文件中添加 compile 依赖文件:

android {„„„„„„„„„„ //第二步: 在 app 的 build.gradle 文件中添加 compile 依赖文件:useLibrary 'org.apache.http.legacy'
}
dependencies {„„„„„„„„//第二步: 在 app 的 build.gradle 文件中添加 compile 依赖文件:implementation 'cn.bmob.android:bmob-sdk:3.7.0' implementation "io.reactivex.rxjava2:rxjava:2.2.2" implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'com.squareup.okio:okio:2.1.0' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.squareup.okhttp3:okhttp:3.12.0'
}

步骤 3

<!--第三步:在你的应用程序的 AndroidManifest.xml 文件中添加相应的权限:-->

<!--允许联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--获取 GSM(2g)、WCDMA(联通 3g)等网络状态的信息 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--获取 wifi 网络状态的信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--保持 CPU 运转,屏幕和键盘灯有可能是关闭的,用于文件上传和下载 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--获取 sd 卡写的权限,用于文件上传和下载-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许读取手机状态 用于创建 BmobInstallation-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

步骤 4

<!-- 第四步: 配置 ContentProvider¶ -->

<application „„„„„„„„„„„„</activity><!-- 第四步: 配置 ContentProvider¶ --><provider android:name="cn.bmob.v3.util.BmobContentProvider" android:authorities="com.example.musicvideoplayer.BmobContentProvider"></provider>
</application>

步骤 5

第五:在你想用 bmob 云的页面,初始化比目云//第五步:默认初始化参 2:app ID

public class VideoActivity extends AppCompatActivity {private static final String TAG = "VideoActivity";private RecyclerView recy_videoview;private List<VideoInfo> videoarrlist;private VideoAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video);initView();//控件初始化initData();//数据初始化initBmobData();//比目云数据初始化}
„„„„„„„„
private void initBmobData() {//第五步:默认初始化Bmob.initialize(this, "7c7717065cecdc8037c9d5180ac6bcea");„„„„„„„„}

5.2 在比目云上创建表

在比目云服务器上,创建一个表,表明 video_table,添加列数据,第一列:video_name; 第二列:video_url;                                                                                                                                         接下来添加行:单击视频地址下方,选择文件,上传一个视频,单击名字下方,输入视频的名字。

5.3 新建类文件 video_table.java

注意:工程中,创建类 video_table 类名要与比目云上的表名一模一样。变量名要与表中的 字段名一模一样。

package com.example.videoplayer;
import cn.bmob.v3.BmobObject;
import cn.bmob.v3.datatype.BmobFile;
public class video_table extends BmobObject { private String video_name; private BmobFile video_url; public String getVideo_name() { return video_name; } public BmobFile getVideo_url() { return video_url; }
}

5.4 在类文件中书写代码实现功能 VideoActivity.java

package com.example.videoplayer;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class VideoActivity extends AppCompatActivity { //定义对象 RecyclerView recyclerView; List<Video> videolist; VideoAdapter adapter; private static final String TAG = "VideoActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); initview(); //控件初始化 initData();//数据初始化 initBmobData();//比目云数据初始化 } private void initview() { recyclerView=findViewById(R.id.recyclerview); } private void initData() { videolist= new ArrayList<>(); //获取网络视频 Video firstvideo = new Video("玩具总动员", "http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4"); videolist.add(firstvideo); Video secondvideo = new Video("紧急救援", "http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4"); videolist.add(secondvideo); //获取本地视频 Video thirdvideo=new Video("see you again","android.resource://"+getPackageName()+"/"+R.raw.seeyouagain); videolist.add(thirdvideo); Video fourthvideo=new Video("why live","android.resource://"+getPackageName()+"/"+R.raw.whylive); videolist.add(fourthvideo); //获取模拟器中的视频 Video fifthvideo=new Video("天生我才必有用", "file:///storage/emulated/0/Pictures/天生我材必有用.mp4"); videolist.add(fifthvideo); Video sixthvideo=new Video("罗密欧与朱丽叶", "file:///storage/emulated/0/Pictures/罗密欧与朱丽叶.mp4"); videolist.add(sixthvideo); //让数据显示到 recyclerview 控件上 adapter=new VideoAdapter(videolist); StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapter); } private void initBmobData() { //第 5 步:默认初始化 Bmob.initialize(this, "fe59338cc50a44d1468bf8642a7e275b"); //把视频文件存储在比目云 BmobQuery<video_table> myquery=new BmobQuery(); myquery.findObjects(new FindListener<video_table>() { @Override public void done(List<video_table> list, BmobException e) { if(e==null){ for (video_table video_table1 : list) { //Log.d(TAG, "视频名称: "+video_table1.getVideo_name()+video_table1.getVideo_url()); Video seventhvideo=new Video(video_table1.getVideo_name(),video_table1.getVideo_url().getUrl()); videolist.add(seventhvideo); } adapter.notifyDataSetChanged(); }else{ Toast.makeText(VideoActivity.this,"查询失败 ",Toast.LENGTH_SHORT).show(); } } }); }
}

六、参考文献

简易视频播放器

Android的媒体播放器——简易视频播放器(详解)相关推荐

  1. Android制作简易的音乐播放器和视频播放器

    文章目录 制作简易的音乐播放器和视频播放器 播放多媒体文件 播放音频 MediaPlayer的工作流程 项目示例 播放视频 项目示例 制作简易的音乐播放器和视频播放器 播放多媒体文件 Android在 ...

  2. 视频播放器+android,简易视频播放器

    NetConnection 对象 0002 var netConnection:NetConnection=new NetConnection ; 0003 /*如果连接到没有使用服务器的 priva ...

  3. 【基于QMediaPlayer的简易视频播放器】— 3、结合QSlider实现播放进度控制和音量控制

    基于QMediaPlayer的简易视频播放器 1.创建基本布局 2.QMediaPlayer的基本使用 3.结合QSlider实现播放进度控制和音量控制 4.重载QSlider鼠标响应事件,实现单击跳 ...

  4. java视频播放器制作_java创建简易视频播放器

    java创建简易视频播放器 发布时间:2020-09-23 04:28:09 来源:脚本之家 阅读:98 作者:南柯一梦xihe 最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个 ...

  5. 视频播放页php,html jquery简易视频播放器

    html jquery js 简易视频播放器 直接上代码:html> Document #durationbar{ width: 500px; height: 20px; } #duration ...

  6. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显示视频播放进度,但即使作为一个视频播放器,只有这些 ...

  7. 【Java】简易视频播放器

    [效果图] [功能] 1.当窗口获取焦点后,按空格暂停/播放 2.原速播放键.暂停/播放键.倍速播放键(最高3倍速,每次递增0.5) 3.进度条可点击选择播放位置 4.时间显示.播放速度显示 [项目与 ...

  8. Android MediaPlay的使用以及实现视频播放器

    上篇文章中主要是介绍MediaPlay状态机流程和API的详解.同时也实现了一个简单的音频播放器,下面我们就来利用SurfaceView+MediaPlay实现一个简单的视频播放器. 视频播放器的效果 ...

  9. 【Harmony OS】【ArkUI】ets开发 简易视频播放器

    前言:这一次我们来使用ets的Swiper组件.List组件和Video组件制作一个简易的视频播放器.本篇是以HarmonyOS官网的codelab简易视频播放器(eTS)为基础进行编写.本篇最主要的 ...

最新文章

  1. Verilog设计实例(4)详解全类别加法器(一)
  2. ai3中文语音补丁_NS 暗黑破坏神3 中文补丁今日上线!刷起来
  3. 腾讯QQ企业邮箱POP3/SMTP设置
  4. 在用c语言写代码是这么找出错误,写代码(C语言)常见粗心小错误
  5. 尚硅谷_springcloud(2020新版 思维导图_全网最火SpringCloud2020全家桶教程
  6. Swagger的简单使用
  7. 如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2'
  8. Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]
  9. ssh Permission denied (publickey,password).
  10. 计算机硬件不仅使用二进制,【判断题】计算机硬件中不仅使用二进制表示数据,也经常使用十六进制。...
  11. SpringBoot整合腾讯云COS
  12. 一篇文章完全搞懂正则化(Regularization)
  13. 京东Deco 智能代码体验版正式上线啦,快来体验设计稿一键生成代码~
  14. 写给初学者:VB 中 ByRef 与 ByVal 参数传递方式的区别
  15. 机器人操作系统ROS(4)话题编程
  16. Error:(63, 20) Failed to resolve: com.github.chrisbanes:PhotoView:2.0.0
  17. 单片机故障排除篇--如何判定是硬件问题还是软件问题?
  18. Arduino开发实践蜂鸣器(附源码+效果图)
  19. python态密度曲线绘制_使用Multiwfn绘制态密度(DOS)图考察电子结构
  20. ajax写入json数据格式化,java ajax解析json数据格式化

热门文章

  1. 把好莱坞大片搬上区块链,好莱坞链(HLW Chain)要用区块链变革电影产业
  2. 基于Flask+bootstrap+sqlite开发宝宝成长管理系统,宝宝成长记录系统源码
  3. AttributeError: Layer my_model has no inbound nodes.
  4. 转载过来的一些嵌入式资料
  5. python学习之旅_第2天
  6. Python-OpenCV之操作像素进行反色(反相)处理
  7. 反色(顺序)C C++
  8. android 阿拉伯数字转汉字,Android中阿拉伯文字的阿拉伯数字
  9. 高等数学复习之导数的运算(等价无穷小替换)
  10. pl/sql 变量的声明与赋值