与 Android 平台 API 30 至 35 相关的问题,应用程序面向 API 33 我的android应用程序的工作是将计算机上的用户音乐库同步到android。这包括向 Android 添加音乐、视频等媒体以及删除。 安装应用程序时,添加和删除功能有效,但是在重新安装时,应用程序可以在同步期间添加其他文件,但如果由于用户从计算机的库中删除了媒体而需要删除项目,则会失败。 Android 中无法删除 MediaItems。有几十个文件需要添加或删除,有时甚至有数百个。添加和删除的函数如下
据我了解,自 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;
}
查询 mediaStore 中的文件,找到您的文件并请求删除