android 视频缩略图之 MediaStore

参考: http://blog.youkuaiyun.com/chenjie19891104/article/details/6338910
http://www.eoeandroid.com/thread-51855-1-1.html

首先 声明MediaStore是2.0以后才有的类

listview.xml如下
Java代码 收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ImageView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:id="@+id/iv"
  11. />
  12. <TextView
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:id="@+id/tv"
  16. />
  17. </LinearLayout>


1、我先按照参考的第一个url来写的

Java代码 收藏代码
  1. packagecom.lp;
  2. importjava.util.ArrayList;
  3. importandroid.app.ListActivity;
  4. importandroid.content.Context;
  5. importandroid.database.Cursor;
  6. importandroid.net.Uri;
  7. importandroid.os.Bundle;
  8. importandroid.provider.MediaStore;
  9. importandroid.view.LayoutInflater;
  10. importandroid.view.View;
  11. importandroid.view.ViewGroup;
  12. importandroid.widget.BaseAdapter;
  13. importandroid.widget.ImageView;
  14. importandroid.widget.TextView;
  15. /**
  16. *本实例,我们将通过检索SDCard上的Video信息
  17. *在MediaStore中,MediaStore.Video.Media中就有Video相关信息,
  18. *同时MediaStore.Video.Thumbnails中含有各个video对应的缩略图信息
  19. *
  20. *@authorAdministrator
  21. *
  22. */
  23. publicclassMainActivityextendsListActivity{
  24. privateCursorcursor;
  25. privateArrayList<VideoInfo>videoList=newArrayList<MainActivity.VideoInfo>();
  26. privateImageViewimg;
  27. publicvoidonCreate(BundlesavedInstanceState){
  28. super.onCreate(savedInstanceState);
  29. init();
  30. }
  31. privatevoidinit(){
  32. String[]thumbColumns=newString[]{
  33. MediaStore.Video.Thumbnails.DATA,
  34. MediaStore.Video.Thumbnails.VIDEO_ID
  35. };
  36. String[]mediaColumns=newString[]{
  37. MediaStore.Video.Media.DATA,
  38. MediaStore.Video.Media._ID,
  39. MediaStore.Video.Media.TITLE,
  40. MediaStore.Video.Media.MIME_TYPE
  41. };
  42. //首先检索SDcard上所有的video
  43. cursor=this.managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,mediaColumns,null,null,null);
  44. while(cursor.moveToNext()){
  45. VideoInfoinfo=newVideoInfo();
  46. info.filePath=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
  47. info.mimeType=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
  48. info.title=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
  49. //获取当前Video对应的Id,然后根据该ID获取其Thumb
  50. intid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
  51. Stringselection=MediaStore.Video.Thumbnails.VIDEO_ID+"=?";
  52. String[]selectionArgs=newString[]{
  53. id+""
  54. };
  55. CursorthumbCursor=this.managedQuery(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,thumbColumns,selection,selectionArgs,null);
  56. if(thumbCursor.moveToFirst()){
  57. info.thumbPath=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA));
  58. }
  59. //然后将其加入到videoList
  60. videoList.add(info);
  61. }
  62. System.out.println(videoList.size());
  63. //然后需要设置ListView的Adapter了,使用我们自定义的Adatper
  64. VideoAdapteradapter=newVideoAdapter(this);
  65. this.getListView().setAdapter(adapter);
  66. }
  67. classVideoInfo{
  68. StringfilePath;
  69. StringmimeType;
  70. StringthumbPath;
  71. Stringtitle;
  72. }
  73. classViewHolder{
  74. ImageViewthumbImage;
  75. TextViewtitleText;
  76. }
  77. /**
  78. *定义一个Adapter来显示缩略图和视频title信息
  79. *@authorAdministrator
  80. *
  81. */
  82. privateclassVideoAdapterextendsBaseAdapter{
  83. privateContextmContext;
  84. privateLayoutInflaterinflater;
  85. publicVideoAdapter(Contextcontext){
  86. this.mContext=context;
  87. this.inflater=LayoutInflater.from(context);
  88. this.inflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  89. }
  90. @Override
  91. publicintgetCount(){
  92. //TODOAuto-generatedmethodstub
  93. returnvideoList.size();
  94. }
  95. @Override
  96. publicObjectgetItem(intp){
  97. //TODOAuto-generatedmethodstub
  98. returnvideoList.get(p);
  99. }
  100. @Override
  101. publiclonggetItemId(intp){
  102. //TODOAuto-generatedmethodstub
  103. returnp;
  104. }
  105. @Override
  106. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  107. ViewHolderholder;
  108. if(convertView==null){
  109. holder=newViewHolder();
  110. convertView=inflater.inflate(R.layout.listview,null);
  111. holder.thumbImage=(ImageView)convertView.findViewById(R.id.iv);
  112. holder.titleText=(TextView)convertView.findViewById(R.id.tv);
  113. convertView.setTag(holder);
  114. }else{
  115. holder=(ViewHolder)convertView.getTag();
  116. }
  117. //显示信息
  118. holder.titleText.setText(videoList.get(position).title);
  119. if(videoList.get(position).thumbPath!=null){
  120. holder.thumbImage.setImageURI(Uri.parse(videoList.get(position).thumbPath));
  121. }
  122. returnconvertView;
  123. }
  124. }
  125. }




但是 结果是能得到title 得不到缩略图 貌似大家都说好使 但是我这里就是不行 很是纳闷

后来 我就直接看了下com.android.providers.media下面的external-ef8261f.db

数据库的结构如下图:



这个就不介绍了 看下名字 应该就明白了
我们直接看video和videothumbnails 问题就在这里

video



这里面罗列的sdcard的所有视频文件 我们可以得到 名字 类型 持续时间 大小等有用的数据

再看一下 videothumbnails



这里面是没有数据的!!! 这个就是原因了
所以我们根据VIDEO_ID在videothumbnails表里面肯定是什么也得不到的

2、
仔细查看MediaStore.Video.Thumbnails类里面的方法 可以发现 提供了一个getThumbnail()方法 可以直接得到缩略图
Java代码 收藏代码
  1. packagecom.lp;
  2. importjava.util.ArrayList;
  3. importandroid.app.ListActivity;
  4. importandroid.content.Context;
  5. importandroid.database.Cursor;
  6. importandroid.net.Uri;
  7. importandroid.os.Bundle;
  8. importandroid.provider.MediaStore;
  9. importandroid.view.LayoutInflater;
  10. importandroid.view.View;
  11. importandroid.view.ViewGroup;
  12. importandroid.widget.BaseAdapter;
  13. importandroid.widget.ImageView;
  14. importandroid.widget.TextView;
  15. /**
  16. *本实例,我们将通过检索SDCard上的Video信息
  17. *在MediaStore中,MediaStore.Video.Media中就有Video相关信息,
  18. *同时MediaStore.Video.Thumbnails中含有各个video对应的缩略图信息
  19. *
  20. *@authorAdministrator
  21. *
  22. */
  23. publicclassMainActivityextendsListActivity{
  24. privateCursorcursor;
  25. privateArrayList<VideoInfo>videoList=newArrayList<MainActivity.VideoInfo>();
  26. privateImageViewimg;
  27. publicvoidonCreate(BundlesavedInstanceState){
  28. super.onCreate(savedInstanceState);
  29. init();
  30. }
  31. privatevoidinit(){
  32. String[]thumbColumns=newString[]{
  33. MediaStore.Video.Thumbnails.DATA,
  34. MediaStore.Video.Thumbnails.VIDEO_ID
  35. };
  36. String[]mediaColumns=newString[]{
  37. MediaStore.Video.Media.DATA,
  38. MediaStore.Video.Media._ID,
  39. MediaStore.Video.Media.TITLE,
  40. MediaStore.Video.Media.MIME_TYPE
  41. };
  42. //首先检索SDcard上所有的video
  43. cursor=this.managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,mediaColumns,null,null,null);
  44. while(cursor.moveToNext()){
  45. VideoInfoinfo=newVideoInfo();
  46. info.filePath=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
  47. info.mimeType=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
  48. info.title=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
  49. //获取当前Video对应的Id,然后根据该ID获取其Thumb
  50. intid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
  51. BitmapFactory.Optionsoptions=newBitmapFactory.Options();
  52. options.inDither=false;
  53. options.inPreferredConfig=Bitmap.Config.ARGB_8888;
  54. info.b=MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(),id,Images.Thumbnails.MICRO_KIND,options);
  55. //然后将其加入到videoList
  56. videoList.add(info);
  57. }
  58. System.out.println(videoList.size());
  59. //然后需要设置ListView的Adapter了,使用我们自定义的Adatper
  60. VideoAdapteradapter=newVideoAdapter(this);
  61. this.getListView().setAdapter(adapter);
  62. }
  63. classVideoInfo{
  64. StringfilePath;
  65. StringmimeType;
  66. Bitmapb;
  67. Stringtitle;
  68. }
  69. classViewHolder{
  70. ImageViewthumbImage;
  71. TextViewtitleText;
  72. }
  73. /**
  74. *定义一个Adapter来显示缩略图和视频title信息
  75. *@authorAdministrator
  76. *
  77. */
  78. privateclassVideoAdapterextendsBaseAdapter{
  79. privateContextmContext;
  80. privateLayoutInflaterinflater;
  81. publicVideoAdapter(Contextcontext){
  82. this.mContext=context;
  83. this.inflater=LayoutInflater.from(context);
  84. this.inflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  85. }
  86. @Override
  87. publicintgetCount(){
  88. //TODOAuto-generatedmethodstub
  89. returnvideoList.size();
  90. }
  91. @Override
  92. publicObjectgetItem(intp){
  93. //TODOAuto-generatedmethodstub
  94. returnvideoList.get(p);
  95. }
  96. @Override
  97. publiclonggetItemId(intp){
  98. //TODOAuto-generatedmethodstub
  99. returnp;
  100. }
  101. @Override
  102. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  103. ViewHolderholder;
  104. if(convertView==null){
  105. holder=newViewHolder();
  106. convertView=inflater.inflate(R.layout.listview,null);
  107. holder.thumbImage=(ImageView)convertView.findViewById(R.id.iv);
  108. holder.titleText=(TextView)convertView.findViewById(R.id.tv);
  109. convertView.setTag(holder);
  110. }else{
  111. holder=(ViewHolder)convertView.getTag();
  112. }
  113. //显示信息
  114. holder.titleText.setText(videoList.get(position).title);
  115. if(videoList.get(position).b!=null){
  116. holder.thumbImage.setImageBitmap(videoList.get(position).b);
  117. }
  118. returnconvertView;
  119. }
  120. }
  121. }



哈哈 图片显示出来了 证明这样是可行的

所以结论是:
1、我们可以通过
Java代码 收藏代码
  1. managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,mediaColumns,null,null,null);

从video表里面得到关于视频的一些数据,如:时间、大小、类型等
2、我们可以通过
Java代码 收藏代码
  1. MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(),id,Images.Thumbnails.MICRO_KIND,options);

直接得到缩略图


代码见附件

  • 大小: 26 KB
  • 大小: 31.2 KB
  • 大小: 9.4 KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值