【问题标题】:How to create a public directory on the external storage?如何在外部存储上创建公共目录?
【发布时间】:2018-08-19 09:04:42
【问题描述】:

我正在尝试将公共文件保存在外部存储上。 我正在关注 Android Developers 页面中的示例: https://developer.android.com/training/data-storage/files#PublicFiles

首先我尝试在公共目录 DIRECTORY_DOCUMENTS 中创建一个目录“mydocuments”。代码很简单

TextView tv= findViewById(R.id.myTextview);
    // Get the directory for the user's public pictures directory.
    File documents= Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOCUMENTS);
    tv.append("\n documents directory=" + documents);
    File file = new File(documents, "mydocuments");
    tv.append("\n\nDirectory to be created=" + file);
    if (file.exists())
        tv.append("\n\nFile already exists:" + file.getAbsolutePath());
    else{
        if (!file.mkdirs())
            tv.append("\n\nDirectory not created:" + file.getAbsolutePath());

我在清单文件中添加了权限

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

但是,当我在设备(虚拟或物理)中运行它时,结果总是相同的:

documents directory=/storage/emulated/0/Documents

Directory to be created=/storage/emulated/0/Documents/mydocuments

Directory not created:/storage/emulated/0/Download/mydocuments

如何使 Documents 目录可写?

提前谢谢你。

【问题讨论】:

  • documents=/storage/emulated/0/Documents Directory not created 这是发布问题的一种令人困惑的方式,因为未创建的目录是/storage/emulated/0/Documents/mydocuments
  • tv.append("Directory not created"); 改为tv.append("Directory not created: " + file.getAbsolutePath());
  • 进一步:您从官方谷歌文档复制了这段代码。它的代码非常糟糕,因为当目录已经存在时,您将收到一条消息,指出该目录未创建。如果目录还不存在,您应该只调用 mkdir()/mkdirs()。所以使用前请检查。
  • 谢谢,我将上面的代码编辑为更清晰的内容,包括检查目录是否存在。

标签: android android-sdcard android-external-storage readonly-attribute


【解决方案1】:

今年你在这个问题上排名第 1278。

对于 Android 6+,您必须添加代码以要求用户确认您在清单文件中请求的权限。

Google 获取运行时权限。

您也可以转到应用的设置并将存储权限切换为开启。

【讨论】:

  • 感谢这实际上解决了我的问题。现在我什至可以读取 SD 卡的内容了。
  • 如何确定可移动微型 SD 卡的路径?那条路看起来怎么样?
  • 我指的是手机 SD 卡。我还没有尝试读取外部 micro SD 卡。
  • 但是使用我手机 microSD 的硬编码路径“/storage/3535-6363”,它可以工作。我可以阅读内容。
【解决方案2】:

感谢@greenapps 的建议,我解决了我的问题。这是我发现写在 SD 卡上 Documents 目录中的最简单的解决方案,如

中所述

https://developer.android.com/training/permissions/requesting

1.-首先在代码开头的某处询问用户权限:

  ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            MY_PERMISSIONS);

我之前定义常量的地方

final int MY_PERMISSIONS=1;

2.-然后实现我上面的代码写在SD卡上方法里面

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // task you need to do.
                writeSD();  // this is the code to write on the SD card shown above

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                tv.append("\n\n No permission given");
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

这解决了我的问题。第一次执行时,会打开一个对话框,询问权限。之后就可以读取sdcard的内容,也可以写入公共目录DOCUMENTS、PICTURES、DOWNLOADS等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2020-12-22
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多