【问题标题】:How to get permission to write files into SDCard in Android 6.0+如何在 Android 6.0+ 中获得将文件写入 SDCard 的权限
【发布时间】:2019-09-24 12:54:07
【问题描述】:

我正在开发一个简单的文件浏览器来列出和写入文件。它在内部存储上完美运行,但不适用于外部 SD 卡(写入文件被拒绝访问)。 我在 AndroidManifest.xml 文件中有这些权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我会在应用启动时请求它们。但我仍然无法将文件保存在外部 SD 上。 当我尝试使用FileOutputStream 编写代码时,它会使用路径/storage/(sdcard folder)/ 抛出FileNotFoundException

java.io.FileNotFoundException: /storage/27BB-C7D9/Download/353874.jpg: open failed: EACCES (Permission denied)

SD 卡在 Android 上是只读的吗? 一些应用程序,如 ES File Explorer 可以在外部 SD 上写入文件。是否有一些功能可以用来获得足够的权限?

谢谢。

【问题讨论】:

  • 在应用部分添加android:requestLegacyExternalStorage="true"
  • 据我所知,你现在只能使用SAF写入真实的物理SD卡
  • @VladyslavMatviienko 那可能是什么“新加坡武装部队”?
  • @IntelliJAmiya 添加 AndroidManifest.xml 文件?我试过了,但这是应用程序部分的未知属性。
  • @LuanSilveira 你试过搜索吗?

标签: java android android-studio android-sdcard


【解决方案1】:

您需要使用documentFile

请参阅我对有关 SD 卡的较早问题的回答,以了解如何访问您的 SD 卡 here

【讨论】:

  • 您应该将问题标记为重复,而不是使用链接回答
【解决方案2】:

API 级别 23 以上,您必须在运行时请求它

String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions, WRITE_REQUEST_CODE);

现在像这样覆盖 onRequestPermissionsResult 方法

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // write here
            } else {
                 // show message to user that permission needed
            }
        ....
    }
} 

【讨论】:

  • 但我已经做到了!我在应用启动时请求这些权限。我在问题中写道:“我在 AndroidManifest.xml 文件中拥有这些权限:[...],我在应用启动时请求它们。”
  • @LuanSilveira 你必须在 AndroidManifest.xml 中拥有它,最重要的是你必须在运行时执行上述操作
  • @tiborK 请仔细阅读问题:这是关于写入外部物理 SD 卡,如 microSD。与权限无关
【解决方案3】:

试试这个代码:

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "filename");
FileOutputStream f = new FileOutputStream(file);

【讨论】:

  • 如果您不请求运行时权限,这将不起作用,无论如何,这对于 Android Q 来说也很可能是不够的。
  • Environment.getExternalStorageDirectory() 不指向 SD 卡。它指向'/storage/emulated/0/',即内部存储。
  • Environment.getExternalStorageDirectory(); 不会为您提供物理 SD 卡的路径,它会返回模拟的 SD 卡。
猜你喜欢
  • 1970-01-01
  • 2013-12-20
  • 2011-10-23
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2014-08-24
  • 1970-01-01
相关资源
最近更新 更多