2017-02-19 212 views
1

我正試圖在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

您的意思是我用來檢索路徑的代碼或我編寫的代碼? –

回答

2

在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