我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)

前言

  关键字:Vitamio、VPlayer、Android播放器、Android影音、Android开源播放器

  本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能)完成,和播放组件关系不大,但用到一些实用的技术,欢迎交流!

系列

  1、Android 使用Vitamio打造自己的万能播放器(1)——准备

  2、Android 使用Vitamio打造自己的万能播放器(2)—— 手势控制亮度、音量、缩放

  3、Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、播放列表)

正文

  一、目标

    1.1  A-Z快速切换查找影片

  把手机上的联系人上的A-Z快速查找运用到了这里,查找文件更便捷。这也是"学"的米聊的 :)

    1.2  缓存扫描视频列表

  首次使用扫描SD卡一遍,以后就从数据库读取了,下篇文章再加一个监听即可。

    1.3      截图

          二、实现

 核心代码:


public class FragmentFile extends FragmentBase implements OnItemClickListener {
 private FileAdapter mAdapter;
 private TextView first_letter_overlay;
 private ImageView alphabet_scroller;
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 View v = super.onCreateView(inflater, container, savedInstanceState);
 // ~~~~~~~~~ 绑定控件
 first_letter_overlay = (TextView) v.findViewById(R.id.first_letter_overlay);
 alphabet_scroller = (ImageView) v.findViewById(R.id.alphabet_scroller);
 // ~~~~~~~~~ 绑定事件
 alphabet_scroller.setClickable(true);
 alphabet_scroller.setOnTouchListener(asOnTouch);
 mListView.setOnItemClickListener(this);
 // ~~~~~~~~~ 加载数据
 if (new SQLiteHelper(getActivity()).isEmpty())
 new ScanVideoTask().execute();
 else
 new DataTask().execute();
 return v;
 }
 
 @Override
 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 final PFile f = mAdapter.getItem(position);
 Intent intent = new Intent(getActivity(), VideoViewDemo.class);
 intent.putExtra("path", f.path);
 startActivity(intent);
 }
 private class DataTask extends AsyncTask<Void, Void, ArrayList<PFile>> {
 @Override
 protected void onPreExecute() {
 super.onPreExecute();
 mLoadingLayout.setVisibility(View.VISIBLE);
 mListView.setVisibility(View.GONE);
 }
 @Override
 protected ArrayList<PFile> doInBackground(Void... params) {
 return FileBusiness.getAllSortFiles(getActivity());
 }
 @Override
 protected void onPostExecute(ArrayList<PFile> result) {
 super.onPostExecute(result);
 mAdapter = new FileAdapter(getActivity(), FileBusiness.getAllSortFiles(getActivity()));
 mListView.setAdapter(mAdapter);
 mLoadingLayout.setVisibility(View.GONE);
 mListView.setVisibility(View.VISIBLE);
 }
 }
 
 private class ScanVideoTask extends AsyncTask<Void, File, ArrayList<PFile>> {
 private ProgressDialog pd;
 private ArrayList<File> files = new ArrayList<File>();
 @Override
 protected void onPreExecute() {
 super.onPreExecute();
 pd = new ProgressDialog(getActivity());
 pd.setMessage("正在扫描视频文件...");
 pd.show();
 }
 @Override
 protected ArrayList<PFile> doInBackground(Void... params) {
 // ~~~ 遍历文件夹
 eachAllMedias(Environment.getExternalStorageDirectory());
 // ~~~ 入库
 SQLiteHelper sqlite = new SQLiteHelper(getActivity());
 SQLiteDatabase db = sqlite.getWritableDatabase();
 try {
 db.beginTransaction();
 SQLiteStatement stat = db.compileStatement("INSERT INTO files(" + FilesColumns.COL_TITLE + "," + FilesColumns.COL_TITLE_PINYIN + "," + FilesColumns.COL_PATH + "," + FilesColumns.COL_LAST_ACCESS_TIME + ") VALUES(?,?,?,?)");
 for (File f : files) {
 String name = FileUtils.getFileNameNoEx(f.getName());
 int index = 1;
 stat.bindString(index++, name);//title
 stat.bindString(index++, PinyinUtils.chineneToSpell(name));//title_pinyin
 stat.bindString(index++, f.getPath());//path
 stat.bindLong(index++, System.currentTimeMillis());//last_access_time
 stat.execute();
 }
 db.setTransactionSuccessful();
 } catch (BadHanyuPinyinOutputFormatCombination e) {
 e.printStackTrace();
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 db.endTransaction();
 db.close();
 }
 // ~~~ 查询数据
 return FileBusiness.getAllSortFiles(getActivity());
 }
 @Override
 protected void onProgressUpdate(final File... values) {
 File f = values[0];
 files.add(f);
 pd.setMessage(f.getName());
 }
 
 public void eachAllMedias(File f) {
 if (f != null && f.exists() && f.isDirectory()) {
 File[] files = f.listFiles();
 if (files != null) {
 for (File file : f.listFiles()) {
 if (file.isDirectory()) {
 eachAllMedias(file);
 } else if (file.exists() && file.canRead() && FileUtils.isVideoOrAudio(file)) {
 publishProgress(file);
 }
 }
 }
 }
 }
 @Override
 protected void onPostExecute(ArrayList<PFile> result) {
 super.onPostExecute(result);
 mAdapter = new FileAdapter(getActivity(), result);
 mListView.setAdapter(mAdapter);
 pd.dismiss();
 }
 }
 private class FileAdapter extends ArrayAdapter<PFile> {
 public FileAdapter(Context ctx, ArrayList<PFile> l) {
 super(ctx, l);
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 final PFile f = getItem(position);
 if (convertView == null) {
 final LayoutInflater mInflater = getActivity().getLayoutInflater();
 convertView = mInflater.inflate(R.layout.fragment_file_item, null);
 }
 ((TextView) convertView.findViewById(R.id.title)).setText(f.title);
 return convertView;
 }
 }
 
 private OnTouchListener asOnTouch = new OnTouchListener() {
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN:// 0
 alphabet_scroller.setPressed(true);
 first_letter_overlay.setVisibility(View.VISIBLE);
 mathScrollerPosition(event.getY());
 break;
 case MotionEvent.ACTION_UP:// 1
 alphabet_scroller.setPressed(false);
 first_letter_overlay.setVisibility(View.GONE);
 break;
 case MotionEvent.ACTION_MOVE:
 mathScrollerPosition(event.getY());
 break;
 }
 return false;
 }
 };
 
 private void mathScrollerPosition(float y) {
 int height = alphabet_scroller.getHeight();
 float charHeight = height / 28.0f;
 char c = 'A';
 if (y < 0)
 y = 0;
 else if (y > height)
 y = height;
 int index = (int) (y / charHeight) - 1;
 if (index < 0)
 index = 0;
 else if (index > 25)
 index = 25;
 String key = String.valueOf((char) (c + index));
 first_letter_overlay.setText(key);
 int position = 0;
 if (index == 0)
 mListView.setSelection(0);
 else if (index == 25)
 mListView.setSelection(mAdapter.getCount() - 1);
 else {
 for (PFile item : mAdapter.getAll()) {
 if (item.title_pinyin.startsWith(key)) {
 mListView.setSelection(position);
 break;
 }
 position++;
 }
 }
 }

 代码说明:

         代码是基于上篇文章,新增了播放列表缓存功能以及快速查找功能。

  a).  使用了pinyin4j开源项目,用于提取文件名中的汉字的拼音,以便能够。

  b).  A-Z这部分的代码也是通过反编译参考米聊的,比较有实用价值

  c).  入库部分使用了事务

  其他代码请参见项目代码。

 注意:

由于是示例代码,考虑不尽周全,可能在后续章节中补充,请大家注意不要直接使用代码!例如应该检查一下SD卡是否可用等问题。

      三、Vtamio与VPlayer

 Vitamio:http://vov.io 
 VPlayer:http://vplayer.net (使用Vitamio最成功的产品,用户超过500万)

以上就是对Android Vitamio 本地播放功能(快捷搜索,数据存储)资料整理,有开发Android播放器的朋友可以参考下。

您可能感兴趣的文章:Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)Android 使用Vitamio打造自己的万能播放器(9)—— 在线播放 (在线电视)Android 使用Vitamio打造自己的万能播放器(8)——细节优化Android 使用Vitamio打造自己的万能播放器(7)——在线播放(下载视频)Android 使用Vitamio打造自己的万能播放器(6)——在线播放(播放列表)Android 使用Vitamio打造自己的万能播放器(5)——在线播放(播放优酷视频)Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、播放列表)Android 使用Vitamio打造自己的万能播放器(2)—— 手势控制亮度、音量、缩放Android 使用Vitamio打造自己的万能播放器(1)——准备Android使用vitamio插件实现视频播放器


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 使用Vitamio打造自己的万能播放器(4)——本地播放(快捷搜索、数据存储)

前言关键字:Vitamio、VPlayer、Android播放器、Android影音、Android开源播放器本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能)完成,和播放组件关系不大,但用到一些实用的技
2022-06-06

Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、播放列表)

前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment、ViewPager来搭建播放器的主界面,并实现本地播放基本功能。系列文章提供截图、代码说明、源码下载,欢迎交流
2022-06-06

Android 使用Vitamio打造自己的万能播放器(6)——在线播放(播放列表)

前言新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能。本章内容为"在线视频播放列表",集合了主流各大视频网站的手机版,欢迎给"开播视频"
2022-06-06

Android 使用Vitamio打造自己的万能播放器(5)——在线播放(播放优酷视频)

前言为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图、视频时间、尺寸等),跳过直接写在线播放部分的章节。从Vitamio的介绍可以看得出,其支持http、m3u8等多种网络协议,本章将编写播放
2022-06-06

Android 使用Vitamio打造自己的万能播放器(1)——准备

前言   虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式、性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的Android万能播放器!
2022-06-06

Android 使用Vitamio打造自己的万能播放器(7)——在线播放(下载视频)

前言本章将实现非常实用的功能——下载在线视频。涉及到多线程、线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术细节实现!系列1、Android 使用Vi
2022-06-06

Android 使用Vitamio打造自己的万能播放器(9)—— 在线播放 (在线电视)

前言 如果不想自己去找视频看,以传统方式看电视也不错,比如CCTV、湖南卫视等。本章从网络收集几百个电视台的地址,采用多级分类方式呈现,极大丰富在线播放部分的内容。系列 1、Android 使用Vitamio打造自己的万能播放器(1)——
2022-06-06

Android 使用Vitamio打造自己的万能播放器(8)——细节优化

前言成功的产品往往在细节之处也做到极致,产品和项目从使用的角度来看最大的区别我认为也就是细节的处理上。开播视频的目标是产品,前面7篇文章高歌猛进,添加了很多的功能,也该停下来休整一下,优化一下,也欢迎交流反馈做得不周到的地方。由于开源,大家
2022-06-06

Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)

前言 Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件。新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性、便捷性和许多内置实用的功
2022-06-06

Android 使用Vitamio打造自己的万能播放器(2)—— 手势控制亮度、音量、缩放

前言本章继续完善播放相关播放器的核心功能,为后续扩展打好基础。系列1、Android 使用Vitamio打造自己的万能播放器(1)——准备 正文 一、实现目标 1.1 亮度控制 模仿VPlayer界面: 1.
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录