В Android, как мне запрашивать MediaStore только для файлов по определенному пути? Или, в качестве альтернативы, отображать файлы только по определенному пути?

#java #android

#java #Android

Вопрос:

Предположим, у меня есть блок кода Android, который выглядит примерно так:

 String[] proj = {MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media._ID};
int[] to = new int[] { R.id.artist_name };
Cursor musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, proj, null, null, MediaStore.Audio.Media.ARTIST);
ListView musiclist = (ListView) findViewById(R.id.mylist);

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.songitem, musiccursor, proj, to);
musiclist.setAdapter(mAdapter);
  

Но то, что я хочу, это:

 String selection = MediaStore.Audio.Media.FILE_PATH   " ilike '%audio%books%'";

String[] proj = {MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media._ID};
int[] to = new int[] { R.id.artist_name };
Cursor musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, proj, selection, null, MediaStore.Audio.Media.ARTIST);
ListView musiclist = (ListView) findViewById(R.id.mylist);

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.songitem, musiccursor, proj, to);
musiclist.setAdapter(mAdapter);
  

Единственная проблема, конечно, в том, что FILE_PATH на самом деле не является столбцом, который я могу использовать, и, насколько я могу судить, такого столбца не существует.

Итак, мне интересно:

  1. Есть ли способ запрашивать только музыку в определенном каталоге? Если да, то как?
  2. Если это не вариант, должен ли я создать ListAdapter, который фильтрует по каталогу? Если да, то опять же, как мне это сделать?

Спасибо за любой совет.

Ответ №1:

Хорошо, после многих попыток у меня наконец есть пример, который работает, и я подумал, что поделюсь им. Мой пример запрашивает хранилище images MediaStore, затем получает миниатюру для каждого изображения для отображения в представлении. Несколько настроек должны предоставить вам код, необходимый для запроса хранилища аудиофайлов вместо этого. Я загружаю свои изображения в объект Gallery, но это не является обязательным требованием для работы этого кода:

Убедитесь, что у вас есть курсор и значение int для индекса столбца, определенного на уровне класса, чтобы у ImageAdapter галереи был к ним доступ:

 private Cursor cursor;
private int columnIndex;
  

Сначала получите указатель идентификаторов изображений, расположенных в папке:

 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));
  

Затем в адаптере изображений для галереи получите миниатюру для отображения:

 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;
}
  

Я полагаю, что наиболее важным разделом этого кода является managedQuery, который демонстрирует, как использовать запросы MediaStore для фильтрации списка файлов изображений в определенной папке.

Ответ №2:

MediaStore.MediaColumns.ДАННЫЕ — это то, что вы ищете, что-то вроде ‘FILE_PATH’.

Таким образом, путь к файлу может быть получен с помощью

 String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA));