智能终端系统及应用开发
课程设计报告
题目: 本地视频播放器
湖南
班 级: 科
技大学计
16级计算机2班
姓 名:
学 号: 湖南
指导教师:
湖南科技大学计算机科学与工程
本地视频播放器
1. 设计内容
首先,我们简单地来分析这个App的架构,可以知道需要3个界面。一个启动页面,一个获取播放视频列表界面,一个播放界面。
设计启动页面,需要显眼地告诉用户App正在启动,但是要考虑启动页面的时长(建议启动页面两秒后,跳到播放视频列表页面),
设计获取视频列表界面,需要让App获取访问存储空间的权限,App访问存储空间获取了视频信息,将视频信息展示出来。如果App获取视频信息视频(sd卡无视频),提示用户没有视频。此外,App首次启动成功后,App搜索视频需要一定的时间,所以要设计一个进度条提示用户等待。
设计播放界面,首先要考虑能否播放,如果点击视频播放进入播放界面出现播放出错,则要提示用户并且自动跳转到视频列表界面。视频能成功播放的话,在播放界面需要一个可以自动隐藏的控制面板,面板里有音量控制器,返回按钮,播放/暂停按钮,上一个/下一个按钮,全屏/默认视频画面按钮,视频读条和视频总时长。另外,在播放画面上方需要一个状态栏,在状态栏中设有电池量和系统时间。
2. 设计方法
2.1. 界面设计
启动界面使用相对布局,
图片元素相对父容器水 平居中。
又在相对布局中设置了 线性布局,将进度圈和 文字放了其中,并将这 个布局放在图片元素下 方。相对父容器水平居 中。
视频列表界面有两个,图2.1.1和图2.1.2所示
1
图2.1.1
图2.1.2
图2.1.1是App获取视频时,有个进度圈会转直到视频以列表形式展示出来或者视频没有找到会提示没有发现视频。整个视频列表界面是以相对布局,然后在里面嵌套一个ListView,一个相对于父容器水平居中的ProgressBar,一个提示用户的TextView。
图2.1.2是视频信息展示出来的样子,整个界面也是相对布局,在里面嵌套线性布局相对于视频图标的右边,在线性布局中TextList控件,设置视频的名称和时长。在父容器中添加TextList控件设置视频大小,添加一个View控件设置视频之间的间隔线。
2.2. 架构设计
图2.2.1
主界面分为两个部分,一个部分是用Fragment来做视频信息列表,另一部分就是用RadioGroup容器,将单选按钮放入其中
2
3. 实现方法
3.1. 启动页面延迟两秒进入主页面
1. new一个Handler类,实例化类对象handler. 2. 用handler调用定时器函数
3. handler.postDelayed(new Runable(){},2000). 4. 两秒后,执行线程里面的函数 主要代码如下:
private Handler handler = new Handler(); @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); handler.postDelayed(new Runnable() { @Override public void run() {
//两秒后才执行到这里 //执行在主线程中 startMainActivity(); } }, 2000); }
private boolean isStartMain = false; /**
* 跳转到主页面,并且把当前页面关闭掉 */
private void startMainActivity() { if(!isStartMain){ isStartMain = true;
Intent intent = new Intent(this,MainActivity.class); startActivity(intent); //关闭当前页面 finish(); } }
3.2. 获取本地视频
1. 从本地的sdcard得到数据
2. 遍历sdcard,后缀名
3. 从内容提供者里面获取视频
4. 如果是6.0的系统,动态获取读取sdcard的权限 主要代码如下:
@Override public void run() {
3
super.run();
isGrantExternalRW((Activity) context); mediaItems = new ArrayList<>(); //获得内容解析者对象
ContentResolver resolver = context.getContentResolver(); Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; String[] objs = {
MediaStore.Video.Media.DISPLAY_NAME,//视频文件在sdcard的名称 MediaStore.Video.Media.DURATION,//视频总时长 MediaStore.Video.Media.SIZE,//视频的文件大小 MediaStore.Video.Media.DATA,//视频的绝对地址 MediaStore.Video.Media.ARTIST,//歌曲的演唱者 };
Cursor cursor = resolver.query(uri, objs, null, null, null); if(cursor != null){
while (cursor.moveToNext()){
MediaItem mediaItem = new MediaItem(); mediaItems.add(mediaItem);//写在上面 String name = cursor.getString(0);//视频的名称 mediaItem.setName(name);
long duration = cursor.getLong(1);//视频的时长 mediaItem.setDuration(duration);
long size = cursor.getLong(2);//视频的文件大小 mediaItem.setSize(size);
String data = cursor.getString(3);//视频的播放地址 mediaItem.setData(data);
String artist = cursor.getString(4);//艺术家 mediaItem.setArtist(artist); }
cursor.close(); }
//Handler发消息
handler.sendEmptyMessage(10); } /**
* 解决安卓6.0以上版本不能读取外部存储权限的问题
* @param activity * @return */
public static boolean isGrantExternalRW(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission( Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
PackageManager.PERMISSION_GRANTED) activity.requestPermissions(new String[]{
4
{