Элементы mediaStore больше нельзя удалить после переустановки.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Элементы mediaStore больше нельзя удалить после переустановки.

Сообщение Anonymous »

Вопрос, относящийся к API платформ Android от 30 до 35, приложение ориентировано на API 33.
Задача моего приложения для Android — синхронизировать музыкальную библиотеку пользователей на компьютере с Android. Это включает в себя добавление мультимедийных файлов, таких как музыка, видео, на Android, а также удаление.
Добавление и удаление работает, когда приложение установлено, однако при переустановке приложение может добавлять дополнительные файлы во время синхронизации, но если элементы необходимо удалить, потому что пользователь удалил носитель из своей библиотеки на компьютере, он выходит из строя. MediaItems невозможно удалить в Android. Файлов, которые нужно добавить или удалить, несколько десятков, иногда сотни. Функции добавления и удаления приведены ниже.
Я понимаю, что начиная с API 29/30, если приложение переустанавливается, оно теряет право собственности на свои файлы. Но это не имеет смысла, когда пользователь переустанавливает приложение, весь ранее сохраненный контент игнорируется и для повторной синхронизации используется новый каталог. Как решить эту проблему, какое решение является лучшим.
void addAudioToMediaStore(InputStream inStream) {
// Code to an audio media to mediastore
Uri audioCollection = MediaStore.Audio.Media
.getContentUri(MediaStor
ContentValues songDetails = new ContentValues();
songDetails.put(MediaStore.Audio.Media.DISPLAY_NAME,
filename);

songDetails.put(MediaStore.Audio.Media.RELATIVE_PATH,
String.format("Music/Library/%s/%s/",artist,album));

songDetails.put(MediaStore.Audio.Media.IS_PENDING, 1);

Uri songContentUri = resolver
.insert(audioCollection, songDetails);

byte[] buffer = new byte[1024 * 250];
long nTotalBytes = 0;

try
{
OutputStream os = resolver.openOutputStream(songContentUri, "rw");

while (nTotalBytes != size)
{
int nRead = inStream.read(buffer, 0, buffer.length);

if (nRead >= 0) {
os.write(buffer, 0, nRead);
nTotalBytes += nRead;
} else {
Log.d("TEST API 30-35 MEDIASTORE", String.format("Warning() read returned -1"));
break;
}

}

os.flush();
os.close();

} catch (Exception e) {
throw new RuntimeException(e);
}finally {
return false;

}
songDetails.clear();
songDetails.put(MediaStore.Audio.Media.IS_PENDING, 0);
int result = resolver.update(songContentUri, songDetails, null, null);

return true;
}

и удаление работает следующим образом
public int deleteMediaStoreRecords(String artist, String album, String filename) {

Uri audioCollection = MediaStore.Audio.Media
.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);

String relativePath = "%Library/"+artist+"/"+album+"%";
String selection = MediaStore.Audio.Media.DISPLAY_NAME + " LIKE ?" + " AND " + MediaStore.Audio.Media.RELATIVE_PATH + " LIKE ?" ;
// TODO This will break if we have no matching item in the MediaStore.
int numDeleted = context.getContentResolver().delete(audioCollection,
selection,
new String[]{filename,relativePath}
);

return numDeleted;
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -reinstall
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»