得到sd卡图片的方法总结


图片 url   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
       URI_MATCHER.addURI("media", "*/images/thumbnails/#", IMAGES_THUMBNAILS_ID);
【1】从Android2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取。
 
1. static Bitmap createVideoThumbnail(String filePath, int kind)   //获取视频文件的缩略图,第一个参数为视频文件的位置,比如/sdcard/android123.3gp,而第二个参数可以为MINI_KIND或MICRO_KIND最终和分辨率有关
 
2. static Bitmap extractThumbnail(Bitmap source, int width, int height, int options) //直接对Bitmap进行缩略操作,最后一个参数定义为OPTIONS_RECYCLE_INPUT,来回收资源
 
3. static Bitmap extractThumbnail(Bitmap source, int width, int height) // 这个和上面的方法一样,无options选项
 
最后Android开发网再次提醒大家,ThumbnailUtils类是API Level从8或更高才开始支持的。

以下转自:

获取视频文件:

 

Java代码 

1.ContentResolver contentResolver = getContentResolver();  
 2.        String[] projection = new String[] { MediaStore.Video.Media.TITLE };  
 3.        Cursor cursor = contentResolver.query(  
 4.                MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null,  
 5.                null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);  
 6.        cursor.moveToFirst();  
 7.        int fileNum = cursor.getCount();  
 8.  
 9.        for (int counter = 0; counter < fileNum; counter++) {  
 10.            Log.w("tag", "---file is:" +   
 11.                    cursor.getString(cursor  
 12.                    .getColumnIndex(MediaStore.Video.Media.TITLE)));  
 13.            cursor.moveToNext();  
 14.        }  
 15.        cursor.close();

 

如果获取路径,需要讲projection修改为String[] projection = new String[]{MediaStore.Video.Media.DATA};
 
获取的语句也需要修改为:cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
 
获取音频文件:

 

Java代码 

1.Cursor cursor = getContentResolver().query(  
 2.                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,  
 3.                MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
 4.        cursor.moveToFirst();  
 5.        int counter = cursor.getCount();  
 6.        String title = cursor.getString(cursor  
 7.                .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));  
 8.  
 9.        Log.w("tag", "before looping,title=" + title);  
 10.        for (int j = 0; j < counter; j++) {  
 11.            Log.w("tag", "title=" +   
 12.                    cursor.getString(cursor  
 13.                    .getColumnIndex(MediaStore.Audio.Media.TITLE)));  
 14.            cursor.moveToNext();  
 15.        }  
 16.        cursor.close();

以下转自:http://blog.sina.com.cn/s/blog_5be1061c0100ctco.html

首先给大家讲android的多媒体数据库。MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频
 
,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了。今天我就介绍一些
 
这些接口的用法。

首先,要得到一个ContentResolver实例,ContentResolver可以这样获取,利用一个Activity或者Service的Context即可。如下所示:
 
ContentResolver mResolver = ctx.getContentResolver();

上面的那个ctx的就是一个context,Activity.this就是那个Context,这个Context就相当于一个上下文环境。得到这个Context后就可以调用getContentResolver接口获取ContentResolver实例了。
 
ContentResolver实例获得后,就可以进行各种查询,下面我就以音频数据库为例讲解增删改查的方法,视频和图像和音频非常类似。

在讲解各种查询之前,我给大家介绍下怎么看android都提供了哪些多媒体表。在adb shell中,找到/data/data/com.android.providers.media/databases/下,然后找到SD卡的数据库文件(一般是
 
一个.db文件),然后输入命令sqlite3加上这个数据库的名字就可以查询android的多媒体数据库了。.table命令可以列出所有多媒体数据库的表,.scheme加上表名可以查询表中的所有列名。这里可以利
 
用SQL语句来查看你想要的数据,记得最后一定要记住每条语句后面都加上分号。下面开始讲述怎么在这些表上进行增删改查。

查询,代码如下所示:

Cursor cursor = resolver.query(_uri, prjs, selections, selectArgs, order);

ContentResolver的query方法接受几个参数,参数意义如下:

Uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,例如我要取所有歌的信息,就必须利用MediaStore.Audio.Media. EXTERNAL _CONTENT_URI这个Uri。
 
专辑信息要利用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI这个Uri来查询,其他查询也都类似。

Prjs:这个参数代表要从表中选择的列,用一个String数组来表示。

Selections:相当于SQL语句中的where子句,就是代表你的查询条件。

selectArgs:这个参数是说你的Selections里有?这个符号是,这里可以以实际值代替这个问号。如果Selections这个没有?的话,那么这个String数组可以为null。
 
Order:说明查询结果按什么来排序。

上面就是各个参数的意义,它返回的查询结果一个Cursor,这个Cursor就相当于数据库查询的中Result,用法和它差不多。

-------------------------------------------------------------------------------------------------------------------
 
增加,代码如下所以:

 

Java代码 

1.ContentValues values = new ContentValues();  
 2.  
 3.values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER,0);  
 4.  
 5.resolver.insert(_uri, values);

这个insert传递的参数只有两个,一个是Uri(同查询那个Uri),另一个是ContentValues。这个ContentValuses对应于数据库的一行数据,只要用put方法把每个列的设置好之后,直接利用insert方
 
法去插入就好了。

更新,代码如下:

 

Java代码 

1.ContentResolver resolver = ctx.getContentResolver();  
 2.  
 3.Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  
 4.  
 5.ContentValues values = new ContentValues();  
 6.  
 7.values.put(MediaStore.Audio.Media.DATE_MODIFIED, sid);  
 8.  
 9.resolver.update(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,values, where, selectionArgs);

 

上面update方法和查询还有增加里的参数都很类似,这里就不再重复叙述了,大家也可直接参考google的文档,那里也写的很清楚。

删除,代码如下:

 

Java代码 

1.ContentResolver resolver = ctx.getContentResolver();  
 2.  
 3.resolver.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,where, selectionArgs);

 

delete和更新的方法很类似,大家对照更新的方法看下马上就会明白,今天就写到这里了最近比较忙,打算一周发一篇心得体会吧,希望大家也把自己的开发心得写出来多多交流。
 

 MyDevicePhotoActivity.java文件中代码如下:

package com.device.photo;
import android.app.Dialog;
 import android.content.ContentResolver;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.AdapterView;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.AdapterView.OnItemClickListener;import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.LoaderManager.LoaderCallbacks;
 import android.support.v4.content.CursorLoader;
 import android.support.v4.content.Loader;
 import android.support.v4.widget.SimpleCursorAdapter;
 import android.support.v4.widget.SimpleCursorAdapter.ViewBinder;/**
 * Android实现获取本机中所有图片
 * @Description: Android实现获取本机中所有图片* @FileName: MyDevicePhotoActivity.java 
* @Package com.device.photo 
* @Author Hanyonglu
* @Date 2012-5-10 下午04:43:55 
* @Version V1.0
 */
 public class MyDevicePhotoActivity extends FragmentActivity implements LoaderCallbacks<Cursor>{
     private Bitmap bitmap = null;
     private byte[] mContent = null;
     
     private ListView listView = null;
     private SimpleCursorAdapter simpleCursorAdapter = null;
     
     private static final String[] STORE_IMAGES = {
         MediaStore.Images.Media.DISPLAY_NAME,
         MediaStore.Images.Media.LATITUDE,
         MediaStore.Images.Media.LONGITUDE,
         MediaStore.Images.Media._ID
     };
     
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         
         listView = (ListView)findViewById(android.R.id.list);
         simpleCursorAdapter = new SimpleCursorAdapter(
                 this, 
                 R.layout.simple_list_item, 
                 null, 
                 STORE_IMAGES, 
                 new int[] { R.id.item_title, R.id.item_value}, 
                 0
                 );
         
         simpleCursorAdapter.setViewBinder(new ImageLocationBinder());
         listView.setAdapter(simpleCursorAdapter);
         // 注意此处是getSupportLoaderManager(),而不是getLoaderManager()方法。
         getSupportLoaderManager().initLoader(0, null, this);
         
         // 单击显示图片
         listView.setOnItemClickListener(new ShowItemImageOnClickListener());
     }
     
     @Override
     public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
         // TODO Auto-generated method stub
         // 为了查看信息,需要用到CursorLoader。
         CursorLoader cursorLoader = new CursorLoader(
                 this, 
                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                 STORE_IMAGES, 
                 null, 
                 null, 
                 null);
         return cursorLoader;
     }
     
     @Override
     public void onLoaderReset(Loader<Cursor> arg0) {
         // TODO Auto-generated method stub
         simpleCursorAdapter.swapCursor(null);
     }
     
     @Override
     public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
         // TODO Auto-generated method stub
         // 使用swapCursor()方法,以使旧的游标不被关闭.
         simpleCursorAdapter.swapCursor(cursor);
     }
     
     // 将图片的位置绑定到视图
     private class ImageLocationBinder implements ViewBinder{ 
         @Override
         public boolean setViewValue(View view, Cursor cursor, int arg2) {
             // TODO Auto-generated method stub
             if (arg2 == 1) {
                 // 图片经度和纬度
                 double latitude = cursor.getDouble(arg2);
                 double longitude = cursor.getDouble(arg2 + 1);
                 
                 if (latitude == 0.0 && longitude == 0.0) {
                     ((TextView)view).setText("位置:未知");
                 } else {
                     ((TextView)view).setText("位置:" + latitude + ", " + longitude);
                 }
                 
                 // 需要注意:在使用ViewBinder绑定数据时,必须返回真;否则,SimpleCursorAdapter将会用自己的方式绑定数据。
                 return true;
             } else {
                 return false;
             }
         }
     }
     
     // 单击项显示图片事件监听器
     private class ShowItemImageOnClickListener implements OnItemClickListener{
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position,
                 long id) {
             // TODO Auto-generated method stub
             final Dialog dialog = new Dialog(MyDevicePhotoActivity.this);
             // 以对话框形式显示图片
             dialog.setContentView(R.layout.image_show);
             dialog.setTitle("图片显示");            ImageView ivImageShow = (ImageView) dialog.findViewById(R.id.ivImageShow);
             Button btnClose = (Button) dialog.findViewById(R.id.btnClose);            btnClose.setOnClickListener(new OnClickListener() {
                 
                 @Override
                 public void onClick(View v) {
                     dialog.dismiss();
                 }
                 
             });
             
             Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().
                       appendPath(Long.toString(id)).build();
             FileUtil file = new FileUtil();
             ContentResolver resolver = getContentResolver();
             
             // 从Uri中读取图片资源
             try {
                 mContent = file.readInputStream(resolver.openInputStream(Uri.parse(uri.toString())));
                 bitmap = file.getBitmapFromBytes(mContent, null);
                 ivImageShow.setImageBitmap(bitmap);
             } catch (Exception e) {
                 // TODO: handle exception
                 e.printStackTrace();
             }            dialog.show();
         }
     }
 }FileUtil.java文件主要是对图片资源的处理。代码如下:
package com.device.photo;
import java.io.ByteArrayOutputStream;
 import java.io.InputStream;import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;/**
 * 文件操作类
 * @Description: 文件操作类* @FileName: FileUtil.java 
* @Package com.device.photo 
* @Author Hanyonglu
* @Date 2012-5-10 下午01:37:49 
* @Version V1.0
 */
 public class FileUtil {
     public FileUtil() {
         // TODO Auto-generated constructor stub
     }
     
     /**
      * InputStream to byte
      * @param inStream
      * @return
      * @throws Exception
      */
     public byte[] readInputStream(InputStream inStream) throws Exception { 
         byte[] buffer = new byte[1024]; 
         int len = -1; 
         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
         
         while ((len = inStream.read(buffer)) != -1) { 
             outStream.write(buffer, 0, len); 
         }
         
         byte[] data = outStream.toByteArray(); 
         outStream.close(); 
         inStream.close();
         
         return data; 
    } 
     
    /**
     * Byte to bitmap
     * @param bytes
     * @param opts
     * @return
     */
    public Bitmap getBitmapFromBytes(byte[] bytes, BitmapFactory.Options opts) {
        if (bytes != null){
            if (opts != null){ 
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,opts); 
            }
            else{
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
            }
        }
        
        return null; 
    } 
 } 
/**
      * 通过uri获取文件的绝对路径
      * @param uri
      * @return
      */
         protected String getAbsoluteImagePath(Uri uri) 
    {
         // can post image
         String [] proj={MediaStore.Images.Media.DATA};
         Cursor cursor = managedQuery( uri,
                         proj,                 // Which columns to return
                         null,       // WHERE clause; which rows to return (all rows)
                         null,       // WHERE clause selection arguments (none)
                         null);                 // Order-by clause (ascending by name)
         
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
         cursor.moveToFirst();
          
        return cursor.getString(column_index); blic static final String[] THUMBNAIL_PROJECTION = new String[] { Images.ImageColumns._ID, Images.ImageColumns.DATE_ADDED,
             Images.ImageColumns.DATA, Images.ImageColumns.ORIENTATION }; 
ublic static final ImageList getImageList(final Context context) {
    
      if (sList != null)
            
  return sList;
         ImageList list = new ImageList();
     
     final Uri uriImages = Images.Media.EXTERNAL_CONTENT_URI;
        
  final ContentResolver cr = context.getContentResolver();
     
     try {
          
    final Cursor cursorImages = cr.query(uriImages, THUMBNAIL_PROJECTION, null, null, null);
    
          if (cursorImages != null && cursorImages.moveToFirst()) {
                 final int size = cursorImages.getCount();
    
              final long[] ids = new long[size];
       
           final long[] thumbnailIds = new long[size];
       
           final long[] timestamp = new long[size];
         
         final int[] orientation = new int[size];
          
        int ctr = 0;
           
       do {
                  
    if (Thread.interrupted()) {
                         break;                    }
                  
    ids[ctr] = cursorImages.getLong(THUMBNAIL_ID_INDEX);
                     timestamp[ctr] = cursorImages.getLong(THUMBNAIL_DATE_MODIFIED_INDEX);
       
               thumbnailIds[ctr] = Utils.Crc64Long(cursorImages.getString(THUMBNAIL_DATA_INDEX));
           
           orientation[ctr] = cursorImages.getInt(THUMBNAIL_ORIENTATION_INDEX);
              
        ++ctr;
               
   } while (cursorImages.moveToNext());
               
   cursorImages.close();
              
    list.ids = ids;
                 list.thumbids = thumbnailIds;
         
         list.timestamp = timestamp;
          
        list.orientation = orientation;
             }
         } catch (Exception e) {
        
      // If the database operation failed for any reason
             ;        }
         if (sList == null) {
         
     sList = list;
         }
        
  return list;
  
    }