查询图片

首先,查询Android固有数据库,图片的Uri为Images.Media.EXTERNAL_CONTENT_URI
以下为具体查询实例,FileInfo为自定义的数据模型。

public ArrayList<FileInfo> queryAllImage(final Context context) {    if (context == null) { //判断传入的参数的有效性        return null;    }    ArrayList<FileInfo> images = new ArrayList<FileInfo>();    ContentResolver resolver = context.getContentResolver();    Cursor cursor = null;    try {        //查询数据库,参数分别为(路径,要查询的列名,条件语句,条件参数,排序)        cursor = resolver.query(Images.Media.EXTERNAL_CONTENT_URI, null, null ,null, null);        if (cursor != null) {            while (cursor.moveToNext()) {                FileInfo image = new FileInfo();                image.setId(cursor.getInt(cursor.getColumnIndex(Images.Media._ID))); //获取唯一id                image.setFilePath(cursor.getString(cursor.getColumnIndex(Images.Media.DATA))); //文件路径                image.setFileName(cursor.getString(cursor.getColumnIndex(Images.Media.DISPLAY_NAME))); //文件名                //... 还有很多属性可以设置                //可以通过下一行查看属性名,然后在Images.Media.里寻找对应常量名                Log.i(TAG, "queryAllImage --- all column name --- " + cursor.getColumnName(cursor.getPosition()));                //获取缩略图(如果数据量大的话,会很耗时——需要考虑如何开辟子线程加载)                /* * 可以访问android.provider.MediaStore.Images.Thumbnails查询图片缩略图 * Thumbnails下的getThumbnail方法可以获得图片缩略图,其中第三个参数类型还可以选择MINI_KIND */                Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(resolver, image.getId(), Images.Thumbnails.MICRO_KIND, null);                image.setThumbnail(thumbnail);                images.add(image);            }        }    } catch (Exception e) {        e.printStackTrace();    } finally {        if (cursor != null) {            cursor.close();        }    }    return images;}

查询到图片信息后,如何显示大图呢?
只要有图片路径就可以了!

Bitmap picture = BitmapFactory.decodeFile(mFileInfo.getFilePath());imageView.setBackground(new BitmapDrawable(picture));

2015.9.17 更新:查询图片缩略图的其他方法

上面的方法以前测试过是可以的,可是最近运行发现总是报空指针错,有时候也得不到缩略图,追到源头可能是Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(resolver, image.getId(), Images.Thumbnails.MICRO_KIND, null);这句的问题,因为这已经是调用原生的方法了,不知道还能怎么改(在确保传入的参数都是正确之后),于是找了找还有没有其他的办法显示图片缩略图。

找到了行之有效的方法如下

Bitmap bitmap = null;//1.得到缩略图的宽高BitmapFactory.Options options = new BitmapFactory.Options();bitmap = BitmapFactory.decodeFile(mFilePath, options); //mFilePath为文件路径options.inJustDecodeBounds = false;int h = options.outHeight;int w = options.outWidth;//2.重新读取图片,读取是缩放后的bitmapbitmap = BitmapFactory.decodeFile(mFilePath, options);//3.利用ThumnailUtils来创建缩略图,这里要指定要缩放的那个bitmap对象bitmap = ThumbnailUtils.extractThumbnail(bitmap, w, h, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

查询音频

也是先查询数据库获得音频相关信息,音频的Uri为Audio.Media.EXTERNAL_CONTENT_URI
以下为具体查询实例,FileInfo为自定义的数据模型。

public ArrayList<FileInfo> queryAllAudio(final Context context) {    if (context == null) { //判断传入的参数的有效性        return null;    }    ArrayList<FileInfo> audios = new ArrayList<FileInfo>();    ContentResolver resolver = context.getContentResolver();    Cursor cursor = null;    try {        //查询数据库,参数分别为(路径,要查询的列名,条件语句,条件参数,排序)        cursor = resolver.query(Audio.Media.EXTERNAL_CONTENT_URI, null, null ,null, null);        if (cursor != null) {            while (cursor.moveToNext()) {                FileInfo audio = new FileInfo();                audio.setId(cursor.getInt(cursor.getColumnIndex(Audio.Media._ID))); //获取唯一id                audio.setFilePath(cursor.getString(cursor.getColumnIndex(Audio.Media.DATA))); //文件路径                audio.setFileName(cursor.getString(cursor.getColumnIndex(Audio.Media.DISPLAY_NAME))); //文件名                //... 还有很多属性可以设置                //可以通过下一行查看属性名,然后去Audio.Media里寻找对应常量名                Log.i(TAG, "queryAllImage --- all column name --- " + cursor.getColumnName(cursor.getPosition()));                //获取专辑封面(如果数据量大的话,会很耗时——需要考虑如何开辟子线程加载)                Bitmap albumArt = creatAlbumArt(audio.getFilePath());                audio.setThumbnail(albumArt);                audios.add(audio);            }        }    } catch (Exception e) {        e.printStackTrace();    } finally {        if (cursor != null) {            cursor.close();        }    }    return audios;}/** * @Description 获取专辑封面 * @param filePath 文件路径,like XXX/XXX/XX.mp3 * @return 专辑封面bitmap */public Bitmap createAlbumArt(final String filePath) {    Bitmap bitmap = null;    //能够获取多媒体文件元数据的类    MediaMetadataRetriever retriever = new MediaMetadataRetriever();    try {        retriever.setDataSource(filePath); //设置数据源        byte[] embedPic = retriever.getEmbeddedPicture(); //得到字节型数据        bitmap = BitmapFactory.decodeByteArray(art, 0, art.length); //转换为图片    } catch (Exception e) {        e.printStackTrace();    } finally {        try {            retriever.release();        } catch (Exception e2) {            e2.printStackTrace();        }    }    return bitmap;}

生成音乐专辑封面代码参考:《Android为多媒体文件生成缩略图》

MediaMetadataRetriever API :《MediaMetadataRetriever API》 能从媒体文件获取元数据的类

查询视频

查询视频缩略图的方法和图片的很像。
以下为具体查询实例,FileInfo为自定义的数据模型。

public ArrayList<FileInfo> queryAllVideo(final Context context) {    if (context == null) { //判断传入的参数的有效性        return null;    }    ArrayList<FileInfo> videos = new ArrayList<FileInfo>();    ContentResolver resolver = context.getContentResolver();    Cursor cursor = null;    try {        //查询数据库,参数分别为(路径,要查询的列名,条件语句,条件参数,排序)        cursor = resolver.query(Video.Media.EXTERNAL_CONTENT_URI, null, null ,null, null);        if (cursor != null) {            while (cursor.moveToNext()) {                FileInfo video = new FileInfo();                video.setId(cursor.getInt(cursor.getColumnIndex(Video.Media._ID))); //获取唯一id                video.setFilePath(cursor.getString(cursor.getColumnIndex(Video.Media.DATA))); //文件路径                video.setFileName(cursor.getString(cursor.getColumnIndex(Video.Media.DISPLAY_NAME))); //文件名                //... 还有很多属性可以设置                //可以通过下一行查看属性名,然后在Video.Media.里寻找对应常量名                Log.i(TAG, "queryAllImage --- all column name --- " + cursor.getColumnName(cursor.getPosition()));                //获取缩略图(如果数据量大的话,会很耗时——需要考虑如何开辟子线程加载)                /* * 可以访问android.provider.MediaStore.Video.Thumbnails查询图片缩略图 * Thumbnails下的getThumbnail方法可以获得图片缩略图,其中第三个参数类型还可以选择MINI_KIND */                Bitmap thumbnail = MediaStore.Video.Thumbnails.getThumbnail(resolver, image.getId(), Video.Thumbnails.MICRO_KIND, null);                video.setThumbnail(thumbnail);                videos.add(image);            }        }    } catch (Exception e) {        e.printStackTrace();    } finally {        if (cursor != null) {            cursor.close();        }    }    return videos;}

查询视频缩略图的方法除了以上代码中给出外,还有一种方法,使用缩略图工具类(ThumbnailUtils),可以在查询完数据库后针对某(多)个视频查询缩略图。

前提条件是知道文件路径(filePath),以下封装成一个方法

/** * @Description 定宽高解码缩略图 * @param path 文件路径 * @param width 显示的宽度 * @param height 显示的高度 * @return Bitmap 缩略图 */private Bitmap decodeThumbBitmapForFile(final String path, final int width, final int height) {    Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path, Thumbnails.FULL_SCREEN_KIND); //还可以选择MINI_KIND和MICRO_KIND    if (bitmap != null) {        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCEL_INPUT); //根据源图片指定宽高生成新的图片    }    return bitmap;}

其中,ThumbnailUtils 所在包路径 android.media.ThumbnailUtils
Thumbnails 所在包路径 android.provider.MediaStore.Video.Thumbnails

以上方法经个人实践有效,如果你有任何问题,请留言告诉我。

更多相关文章

  1. 阅读《Android 从入门到精通》(20)——图片视图
  2. 【实习项目记录】(三)调整网络图片固定宽高
  3. android 仿微信群聊头像 合成图片
  4. Android中播放GIF图片动画
  5. 2010.12.15——— android listView 显示图片
  6. Android拍照、相册选取、裁剪图片综合Demo
  7. Android 图片对比(图片相似度)代码

随机推荐

  1. 可视化日志服务器搭建
  2. 体检异常率97%,这届90后身体到底有多差
  3. 监控流媒体服务器的搭建和使用
  4. 《Python知识手册》更新V2.1版,添加部分Py
  5. 老板让我从Word中复制出1000张图片?
  6. 我想找个这样的男朋友,要求高吗?
  7. 用 Python 读取巴菲特最近的持仓数据
  8. B站晚会大火的 140 万个理由!
  9. C语言的一些练习以及写一个猜数字游戏
  10. 巧用 Matplotlib 动画,让你的 Python 可