android 视频缩略图之 MediaStore

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

listview.xml如下

[html]  view plain  copy
  1. xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns: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]  view plain  copy
  1. package com.lp;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.ListActivity;  
  6. import android.content.Context;  
  7. import android.database.Cursor;  
  8. import android.net.Uri;  
  9. import android.os.Bundle;  
  10. import android.provider.MediaStore;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.ImageView;  
  16. import android.widget.TextView;  
  17. /** 
  18.  * 本实例,我们将通过检索SDCard上的Video信息 
  19.  * 在MediaStore中,MediaStore.Video.Media中就有Video相关信息, 
  20.  * 同时MediaStore.Video.Thumbnails中含有各个video对应的缩略图信息 
  21.  *  
  22.  * @author Administrator 
  23.  * 
  24.  */  
  25. public class MainActivity extends ListActivity {  
  26.       
  27.     private Cursor cursor;  
  28.     private ArrayList videoList = new ArrayList();  
  29.     private ImageView img;  
  30.       
  31.     public void onCreate(Bundle savedInstanceState){  
  32.         super.onCreate(savedInstanceState);  
  33.         init();  
  34.     }  
  35.       
  36.       
  37.     private void init(){  
  38.         String[] thumbColumns = new String[]{  
  39.                 MediaStore.Video.Thumbnails.DATA,  
  40.                 MediaStore.Video.Thumbnails.VIDEO_ID  
  41.         };  
  42.           
  43.         String[] mediaColumns = new String[]{  
  44.                 MediaStore.Video.Media.DATA,  
  45.                 MediaStore.Video.Media._ID,  
  46.                 MediaStore.Video.Media.TITLE,  
  47.                 MediaStore.Video.Media.MIME_TYPE  
  48.         };  
  49.           
  50.         //首先检索SDcard上所有的video  
  51.         cursor = this.managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns, nullnullnull);  
  52.           
  53.           
  54.         while(cursor.moveToNext()){  
  55.                 VideoInfo info = new VideoInfo();  
  56.                   
  57.                 info.filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));  
  58.                 info.mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));  
  59.                 info.title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));  
  60.                   
  61.                 //获取当前Video对应的Id,然后根据该ID获取其Thumb  
  62.                 int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));  
  63.                 String selection = MediaStore.Video.Thumbnails.VIDEO_ID +"=?";  
  64.                 String[] selectionArgs = new String[]{  
  65.                         id+""  
  66.                 };  
  67.                 Cursor thumbCursor = this.managedQuery(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, thumbColumns, selection, selectionArgs, null);  
  68.                   
  69.                 if(thumbCursor.moveToFirst()){  
  70.                     info.thumbPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA));  
  71.                       
  72.                 }  
  73.                 //然后将其加入到videoList  
  74.                 videoList.add(info);  
  75.                   
  76.         }  
  77.         System.out.println(videoList.size());  
  78.         //然后需要设置ListView的Adapter了,使用我们自定义的Adatper  
  79.         VideoAdapter adapter = new VideoAdapter(this);  
  80.         this.getListView().setAdapter(adapter);  
  81.     }  
  82.       
  83.       
  84.     class VideoInfo{  
  85.         String filePath;  
  86.         String mimeType;  
  87.         String thumbPath;  
  88.         String title;  
  89.     }  
  90.       
  91.     class ViewHolder{  
  92.         ImageView thumbImage;  
  93.         TextView titleText;  
  94.     }  
  95.       
  96.     /** 
  97.      * 定义一个Adapter来显示缩略图和视频title信息 
  98.      * @author Administrator 
  99.      * 
  100.      */  
  101.     private class VideoAdapter extends BaseAdapter{  
  102.           
  103.         private Context mContext;  
  104.         private LayoutInflater inflater;  
  105.           
  106.         public VideoAdapter(Context context){  
  107.             this.mContext = context;  
  108.             this.inflater = LayoutInflater.from(context);   
  109.             this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
  110.         }  
  111.         @Override  
  112.         public int getCount() {  
  113.             // TODO Auto-generated method stub  
  114.             return videoList.size();  
  115.         }  
  116.         @Override  
  117.         public Object getItem(int p) {  
  118.             // TODO Auto-generated method stub  
  119.             return videoList.get(p);  
  120.         }  
  121.         @Override  
  122.         public long getItemId(int p) {  
  123.             // TODO Auto-generated method stub  
  124.             return p;  
  125.         }  
  126.         @Override  
  127.         public View getView(int position, View convertView, ViewGroup parent) {  
  128.             ViewHolder holder ;  
  129.             if(convertView == null){  
  130.                 holder = new ViewHolder();  
  131.                 convertView = inflater.inflate(R.layout.listview, null);  
  132.                 holder.thumbImage = (ImageView)convertView.findViewById(R.id.iv);  
  133.                 holder.titleText = (TextView)convertView.findViewById(R.id.tv);  
  134.                 convertView.setTag(holder);  
  135.             }else{  
  136.                 holder = (ViewHolder)convertView.getTag();  
  137.             }  
  138.               
  139.             //显示信息  
  140.             holder.titleText.setText(videoList.get(position).title);  
  141.             if(videoList.get(position).thumbPath != null){  
  142.                 holder.thumbImage.setImageURI(Uri.parse(videoList.get(position).thumbPath));  
  143.             }  
  144.               
  145.             return convertView;  
  146.         }  
  147.           
  148.     }  
  149. }  

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

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

数据库的结构如下图:

video


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

再看一下 videothumbnails


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

2、

仔细查看MediaStore.Video.Thumbnails类里面的方法 可以发现 提供了一个getThumbnail()方法 可以直接得到缩略图 

[java]  view plain  copy
  1. package com.lp;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.ListActivity;  
  6. import android.content.Context;  
  7. import android.database.Cursor;  
  8. import android.net.Uri;  
  9. import android.os.Bundle;  
  10. import android.provider.MediaStore;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.ImageView;  
  16. import android.widget.TextView;  
  17. /** 
  18.  * 本实例,我们将通过检索SDCard上的Video信息 
  19.  * 在MediaStore中,MediaStore.Video.Media中就有Video相关信息, 
  20.  * 同时MediaStore.Video.Thumbnails中含有各个video对应的缩略图信息 
  21.  *  
  22.  * @author Administrator 
  23.  * 
  24.  */  
  25. public class MainActivity extends ListActivity {  
  26.       
  27.     private Cursor cursor;  
  28.     private ArrayList videoList = new ArrayList();  
  29.     private ImageView img;  
  30.       
  31.     public void onCreate(Bundle savedInstanceState){  
  32.         super.onCreate(savedInstanceState);  
  33.         init();  
  34.     }  
  35.       
  36.       
  37.     private void init(){  
  38.         String[] thumbColumns = new String[]{  
  39.                 MediaStore.Video.Thumbnails.DATA,  
  40.                 MediaStore.Video.Thumbnails.VIDEO_ID  
  41.         };  
  42.           
  43.         String[] mediaColumns = new String[]{  
  44.                 MediaStore.Video.Media.DATA,  
  45.                 MediaStore.Video.Media._ID,  
  46.                 MediaStore.Video.Media.TITLE,  
  47.                 MediaStore.Video.Media.MIME_TYPE  
  48.         };  
  49.           
  50.         //首先检索SDcard上所有的video  
  51.         cursor = this.managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns, nullnullnull);  
  52.           
  53.           
  54.         while(cursor.moveToNext()){  
  55.                 VideoInfo info = new VideoInfo();  
  56.                   
  57.                 info.filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));  
  58.                 info.mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));  
  59.                 info.title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));  
  60.                   
  61.                 //获取当前Video对应的Id,然后根据该ID获取其Thumb  
  62.                 int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));  
  63.                 BitmapFactory.Options options = new BitmapFactory.Options();  
  64.                 options.inDither = false;  
  65.                 options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
  66.                 info.b = MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(), id,  Images.Thumbnails.MICRO_KIND, options);  
  67.                 //然后将其加入到videoList  
  68.                 videoList.add(info);  
  69.                   
  70.         }  
  71.         System.out.println(videoList.size());  
  72.         //然后需要设置ListView的Adapter了,使用我们自定义的Adatper  
  73.         VideoAdapter adapter = new VideoAdapter(this);  
  74.         this.getListView().setAdapter(adapter);  
  75.     }  
  76.       
  77.     class VideoInfo{  
  78.         String filePath;  
  79.         String mimeType;  
  80.         Bitmap b;  
  81.         String title;  
  82.     }  
  83.       
  84.     class ViewHolder{  
  85.         ImageView thumbImage;  
  86.         TextView titleText;  
  87.     }  
  88.       
  89.     /** 
  90.      * 定义一个Adapter来显示缩略图和视频title信息 
  91.      * @author Administrator 
  92.      * 
  93.      */  
  94.     private class VideoAdapter extends BaseAdapter{  
  95.           
  96.         private Context mContext;  
  97.         private LayoutInflater inflater;  
  98.           
  99.         public VideoAdapter(Context context){  
  100.             this.mContext = context;  
  101.             this.inflater = LayoutInflater.from(context);   
  102.             this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
  103.         }  
  104.         @Override  
  105.         public int getCount() {  
  106.             // TODO Auto-generated method stub  
  107.             return videoList.size();  
  108.         }  
  109.         @Override  
  110.         public Object getItem(int p) {  
  111.             // TODO Auto-generated method stub  
  112.             return videoList.get(p);  
  113.         }  
  114.         @Override  
  115.         public long getItemId(int p) {  
  116.             // TODO Auto-generated method stub  
  117.             return p;  
  118.         }  
  119.         @Override  
  120.         public View getView(int position, View convertView, ViewGroup parent) {  
  121.             ViewHolder holder ;  
  122.             if(convertView == null){  
  123.                 holder = new ViewHolder();  
  124.                 convertView = inflater.inflate(R.layout.listview, null);  
  125.                 holder.thumbImage = (ImageView)convertView.findViewById(R.id.iv);  
  126.                 holder.titleText = (TextView)convertView.findViewById(R.id.tv);  
  127.                 convertView.setTag(holder);  
  128.             }else{  
  129.                 holder = (ViewHolder)convertView.getTag();  
  130.             }  
  131.               
  132.             //显示信息  
  133.             holder.titleText.setText(videoList.get(position).title);  
  134.             if(videoList.get(position).b != null){  
  135.                 holder.thumbImage.setImageBitmap(videoList.get(position).b);  
  136.             }  
  137.               
  138.             return convertView;  
  139.         }  
  140.           
  141.     }  
  142. }  

从video表里面得到关于视频的一些数据,如:时间、大小、类型等
2、我们可以通过

Java代码   收藏代码
  1. MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(), id,  Images.Thumbnails.MICRO_KIND, options);  

直接得到缩略图


代码见附件


转载:http://lipeng88213.iteye.com/blog/1182265


你可能感兴趣的:(android,视频缩略图之,MediaStore)