无法在SD卡上写入文件

无法在SD卡上写入文件

问题描述:

我正试图在SD卡上写下一张照片,但没有成功。无法在SD卡上写入文件

我已经获得了在可移动存储中写入的权限,并且安装了SD卡。

此外,我检查了SD卡的路径存在,我获得了积极的结果。

失败的地方是我使用mkdir()函数。它返回false并且没有文件被创建。

我已经上都有了三星A6(棉花糖)和三星TAB4(棒棒堂)

这是我使用的检索路径SD卡中的代码段测试。
因为标准程序并没有与三星设备的工作,我使用这个代码片段,我从一个计算器答案

的路径与三星A6这个函数返回了是/存储/ 6DD9-1D15 。

public String[] getStorageDirectories() { 
    String[] storageDirectories; 
    String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE"); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     List<String> results = new ArrayList<String>(); 
     File[] externalDirs = getApplicationContext().getExternalFilesDirs(null); 
     for (File file : externalDirs) { 
      String path = file.getPath().split("/Android")[0]; 
      if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Environment.isExternalStorageRemovable(file)) 
        || rawSecondaryStoragesStr != null && rawSecondaryStoragesStr.contains(path)) { 
       results.add(path); 
      } 
     } 
     storageDirectories = results.toArray(new String[0]); 
    } else { 
     final Set<String> rv = new HashSet<String>(); 

     if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) { 
      final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator); 
      Collections.addAll(rv, rawSecondaryStorages); 
     } 
     storageDirectories = rv.toArray(new String[rv.size()]); 
    } 
    return storageDirectories; 
} 

此,取而代之的,是我用写的SD卡下的DCMI目录的文件夹(在我会把照片)

public void mkFolder(String folderPath) { // make a folder under Environment.DIRECTORY_DCIM 

    File folder = new File(folderPath); 

    try { 
     // MKDIRS returns false 
     if (folder.mkdirs()) { 
      Log.d(TAG, "folder created:" + folder.toString()); 
     } else { 
      Log.d(TAG, "create folder fails:" + folder.toString()); 
     } 
    } catch (Exception ecp) { 
     ecp.printStackTrace(); 
    } 
} 
+0

好的,谢谢,我修改了与我正在使用的代码 –

+0

您的意思是我用来检索路径的代码或我编写的代码? –

在API级别代码18及以下,您的getStorageDirectories()将通过其else块。该块假设:

  • SECONDARY_STORAGE环境变量存在......这不是必需的
  • SECONDARY_STORAGE包含目录的分隔列表...不要求
  • 该目录的列表匹配移动存储选项...不要求
  • ,您可以用这些目录的工作......这是不需要

在API级别1 9+,您的getStorageDirectories()代码将通过其if块。在那里,你开始罚款,打电话getExternalFilesDirs()。如果该方法返回2个项目,则第二个和后续项目指向可移动存储,并且特别指向可移动存储上可以读取和写入的位置。然后,您的代码假定:

  • 该目录中有一个/Android路径段......不要求
  • 是前/Android的目录路径的部分代表在其中您可以创建文件和目录的位置...... 这是不正确的

您不必在特定文件系统级访问,移动存储,除了目录返回的方法如getExternalFilesDirs()

所以,要么:

  • 棒由getExternalFilesDirs()返回的特定位置,或者

  • 转为使用the Storage Access Framework,允许用户选择在哪里存储的内容(其可能是或可能不是可移动存储)

+0

谢谢,它使用getExternalFilesDir()。 –

+0

你是不是很喜欢@MarcoMenardi – nzala