Android获取SD卡上所有图片、视频缩略图和音乐专辑封面

查询图片

首先,查询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;
}

查询音频

也是先查询数据库获得音频相关信息,音频的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;
}

查询视频

查询视频缩略图的方法和图片的很像。

以下为具体查询实例,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;
}


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

时间: 2024-10-06 19:53:23

Android获取SD卡上所有图片、视频缩略图和音乐专辑封面的相关文章

Android 获取SD卡路径和判断SD卡是否存在

android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCardExist = Environment.getExternalStorageState() .equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在 if (sdCardExist) { sdDir = Environment.getEx

android 操作SD卡上的文件

(1)说明:操作SD卡上的文件需要加入以下权限 在SD卡上创建和删除文件权限 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 在SD卡上写入数据的权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 在sd卡上的文件操作和我上一篇文

Android获取SD卡总容量,可用大小,机身内存总容量及可用大小

public long getSDTotalSize() { /*获取存储卡路径*/ File sdcardDir= Environment.getExternalStorageDirectory(); /*StatFs 看文件系统空间使用情况*/ StatFs statFs=new StatFs(sdcardDir.getPath()); long blockSize= statFs.getBlockSizeLong(); long totalSize=statFs.getBlockCount

android获取sd卡路径方法

public String getSDPath(){  File sdDir = null;  boolean sdCardExist = Environment.getExternalStorageState()  .equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在  if (sdCardExist)  {  sdDir = Environment.getExternalStorageDirectory();//获取跟目录  }

Android 获取SD卡的图片资源

首先我先获得SD卡下的根目录路径: privateString isSdcard(){ File sdcardDir=null; boolean isSDExist=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if(isSDExist){ //如果存在SDcard 就找到跟目录 sdcardDir=Environment.getExternalStorageDirectory(); return

android如何获取SD卡上的多媒体文件

获取视频文件: ContentResolver contentResolver = mContext.getContentResolver();         String[] projection = new String[]{MediaStore.Video.Media.TITLE};         Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, 

android获取SD卡的状态

/** 获取存储卡路径 */ File sdcardDir=Environment.getExternalStorageDirectory(); /** StatFs 看文件系统空间使用情况 */ StatFs statFs=new StatFs(sdcardDir.getPath()); /** Block 的 size*/ Long blockSize=statFs.getBlockSize(); /** 总 Block 数量 */ Long totalBlocks=statFs.getBl

Android解析SD卡上的APK文件

public void parseApk(Context context, String apkFilePath){ PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageArchiveInfo(apkFilePath, 0); if(packageInfo != null){ packageInfo.applicationIn

Android使用sqlliteOpenhelper更改数据库的存储路径放到SD卡上

假设使用默认的系统管理,默认放在包以下.比較省心.并且在卸载app后不会造成数据残留.可是这样也有一个问题.比方我做一个背单词的软件,那么当用户卸载掉这个app时,他辛辛苦苦下载的单词库也没了... 所以我想到的解决方式.就是把数据库路径改下.不放到包以下,放到SD卡上. 细致看看.还真不easy做,网上有人甚至去更改源代码.只是最后还是找到了解决方式: 查看SQLiteOpenHelper源代码.会发现有这样一段代码: if (mName == null) { db = SQLiteDatab