android.permission.WRITE\媒体\存储错误

android.permission.WRITE\媒体\存储错误,android,android-permissions,android-external-storage,Android,Android Permissions,Android External Storage,我正在开发一个编辑文本文件的应用程序。通过“操作\打开\文档”活动打开文件时,我可以对其进行r/w操作: Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 它可以在内部和外部SD存储上正常工作 我还为android.int

我正在开发一个编辑文本文件的应用程序。通过“操作\打开\文档”活动打开文件时,我可以对其进行r/w操作:

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
 intent.addCategory(Intent.CATEGORY_OPENABLE);
 intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
它可以在内部和外部SD存储上正常工作

我还为android.intent.action.VIEW设置了一个意向过滤器。该应用程序显示在Android MyFiles应用程序的“选择器”中。从MyFiles返回的Uri看起来与从ACTION_OPEN_文档返回的Uri不同,即它有一个文件号而不是文件名。 使用MyFiles传递给我的intent.getData()中的Uri,我可以读取文件,但不能将它们写入SD卡(外部存储)。但是,我能够将文件读写到内部存储器

在清单文件中,我定义了以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我有一个requestPermissions()的结果处理程序,它显示已成功授予权限

当我试图打开文件进行写入时,出现以下异常:

 pfd = MainActivity.this.getContentResolver().openFileDescriptor(uri, "w");
 fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
异常:外部路径:/storage/0123-4567/Test/123.txt:用户10196和当前进程都没有android.permission.WRITE\u MEDIA\u存储。



在我从MyFiles获得文件句柄后,是否需要请求其他权限来执行写入操作,或者是否需要使用其他技术以完全r/w访问权限打开文件?

除非您具有root权限,否则问题似乎无法解决,请参阅Jorrit“Chainfire”Jongma的帖子:

因此,如果您购买了预装16gb(或8或32等)存储空间的Android设备,并且它也可以使用SD卡,那么您的设备已经有两个外部存储空间

内部闪存通常被视为主要外部存储位置,而SD卡则被视为辅助外部存储位置(如果存在内部闪存)。可以连接的U盘或硬盘驱动器也可以作为辅助外部存储器

在较新的安卓版本中,谷歌似乎使第三方应用程序(未预装在设备上,但您手动安装或从安卓Market/Google Play下载的应用程序)无法获得外部SD卡的写入权限

[……]

过去,应用程序会请求“写入外部存储”权限,这将授予对所有外部存储的写入访问权(用户/组“sdcard\u rw”)。这显然已更改为仅授予对主外部存储器的写访问权限。引入了第二种权限,称为“写入媒体存储”,这将授予对其他外部存储(用户/组“媒体rw”)的访问权限


经过4个月的问题开放,我看到了很多观点,但没有答案。我的工作是检查保存结果。如果发生文件IO错误,则提示保存到其他文件名。
 pfd = MainActivity.this.getContentResolver().openFileDescriptor(uri, "w");
 fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());