In Android, how do I query MediaStore only for files in a specific path? Or alternatively, only display files in a certain path?

后端 未结 2 1009
挽巷
挽巷 2021-02-06 12:44

Suppose I have an Android block of code that looks something like this:

String[] proj = {MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media._ID};
int[] to = n         


        
2条回答
  •  谎友^
    谎友^ (楼主)
    2021-02-06 13:23

    OK, after many iterations of trying, I finally have an example that works and I thought I'd share it. My example queries the images MediaStore, then obtains the thumbnail for each image to display in a view. A few tweaks should provide you with the code needed to query the audio MediaStore instead. I am loading my images into a Gallery object, but that is not a requirement for this code to work:

    Make sure you have a Cursor and int for the column index defined at the class level so that the Gallery's ImageAdapter has access to them:

    private Cursor cursor;
    private int columnIndex;
    

    First, obtain a cursor of image IDs located in the folder:

    Gallery g = (Gallery) findViewById(R.id.gallery);
    // request only the image ID to be returned
    String[] projection = {MediaStore.Images.Media._ID};
    // Create the cursor pointing to the SDCard
    cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection, 
            MediaStore.Images.Media.DATA + " like ? ",
            new String[] {"%myimagesfolder%"},  
            null);
    // Get the column index of the image ID
    columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
    g.setAdapter(new ImageAdapter(this));
    

    Then, in the ImageAdapter for the Gallery, obtain the thumbnail to display:

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = new ImageView(context);
        // Move cursor to current position
        cursor.moveToPosition(position);
        // Get the current value for the requested column
        int imageID = cursor.getInt(columnIndex);
        // obtain the image URI
        Uri uri = Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(imageID) );
        String url = uri.toString();
        // Set the content of the image based on the image URI
        int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length()));
        Bitmap b = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
                        originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
        i.setImageBitmap(b);
        i.setLayoutParams(new Gallery.LayoutParams(150, 100));
        i.setScaleType(ImageView.ScaleType.FIT_XY);
        i.setBackgroundResource(mGalleryItemBackground);
        return i;
    }
    

    I guess the most important section of this code is the managedQuery that demonstrates how to use MediaStore queries to filter a list of image files in a specific folder.

提交回复
热议问题