【问题标题】:getExternalFilesdir Fail获取外部文件目录失败
【发布时间】:2015-08-05 11:38:41
【问题描述】:

OnActivityCreated 我在做:

activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);

在 logcat 中我得到:

com.package W/ContextImpl﹕ Failed to ensure directory: /storage/sdcard1/Android/data/com.package/files/Pictures

这只发生在 LOLLIPOP (MOTO G 2014) 上,在 KITKAT (Nexus 4) 上一切正常。我在清单上有 WRITE_EXTERNAL_STORAGE。 我在这里想念什么?通过文件浏览应用程序(如 ES Explorer)安装和访问存储。

编辑:令人惊讶的是,即使我收到上面报告的警告,文件也会在目录下正确创建。

【问题讨论】:

  • 你有什么解决办法吗?
  • 不。嗯,不完全是。继续使用这个解决方案,我收到了一些用户的一些不好的报告,但我不能用所有的物理设备来测试它。其他用户很好。如果您以某种方式解决/解决此问题,请告诉我。

标签: android android-file


【解决方案1】:

试试这个:

String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

并使用此权限:

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

其实:

getExternalFilesDir()

它返回 SD 卡上/Android/data/com.package/files/Pictures 内文件夹的路径。而且里面没有名为Pictures 的文件夹。所以你得到了那个错误。

【讨论】:

  • 这样我不会收到警告,但我不在应用程序的私有上下文中。我只是想知道为什么我不能让私人文件夹工作....
  • 我赞同 Jumpa 的说法。我需要将文件存储在 App 文件夹中,如果用户卸载该应用程序,它们将被删除。为什么 getExternalFilesDir 更适合很多应用程序?
【解决方案2】:

我只在一台设备上遇到了类似的问题。安卓版本为 5.1.1(api 22) 我在清单中发现的权限添加如下。

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

我删除了 maxSdkVersion 限制,然后问题就解决了。

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

我之前添加了 maxSdkVersion,因为我在某处读到此权限是 API 18 或更早版本需要的,但似乎情况并非如此。它因设备而异。

如果您在清单中具有相同的权限设置,这可能会对您有所帮助。

【讨论】:

    【解决方案3】:

    如果您正在为 Android 2.1 或更高版本进行开发,请使用

    getExternalFilesDir(String type) 
    

    仔细阅读https://developer.android.com/guide/topics/data/data-storage.html#filesExternal

    另外,您需要使用此方法或类似方法

    boolean mExternalStorageAvailable = false;
    boolean mExternalStorageWriteable = false;
    String state = Environment.getExternalStorageState();
    
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        // We can read and write the media
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        // We can only read the media
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        // Something else is wrong. It may be one of many other states, but all we need
        //  to know is we can neither read nor write
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }
    

    然后检查您是否可以访问 sdcard。如前所述,请阅读官方文档。

    您必须从 SD 卡进入目录(一个文件对象)并制作您的特定文件路径,例如:

    Environment.getExternalStorageDirectory(Environment.DIRECTORY_PICTURES);
    

    还需要在清单文件中给予权限

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多