得到sd卡图片的方法总结

来源:互联网 发布:飞升符箓升级数据 编辑:程序博客网 时间:2024/06/05 14:01

得到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或更高才开始支持的。


以下转自:http://blog.csdn.net/jing_huanhuan/article/details/6136075

获取视频文件:

 


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;
 
   }

0 0
原创粉丝点击