获取Android系统中全部图片的路径

一.命令行方式查找多媒体数据库:
1.启动模拟器或在Eclipse中Run一个应用到手机上。
2.cmd 启动命令提示符窗体,进入SDK目录中存放adb的路径:“cd D:\adt-bundle-windows-x86-20130219\sdk\platform-tools”
3.进入模拟器的linux系统:“adb shell”
4.列出Android所有的系统数据库所在的包:“ls /data/data/”
得到结果:
...
com.android.providers.media
...
5.查看多媒体数据库文件是否存在:“ls -l /data/data/com.android.providers.media/databases/”
得到结果:
external-c0070e03.db 是SD卡里的多媒体数据库文件
internal.db 是内存里的多媒体数据库文件
6.以external-c0070e03.db为当前scheme启动SQLITE3:“sqlite3 /data/data/com.android.providers.media/databases/external-c0070e03.db”
7.列出所有多媒体数据库的表:“.table”
得到结果:
album_art            audio                otherfile
album_info           audio_genres         search
albums               audio_genres_map     searchhelpertitle
android_metadata     audio_meta           thumbnails
artist_info          audio_playlists      video
artists              audio_playlists_map  videothumbnails
artists_albums_map   images
8.显示images表的创建语句,查询表中的所有列名:“.schema images”
得到结果:
CREATE TABLE images (_id INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_n
ame TEXT,mime_type TEXT,title TEXT,date_added INTEGER,date_modified INTEGER,desc
ription TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBLE,longitude DOUBLE,d
atetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,buc
ket_display_name TEXT);
9.列出images表中所有图片的路径:“SELECT _data FROM images;”
注:SQLite的命令行工具介绍:http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2325981.html

二. 代码方式对多媒体数据库的操作:
1.获得一个ContentResolver的实例,可通过Activity的成员方法getContentResovler()方法:
ContentResolver cr = this.getContentResolver();
2.使用query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)操作数据库:
uri是“content://”形式的URI,
projection是封装数据表中所需的列名数组,
selection是设置条件,相当于SQL语句中的where,
selectionArgs是要配合selection使用的,如果你在selection里面有?,那么你在selectionArgs写的数据就会替换掉?,
sortOrder是排序规则。

 // 获取SD卡中的全部图片的路径列表

     public List<String> queryGallery() {

        List<String> galleryList = new ArrayList<String>();  // 图片路径列表

        List<String> imageFolderIds = new ArrayList<String>(); // 包含图片的文件夹ID列表

        
        ContentResolver cr = getActivity().getContentResolver();

        String[] columns = {Images.Media.DATA,   // 图片绝对路径

          Images.Media.BUCKET_ID,    // 直接包含该图片文件的文件夹ID,防止在不同下的文件夹重名

          Images.Media.BUCKET_DISPLAY_NAME,  // 直接包含该图片文件的文件夹名

          "COUNT(1) AS count"     // 统计当前文件夹下共有多少张图片

        };

        String sortOrder = Images.Media.DATE_MODIFIED; //默认升序排列

        Cursor cur = cr.query(

          Images.Media.EXTERNAL_CONTENT_URI,  //MediaStore多媒体数据库中SD卡上的image数据表的uri

          columns, 

          null, 

          null, 

          sortOrder);

        while (cur.moveToNext()) {

            int image_id_column = cur.getColumnIndex(Images.Media.DATA);

            int bucket_id_column = cur.getColumnIndex(Images.Media.BUCKET_ID);

            int bucket_name_column = cur.getColumnIndex(Images.Media.BUCKET_DISPLAY_NAME);

            int count_column = cur.getColumnIndex("count");

            

            String image_path = cur.getString(image_id_column); //文件路径

            int bucket_id = cur.getInt(bucket_id_column);  //所在文件夹ID

            String bucket_name = cur.getString(bucket_name_column); //所在文件夹Name

            int count = cur.getInt(count_column);    //当前文件夹下共有多少张图片

         

            if(count > 1) {

             imageFolderIds.add(String.valueOf(bucket_id));

            } else {

             galleryList.add(image_path);

            }

        }

        

        int folderCounts = imageFolderIds.size();

        if( folderCounts > 0 ) {

         for ( int i = 0; i < folderCounts; ++i ) {

          String[] projection = {MediaStore.Images.Thumbnails.DATA};

          cur = cr.query(

            Images.Media.EXTERNAL_CONTENT_URI, 

            projection, 

            Images.Media.BUCKET_ID + " = ?",  //查询条件

            new String[] {imageFolderIds.get(i)},  //查询条件中问号对应的值

            sortOrder);

          while (cur.moveToNext()) {

                    int image_id_column = cur.getColumnIndex(Images.Media.DATA);

                    String image_path = cur.getString(image_id_column); //文件路径

                    galleryList.add(image_path);

          }

         }

        }

        if( null != cur && !cur.isClosed() ){

            cur.close();

        }

        return galleryList;

    }
 三. 图片选择:
public void showPickImagesDialog() {
 final CharSequence[] items = { "图库选择", "拍照处理" };
 AlertDialog dlg = AlertDialog.Builder(this)
   .setTitle("选择图片")
   .setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
     if (item == 1) {
      // 拍照处理
      String state = Environment
         .getExternalStorageState();
      if (state.equals(Environment.MEDIA_MOUNTED)) {
       Intent intent = new Intent(
          "android.media.action.IMAGE_CAPTURE");
       filePath = getFileName();
       intent.putExtra(MediaStore.EXTRA_OUTPUT,
          Uri.fromFile(new File(filePath)));
       startActivityForResult(intent,item);
      }
     } else {
      // 图库选择
      Intent getImage = new Intent(
        Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
      startActivityForResult(getImage,item);
     }
    }
   }).create();
 dlg.show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
 switch (requestCode) {
  case 0:
   // 图库选择
   try {
    if (data != null && data.getData() != null) {
     Uri uri = data.getData();
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
   break;
  case 1:
   // 拍照处理
   try {
    File mFile = new File(filePath);
    if (mFile != null && mFile.length() > 0) {
     Uri uri = Uri.fromFile(mFile);
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
   break;
  default:
   break;
 }
}

转载于:https://my.oschina.net/u/1984976/blog/370713

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值