2010-11-16 36 views
39

我在尋找: 現有照片庫名稱列表(希望它們的頂部縮略圖也是如此) 圖庫的內容(然後我可以根據需要加載縮略圖和全尺寸)獲取Android上相冊的列表

我該如何去獲取「圖庫」列表(不知道這是Android應用程序中適用於圖庫應用程序中可見圖像分組的名稱...)及其內容嗎?我需要訪問它的結構中的圖庫,而不使用現有的圖庫顯示(我正在創建一個全新的圖層,而不是照片請求者的一層)

我假設MediaStore.Images是我需要的但我沒有看到任何會給我分組的東西...

回答

73

分組由MediaStore.Images.Media.BUCKET_DISPLAY_NAME定義。下面是示例代碼列出的圖像,並記錄他們的鬥名字和date_taken:

// which image properties are we querying 
String[] projection = new String[] { 
     MediaStore.Images.Media._ID, 
     MediaStore.Images.Media.BUCKET_DISPLAY_NAME, 
     MediaStore.Images.Media.DATE_TAKEN 
}; 

// content:// style URI for the "primary" external storage volume 
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

// Make the query. 
Cursor cur = managedQuery(images, 
     projection, // Which columns to return 
     null,  // Which rows to return (all rows) 
     null,  // Selection arguments (none) 
     null  // Ordering 
     ); 

Log.i("ListingImages"," query count=" + cur.getCount()); 

if (cur.moveToFirst()) { 
    String bucket; 
    String date; 
    int bucketColumn = cur.getColumnIndex(
     MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 

    int dateColumn = cur.getColumnIndex(
     MediaStore.Images.Media.DATE_TAKEN); 

    do { 
     // Get the field values 
     bucket = cur.getString(bucketColumn); 
     date = cur.getString(dateColumn); 

     // Do something with the values. 
     Log.i("ListingImages", " bucket=" + bucket 
       + " date_taken=" + date); 
    } while (cur.moveToNext()); 

} 
+0

AH下載源代碼!它像一個原始數據庫查詢一樣工作。完美的示例代碼謝謝! – ima747 2010-11-16 18:46:33

+0

如何顯示照片? – Marya 2014-03-13 09:30:01

+0

如何獲取圖像路徑?爲每個dateToken? – 2014-05-08 13:38:18

33
/** 
* Getting All Images Path 
* 
* @param activity 
* @return ArrayList with images Path 
*/ 
public static ArrayList<String> getAllShownImagesPath(Activity activity) { 
    Uri uri; 
    Cursor cursor; 
    int column_index_data, column_index_folder_name; 
    ArrayList<String> listOfAllImages = new ArrayList<String>(); 
    String absolutePathOfImage = null; 
    uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

    String[] projection = { MediaColumns.DATA, 
      MediaStore.Images.Media.BUCKET_DISPLAY_NAME }; 

    cursor = activity.getContentResolver().query(uri, projection, null, 
      null, null); 

    column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
    column_index_folder_name = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 
    while (cursor.moveToNext()) { 
     absolutePathOfImage = cursor.getString(column_index_data); 

     listOfAllImages.add(absolutePathOfImage); 
    } 
    return listOfAllImages; 
} 
+13

不要忘記添加到您的清單。 – 2014-07-12 00:45:29

15

下面是幾個簡單的步驟完整的解決方案:

接下來的幾個步驟將全局唯一標識符你如何創建一個Vector,用於存放給定設備上的相冊。每張專輯都會保存一張預覽圖像以及一張內部的Vector,以容納相冊的所有圖像。

  1. 創建一個對象,該對象將保存從存儲中提取的圖像。我們打算將它稱爲PhoneAlbum。這是怎麼回事看:

    public class PhoneAlbum { 
    
        private int id; 
        private String name; 
        private String coverUri; 
        private Vector<PhonePhoto> albumPhotos; 
    
        public int getId() { 
         return id; 
        } 
    
        public void setId(int id) { 
         this.id = id; 
        } 
    
        public String getName() { 
         return name; 
        } 
    
        public void setName(String name) { 
         this.name = name; 
        } 
    
        public String getCoverUri() { 
         return coverUri; 
        } 
    
        public void setCoverUri(String albumCoverUri) { 
         this.coverUri = albumCoverUri; 
        } 
    
        public Vector<PhonePhoto> getAlbumPhotos() { 
         if (albumPhotos == null) { 
          albumPhotos = new Vector<>(); 
         } 
         return albumPhotos; 
        } 
    
        public void setAlbumPhotos(Vector<PhonePhoto> albumPhotos) { 
         this.albumPhotos = albumPhotos; 
        } 
    } 
    
  2. 創建一個對象,將舉行名爲專輯內的圖像:PhonePhoto

    public class PhonePhoto { 
    
        private int id; 
        private String albumName; 
        private String photoUri; 
    
        public int getId() { 
         return id; 
        } 
    
        public void setId(int id) { 
         this.id = id; 
        } 
    
        public String getAlbumName() { 
         return albumName; 
        } 
    
        public void setAlbumName(String name) { 
         this.albumName = name; 
        } 
    
        public String getPhotoUri() { 
         return photoUri; 
        } 
    
        public void setPhotoUri(String photoUri) { 
         this.photoUri = photoUri; 
        } 
    } 
    
  3. 創建界面完成後處理提取的圖像。我們打算叫它OnPhoneImagesObtained。那就是:

    public interface OnPhoneImagesObtained { 
    
        void onComplete(Vector<PhoneAlbum> albums); 
        void onError(); 
    
    } 
    
  4. 創建一個新類:DeviceImageManager

    public class DeviceImageManager { 
    
    } 
    
  5. 一旦你創建DeviceImageManager,添加以下方法:

    public static void getPhoneAlbums(Context context , OnPhoneImagesObtained listener){ 
        // Creating vectors to hold the final albums objects and albums names 
        Vector<PhoneAlbum> phoneAlbums = new Vector<>(); 
        Vector<String> albumsNames = new Vector<>(); 
    
        // which image properties are we querying 
        String[] projection = new String[] { 
          MediaStore.Images.Media.BUCKET_DISPLAY_NAME, 
          MediaStore.Images.Media.DATA, 
          MediaStore.Images.Media._ID 
        }; 
    
        // content: style URI for the "primary" external storage volume 
        Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    
        // Make the query. 
        Cursor cur = context.getContentResolver().query(images, 
          projection, // Which columns to return 
          null,  // Which rows to return (all rows) 
          null,  // Selection arguments (none) 
          null  // Ordering 
        ); 
    
        if (cur != null && cur.getCount() > 0) { 
         Log.i("DeviceImageManager"," query count=" + cur.getCount()); 
    
         if (cur.moveToFirst()) { 
          String bucketName; 
          String data; 
          String imageId; 
          int bucketNameColumn = cur.getColumnIndex(
           MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 
    
          int imageUriColumn = cur.getColumnIndex(
           MediaStore.Images.Media.DATA); 
    
          int imageIdColumn = cur.getColumnIndex(
           MediaStore.Images.Media._ID); 
    
          do { 
           // Get the field values 
           bucketName = cur.getString(bucketNameColumn); 
           data = cur.getString(imageUriColumn); 
           imageId = cur.getString(imageIdColumn); 
    
           // Adding a new PhonePhoto object to phonePhotos vector 
           PhonePhoto phonePhoto = new PhonePhoto(); 
           phonePhoto.setAlbumName(bucketName); 
           phonePhoto.setPhotoUri(data); 
           phonePhoto.setId(Integer.valueOf(imageId)); 
    
           if (albumsNames.contains(bucketName)) { 
            for (PhoneAlbum album : phoneAlbums) { 
             if (album.getName().equals(bucketName)) { 
              album.getAlbumPhotos().add(phonePhoto); 
              Log.i("DeviceImageManager", "A photo was added to album => " + bucketName); 
              break; 
             } 
            } 
           } else { 
            PhoneAlbum album = new PhoneAlbum(); 
            Log.i("DeviceImageManager", "A new album was created => " + bucketName); 
            album.setId(phonePhoto.getId()); 
            album.setName(bucketName); 
            album.setCoverUri(phonePhoto.getPhotoUri()); 
            album.getAlbumPhotos().add(phonePhoto); 
            Log.i("DeviceImageManager", "A photo was added to album => " + bucketName); 
    
            phoneAlbums.add(album); 
            albumsNames.add(bucketName); 
           } 
    
          } while (cur.moveToNext()); 
         } 
    
         cur.close(); 
         listener.onComplete(phoneAlbums); 
        } else { 
         listener.onError(); 
        } 
    } 
    
  6. 現在你就只剩下了將圖像渲染到屏幕上。在我的情況下,我喜歡使用Picasso。下面是我如何做到這一點:

    Picasso.with(getActivity()) 
           .load("file:" + mPhoneAlbums.get(i).getCoverUri()) 
           .centerCrop() 
           .fit() 
           .placeholder(R.drawable.temp_image) 
           .into(mAlbumPreview); 
    
  7. 不要忘記添加權限在您的清單讀取外部存儲:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    

就是這樣。你已準備好出發! 祝你好運!

1

從這裏(Get all images from gallery in android programmatically

activity_main.xml中

<RelativeLayout android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 


    <GridView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/gv_folder" 
     android:numColumns="2" 
     android:layout_marginLeft="10dp" 
     android:layout_marginRight="10dp"></GridView> 


</RelativeLayout> 

MainActivity.java

package galleryimages.galleryimages; 

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.MediaStore; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.GridView; 
import android.widget.Toast; 

import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 
    public static ArrayList<Model_images> al_images = new ArrayList<>(); 
    boolean boolean_folder; 
    Adapter_PhotosFolder obj_adapter; 
    GridView gv_folder; 
    private static final int REQUEST_PERMISSIONS = 100; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     gv_folder = (GridView)findViewById(R.id.gv_folder); 

     gv_folder.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Intent intent = new Intent(getApplicationContext(), PhotosActivity.class); 
       intent.putExtra("value",i); 
       startActivity(intent); 
      } 
     }); 


     if ((ContextCompat.checkSelfPermission(getApplicationContext(), 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(getApplicationContext(), 
       Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 
      if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) && (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, 
        Manifest.permission.READ_EXTERNAL_STORAGE))) { 

      } else { 
       ActivityCompat.requestPermissions(MainActivity.this, 
         new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 
         REQUEST_PERMISSIONS); 
      } 
     }else { 
      Log.e("Else","Else"); 
      fn_imagespath(); 
     } 



    } 

    public ArrayList<Model_images> fn_imagespath() { 
     al_images.clear(); 

     int int_position = 0; 
     Uri uri; 
     Cursor cursor; 
     int column_index_data, column_index_folder_name; 

     String absolutePathOfImage = null; 
     uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

     String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME}; 

     final String orderBy = MediaStore.Images.Media.DATE_TAKEN; 
     cursor = getApplicationContext().getContentResolver().query(uri, projection, null, null, orderBy + " DESC"); 

     column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); 
     column_index_folder_name = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 
     while (cursor.moveToNext()) { 
      absolutePathOfImage = cursor.getString(column_index_data); 
      Log.e("Column", absolutePathOfImage); 
      Log.e("Folder", cursor.getString(column_index_folder_name)); 

      for (int i = 0; i < al_images.size(); i++) { 
       if (al_images.get(i).getStr_folder().equals(cursor.getString(column_index_folder_name))) { 
        boolean_folder = true; 
        int_position = i; 
        break; 
       } else { 
        boolean_folder = false; 
       } 
      } 


      if (boolean_folder) { 

       ArrayList<String> al_path = new ArrayList<>(); 
       al_path.addAll(al_images.get(int_position).getAl_imagepath()); 
       al_path.add(absolutePathOfImage); 
       al_images.get(int_position).setAl_imagepath(al_path); 

      } else { 
       ArrayList<String> al_path = new ArrayList<>(); 
       al_path.add(absolutePathOfImage); 
       Model_images obj_model = new Model_images(); 
       obj_model.setStr_folder(cursor.getString(column_index_folder_name)); 
       obj_model.setAl_imagepath(al_path); 

       al_images.add(obj_model); 


      } 


     } 


     for (int i = 0; i < al_images.size(); i++) { 
      Log.e("FOLDER", al_images.get(i).getStr_folder()); 
      for (int j = 0; j < al_images.get(i).getAl_imagepath().size(); j++) { 
       Log.e("FILE", al_images.get(i).getAl_imagepath().get(j)); 
      } 
     } 
     obj_adapter = new Adapter_PhotosFolder(getApplicationContext(),al_images); 
     gv_folder.setAdapter(obj_adapter); 
     return al_images; 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     switch (requestCode) { 
      case REQUEST_PERMISSIONS: { 
       for (int i = 0; i < grantResults.length; i++) { 
        if (grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         fn_imagespath(); 
        } else { 
         Toast.makeText(MainActivity.this, "The app was not allowed to read or write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 
     } 
    } 

}