如何在Android中使用内容解析器插入文件?

如何在Android中使用内容解析器插入文件?,android,android-contentresolver,android-10.0,android-storage,Android,Android Contentresolver,Android 10.0,Android Storage,我正在尝试将音频文件插入Android中的共享存储。我在api 29(仿真器)上遇到错误 错误: java.lang.IllegalArgumentException: Primary directory (invalid) not allowed for content://media/external_primary/audio/media; allowed directories are [Alarms, Music, Notifications, Podcasts, Ringtones]

我正在尝试将音频文件插入Android中的共享存储。我在api 29(仿真器)上遇到错误

错误:

java.lang.IllegalArgumentException: Primary directory (invalid) not allowed for content://media/external_primary/audio/media; allowed directories are [Alarms, Music, Notifications, Podcasts, Ringtones]
我的代码是:

。。。
Uri集合=(Build.VERSION.SDK\u INT>=Build.VERSION\u code.Q)
? MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME\u外部\u主要)
:MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME\u外部);
values=新的ContentValues();
value.put(MediaStore.Audio.Media.DISPLAY_NAME,targetFileName);
value.put(MediaStore.Audio.Media.RELATIVE_PATH,targetFileDirPath);
value.put(MediaStore.Audio.Media.MIME_类型,“音频/mpeg”);
value.put(MediaStore.Audio.Media.IS_PENDING,1);
解析程序=getContentResolver();
uri=resolver.insert(集合,值);//错误从这里抛出
outputStream=uri!=无效的openOutputStream(uri):null;
...

此错误的原因是什么?我如何解决此问题?

显然,
MediaStore.Audio.Media.getContentUri()
不会返回直接可用的
Uri
,至少在Android 10+上是如此。它指向“音频”的一个抽象位置,但您不能将内容直接写入该
Uri
。相反,您需要使用
RELATIVE\u PATH
来指定一个受支持的集合(
报警
音乐
通知
播客
铃声
),然后指定其中所需的任何路径


不过请注意,
RELATIVE_PATH
本身对Android 10来说是新的。对于Android 9和更早的设备,我建议直接写入文件系统。

{确认@CommnWare的使用情况

value.put(MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY_DOWNLOADS+“/”+FILE_DIR); value.put(MediaStore.MediaColumns.IS_PENDING,1); value.put(MediaStore.MediaColumns.DISPLAY\u NAME、FILE\u NAME); value.put(MediaStore.MediaColumns.MIME_TYPE,“text/plain”);
在此处输入代码

ContentResolver解析器=_context.getContentResolver(); insert(MediaStore.Files.getContentUri(MediaStore.VOLUME\u EXTERNAL\u PRIMARY),值);
}

对不起,我删除了我先前的答案,因为我没有注意到您正在使用
MediaStore.Audio.Media
。我不完全确定您为什么会收到此消息,但您可以尝试将建议的基本集合之一添加到您的
相对路径
@commonware中。您是对的。问题是关于我的相对路径(targetFileDirPath)。我解决了将相对路径更改为“音乐/我的应用程序名”的问题。非常感谢。如果您添加为的答案,请接受您的答案