项目需要打开本地的一个指定路径下的文件夹,获取视频后再调用一个播放器播放。获取本地视频并生成缩略图我查到了两种思路:

1.使用安卓系统自带浏览器

这种方法不需要自己定义一个图片展示的布局文件,只写几行代码就可以,缺点是会获取存储中所有mp4和3gp的视频,无法指定打开路径,所以不符合项目需求没有采用。

先定义了一个按钮打开浏览器:

Button button2 = (Button) findViewById(R.id.xuanshipin);button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("video/*");//这里是设置打开文件的类型,也可以换成图片startActivityForResult(intent, VIDEO_CAPTURE1);//定义处理浏览结果的类,也就是说点击某一个文件后需要执行的操作,VIDEO_CAPTURE是参数,在多个按钮时使用}});

处理结果的类定义如下:
这里定义了一个imageview来显示选择后的视频第一帧,所及记得在一开始声明,bitmap和imageview

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK && requestCode == VIDEO_CAPTURE0) {Uri uri = data.getData();Cursor cursor = this.getContentResolver().query(uri, null, null, null, null);if (cursor != null && cursor.moveToNext()) {int id = cursor.getInt(cursor.getColumnIndex(VideoColumns._ID));String filePath = cursor.getString(cursor.getColumnIndex(VideoColumns.DATA));bitmap = Thumbnails.getThumbnail(getContentResolver(), id, Thumbnails.MICRO_KIND, null);// ThumbnailUtils类2.2以上可用// Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(filePath,// Thumbnails.MICRO_KIND);imageView.setImageBitmap(bitmap);Log.d("ddd", "filepath==" + filePath);File file=new File(filePath);cursor.close();}}else if (resultCode == Activity.RESULT_OK && requestCode == VIDEO_CAPTURE1) {Uri uri = data.getData();File file = getFileByUri(uri);MediaMetadataRetriever mmr=new MediaMetadataRetriever();//实例化MediaMetadataRetriever对象  mmr.setDataSource(file.getAbsolutePath());bitmap=mmr.getFrameAtTime(2000);//获得视频第一帧的Bitmap对象String duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)Log.d("ddd","duration=="+duration);int int_duration= Integer.parseInt(duration);if(int_duration>45000){Toast.makeText(getApplicationContext(), "视频时长超过45秒请重新选择", Toast.LENGTH_SHORT).show();;}imageView.setImageBitmap(bitmap);}

这种方法打开浏览器时很快,用户体验很好。

2.自己定义listview

缺点是代码量大,而且耗时操作不会处理

先看布局文件,其实也不怎么费事:
线性布局下整个listview

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".Choose_video" ><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ListView android:id="@+id/lv_show"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></RelativeLayout>

然后是往布局里填充文件预览图片的操作,直接是一个activity,

public class Choose_video extends Activity implements OnItemClickListener{private String cur_path=Environment.getExternalStorageDirectory().toString()+"/VRDemo/video/";//这里就是自定义打开路径啦private List<Picture> listPictures;ListView listView ;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 0) {List<Picture> listPictures = (List<Picture>) msg.obj;MyAdapter adapter = new MyAdapter(listPictures);listView.setAdapter(adapter);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.choose_video);new Thread(new Runnable() {@Overridepublic void run() {loadVaule();//oncreate()里定义这个方法特别耗时,导致整个界面启动超级慢,需要4/5秒的样子}}).start();}//下面就看看这个方法里有多耗时private void loadVaule(){File file = new File(cur_path);File[] files  = null;files = file.listFiles();listPictures = new ArrayList<Picture>();for (int i = 0; i < files.length; i++) {Picture picture = new Picture();picture.setBitmap(getVideoThumbnail(files[i].getPath(), 200, 200, MediaStore.Images.Thumbnails.MICRO_KIND));picture.setPath(files[i].getPath());listPictures.add(picture);}listView = (ListView) findViewById(R.id.lv_show);listView.setOnItemClickListener(this);Message msg = new Message();msg.what = 0;msg.obj = listPictures;handler.sendMessage(msg);}//获取视频的缩略图private Bitmap getVideoThumbnail(String videoPath, int width, int height, int kind) {   Bitmap bitmap = null;  // 获取视频的缩略图  bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
//         System.out.println("w"+bitmap.getWidth());
//         System.out.println("h"+bitmap.getHeight());  bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,  ThumbnailUtils.OPTIONS_RECYCLE_INPUT);  return bitmap;  }//定义适配器放listview
public class MyAdapter extends BaseAdapter {private List<Picture> listPictures;public MyAdapter(List<Picture> listPictures) {super();this.listPictures = listPictures;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn listPictures.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn listPictures.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View v, ViewGroup arg2) {// TODO Auto-generated method stuView view = getLayoutInflater().inflate(R.layout.item,null);ImageView imageView = (ImageView) view.findViewById(R.id.iv_show);TextView textView = (TextView) view.findViewById(R.id.tv_show);imageView.setImageBitmap(listPictures.get(position).getBitmap());textView.setText(listPictures.get(position).getPath());return view;}}@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "点击了"+arg2, 200).show();startPlay(this, listPictures.get(arg2).getPath());//点击后打开播放器Log.e("path", listPictures.get(arg2).getPath());}public static void startPlay(Context context, String url) {if (url.contains(".mp4") || url.contains(".MP4")) {Intent intent = new Intent();intent.setClassName(context, "com.easemob.chatuidemo.activity.VideoPlayerActivity");intent.putExtra("playpath", url);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}else if(url.contains("rtsp") || url.contains("RTSP")){Intent intent = new Intent();intent.setClassName(context, "com.easemob.chatuidemo.activity.MakeVideoActivity");intent.putExtra("playpath", url);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);} else if (url.contains(".jpg") || url.contains(".png")) {Intent intent = new Intent();intent.setClassName(context, "com.easemob.chatuidemo.activity.VideoPlayerActivity");intent.putExtra("playpath", "/sdcard/VRDemo/capture/aa.jpg");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}else {Toast.makeText(context, "没有资源哦", Toast.LENGTH_SHORT).show();Intent intent = new Intent();intent.setClassName(context, "com.easemob.chatuidemo.activity.MainActivity");}}}

onCreate()里有耗时操作的解决办法:
(1)在Activity启动前,尽量少做。
(2)对于布局比较复杂的时候,可以考虑不要一次性全部加载上,动态加载是一个好的办法。
(3)对于及时需要的数据,加载起来耗时的又有异常危险的,一定记得开辟一个线程来做这些动作,千万记得不要做阻塞主线程(UI线程)的任何事情。
(4)对于特殊情况下,Activity启动确实需要大量工作时候,可以考虑先加载一个简单的布局(或是Activity)来过渡.

安卓浏览本地指定路径视频文件并播放相关推荐

  1. 利用Adobe Acrobat DC制作pdf模板后,使用java直接生成pdf至本地指定路径或导出pdf文件

    参考文章来源: springboot+itextpdf按模板生成PDF文件及在线下载PDF文件 JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救 ...

  2. Windows编程—杀死指定路径程序文件的进程

    前言 由于Windows命令 taskkill 无法通过程序文件的完整路径匹配来杀死指定进程,通过程序名称容易误杀进程,所有笔者做了一个简单的封装做了个mytaskkill.exe,用来杀死指定路径的 ...

  3. Unity3D中删除指定路径的文件+删除文件夹

    目录 一.目的 1.想知道:Unity3D中删除Application.streamingAssetsPath里面的文件 1.想知道:unity删除文件夹 二.参考 1.unity 文件和文件夹的创建 ...

  4. Win10系统,用C++调用OpenCV接口,播放本地视频文件,播放本地和网络摄像头

    1 前言 前边2篇文章介绍了在WIN10系统上,分别用C++和Python调用OpenCV接口,加载和显示一张静态图片.本篇我们来看一下,用C++如何调用OpenCV接口,打开和播放本地视频文件,打开 ...

  5. hutool 读取扩展名文件_Python OpenCV视觉智能感知第一讲——读取摄像头或视频文件并播放显示...

    Python OpenCV视觉智能感知 第一讲--读取摄像头或视频文件并播放显示 本部分内容将深入.全面.详细地介绍如何使用Anaconda Python和OpenCV读取摄像头或视频文件,并进行播放 ...

  6. 网页嵌入快播播放器并实现服务器视频文件连续播放

    上篇我们在网页中(html.jsp.php)嵌入了快播播放器,嵌入代码如下: <object classid="clsid:F3D0D36F-23F8-4682-A195-74C92B ...

  7. AVI 视频文件的播放

    项目组最近需要我开发写一个播放器程序,到今天这个工作基本上完成了,在开发过程中,需要让播放器支持AVI视频文件.对于AVI文件的操作之前接触较少,经过这些天的摸索,终于有了一些自己的看法. AVI(A ...

  8. php fopen 找不着文件,fopen 系统找不到指定路径 PHP文件包含详细讲述(4)

    test.txt 代码 结果截断失败,改下代码: $webpath = dirname(__FILE__)."/"; $filepath = "test.txt" ...

  9. Winform中实现FTP客户端并定时扫描指定路径下文件上传到FTP服务端然后删除文件

    场景 Windows10上怎样开启FTP服务: Windows10上怎样开启FTP服务_BADAO_LIUMANG_QIZHI的博客-CSDN博客 上面在Windows上搭建FTP服务器之后,会接收客 ...

最新文章

  1. 推荐几个超NB的技术公号!
  2. 手动配置Hibernate的方法
  3. python基础教程书籍推荐-小猿圈推荐Python入门书籍,不知道这些你就太low了。
  4. LA3971 组装电脑
  5. Linux 大规模请求服务器连接数相关设置
  6. 关于汽车领域的知识图谱实战入门
  7. 02.elasticsearch-monitor使用独立的集群存储监控data
  8. 《 第一行代码 》读后感
  9. fpga中wire和reg的区别
  10. 精选30道Java多线程面试题
  11. ggplot2绘图如何根据一个变量即区分颜色又区分深浅?
  12. 3项目里面全局用less变量 cli vue_vue-cli3配置使用vw实现移动端适配案例
  13. mysql 命令行执行存储过程_mysql 命令行执行存储过程
  14. 云创大数据荣获“南京实体经济十大优秀企业”
  15. html5毕业论文总结,毕业论文小结(精选多篇)
  16. [高通MSM8953_64][Android10]user版本默认获取root权限
  17. TypeScript中interface和type的区别
  18. Ubuntu常用软件下载以及视频流裁剪转码获取教程(可直接下载油管、B站、优酷等视频资源!)
  19. 【树莓派】基于树莓派,实现无线路由功能
  20. 安科瑞运维项目中的计量产品应用及解决方案

热门文章

  1. 设定是否使用IOB中的寄存器
  2. EPICS记录参考--Waveform记录(waveform)
  3. asp.net房屋出租销售网
  4. 输入一个四位数字x,分别求出x的个位数字、十位数字、百位数字和千位数字的值 ,并求个位、十位、百位、千位的和 -C语言
  5. 寻找那些神奇的自幂数---C语言
  6. SQL 多个字段的值拼接成Josn
  7. MWorks建模、仿真、分析优化平台
  8. 染色体的基因顺序遗传图谱
  9. 如果你在做安利或者认识做安利的人
  10. word中插入未压缩的原图