MediaStore в Android
MediaStore — це системний інтерфейс Android, що дозволяє працювати з медіа-файлами на пристрої, такими як зображення, аудіо та відео. Він забезпечує доступ до медіа-контенту, що зберігається в зовнішньому або внутрішньому сховищі, а також дозволяє додавати нові медіа-файли в ці сховища.
Основи MediaStore
В Android MediaStore дозволяє вам взаємодіяти з медіа-файлами в кількох основних категоріях:
- Зображення — всі типи зображень, що зберігаються на пристрої.
- Аудіо — музика, звукові записи та інші аудіофайли.
- Відео — відеофайли.
Основні компоненти 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).