MediaStore в Android

MediaStore — це системний інтерфейс Android, що дозволяє працювати з медіа-файлами на пристрої, такими як зображення, аудіо та відео. Він забезпечує доступ до медіа-контенту, що зберігається в зовнішньому або внутрішньому сховищі, а також дозволяє додавати нові медіа-файли в ці сховища.

Основи MediaStore

В Android MediaStore дозволяє вам взаємодіяти з медіа-файлами в кількох основних категоріях:

  1. Зображення — всі типи зображень, що зберігаються на пристрої.
  2. Аудіо — музика, звукові записи та інші аудіофайли.
  3. Відео — відеофайли.

Основні компоненти MediaStore:

  • MediaStore.Images: для роботи із зображеннями.
  • MediaStore.Audio: для роботи з аудіофайлами.
  • MediaStore.Video: для роботи з відеофайлами.

Підготовка до роботи з MediaStore

Для роботи з MediaStore на Android 10 (API рівень 29) і вище необхідно враховувати нові обмеження, такі як Scoped Storage, яке обмежує доступ додатків до файлової системи пристрою. Це змушує використовувати спеціальні API для доступу до медіа-файлів.

Доступ до медіа через MediaStore

Зображення

Щоб отримати доступ до зображень, збережених на пристрої, можна використовувати MediaStore.Images.Media.EXTERNAL_CONTENT_URI.

Отримання зображень із зовнішнього сховища:

public void getImages() {
    Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
    
    // Використовуємо ContentResolver для отримання зображень
    Cursor cursor = getContentResolver().query(imageUri, projection, null, null, null);
    
    if (cursor != null) {
        while (cursor.moveToNext()) {
            int idIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
            int nameIndex = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME);
            
            String id = cursor.getString(idIndex);
            String name = cursor.getString(nameIndex);
            
            // Тут можна обробляти інформацію про зображення
            Log.d("Image Info", "ID: " + id + " Name: " + name);
        }
        cursor.close();
    }
}

Аудіо

Для роботи з аудіофайлами можна використовувати MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.

Отримання аудіофайлів:

public void getAudio() {
    Uri audioUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME};
    
    // Отримуємо дані про аудіофайли
    Cursor cursor = getContentResolver().query(audioUri, projection, null, null, null);
    
    if (cursor != null) {
        while (cursor.moveToNext()) {
            int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
            int nameIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME);
            
            String id = cursor.getString(idIndex);
            String name = cursor.getString(nameIndex);
            
            // Тут можна обробляти інформацію про аудіофайл
            Log.d("Audio Info", "ID: " + id + " Name: " + name);
        }
        cursor.close();
    }
}

Відео

Для роботи з відеофайлами використовуємо MediaStore.Video.Media.EXTERNAL_CONTENT_URI.

Отримання відеофайлів:

public void getVideo() {
    Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME};
    
    // Отримуємо дані про відеофайли
    Cursor cursor = getContentResolver().query(videoUri, projection, null, null, null);
    
    if (cursor != null) {
        while (cursor.moveToNext()) {
            int idIndex = cursor.getColumnIndex(MediaStore.Video.Media._ID);
            int nameIndex = cursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME);
            
            String id = cursor.getString(idIndex);
            String name = cursor.getString(nameIndex);
            
            // Тут можна обробляти інформацію про відеофайл
            Log.d("Video Info", "ID: " + id + " Name: " + name);
        }
        cursor.close();
    }
}

Додавання зображень у MediaStore

Щоб додати нове зображення до MediaStore, можна використати методи класу ContentResolver.

Додавання зображення:

public void addImageToGallery(File imageFile) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, imageFile.getName());
    values.put(MediaStore.Images.Media.DISPLAY_NAME, imageFile.getName());
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);

    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    
    try (OutputStream outStream = getContentResolver().openOutputStream(uri)) {
        FileInputStream inStream = new FileInputStream(imageFile);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
        }
        inStream.close();
    } catch (IOException e) {
        Log.e("MediaStore", "Error writing file to MediaStore", e);
    }
}

Дозволи

Для доступу до медіа-файлів з зовнішнього сховища потрібно додавати дозволи у файл AndroidManifest.xml. Наприклад, для Android 9 (API рівень 28) і нижче:

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

Scoped Storage (Android 10 і вище)

У Android 10 і вище, доступ до файлової системи став більш обмеженим через Scoped Storage, що обмежує додаткам доступ до даних в системних каталогах.

  • Для зображень, аудіо та відео, збережених у публічному доступі (наприклад, в папці Pictures, Music, Movies), доступ можна отримати через MediaStore.
  • Для доступу до більш специфічних файлів, наприклад, фотографій або відео, створених додатком, використовуються інші API, такі як Storage Access Framework (SAF). Важливі моменти:
  • Для запису нових медіа-файлів, таких як зображення чи відео, через MediaStore, ваш додаток не потребує доступу до всього зовнішнього сховища, що забезпечує більшу безпеку.
  • Якщо ви хочете доступ до файлів, які зберігаються в інших частинах файлової системи або створені іншим додатком, вам може знадобитись запит дозволу через Storage Access Framework (SAF).