2015-07-10 206 views
3

我試圖將一些字符串保存到SD卡。但它是拋出此異常打開失敗EACCES(權限被拒絕)。我在一臺設備上測試了這個(asus zenfone 5)。我已經在清單文件WRITE_EXTERNAL_STORAGE中聲明瞭權限,安裝了我的SD卡並可以從中讀取數據(我親自通過複製一些mp3文件並將其播放)進行檢查。因爲這是一個手機特定的應用程序,手機內有一個內部和外部存儲器,我想保存在外部SD卡中的文件,我寫了這樣的代碼。我通過使用「cd」和「ls」命令獲得了使用終端仿真器應用程序的外部SD卡的絕對路徑。我的手機沒有固定,所以我不能直接發佈任何權限更改。我已經嘗試所有可能的方法可能通過谷歌和stackoverflow。請幫我開放失敗EACCES(權限被拒絕)

public void savePublicExternalFile(String data){ 
     File folder = new File("/Removable/MicroSD/"); 
     //i have also tried File folder = new File("/Removable/MicroSD"); 
     File myFile = new File(folder,"mydata.txt"); 
     WriteData(myFile, data); 



    } 

    private void WriteData(File myFile, String data){ 

     if(t){ 
      Log.i("AbsolutePath",myFile.getAbsolutePath()); 
      t = false; 
     } 

     FileOutputStream fileOutputStream=null; 
     try { 
      fileOutputStream = new FileOutputStream(myFile); 
      fileOutputStream.write(data.getBytes()); 
     } catch (Exception e) { 
      Log.i("exception",e.toString()); 
     } finally { 
      if(fileOutputStream!=null){ 
       try { 
        fileOutputStream.close(); 
       } catch (IOException e) { 
        Log.i("exception", e.toString()); 
       } 
      } 
     } 


    } 

回答

3

我假設你華碩Zenfon E爲>= KitKatAndroid版本上運行。所以,由於KITKAT由於SD卡寫入策略發生重大變化,除了您的應用程序私人文件夾(/storage/../data/com.example/SD卡)之外,您將無法在SD卡上寫入數據。

要訪問SD卡上的此文件夾,在KitKat中添加了新的API。此API將返回包含所有應用私人文件夾路徑的文件數組。

File[] files = ContextCompat.getExternalFilesDirs(context, null) 

默認情況下,0th位置路徑類似於年長API Environment.getExternalStorageDirectory()返回的路徑,這是主存儲。 1st位置(一般情況下)將其他存儲目錄一般是SD卡。使用此文件路徑在SD卡上寫入。在寫入任何內容之前,請務必確認SD卡的已安裝狀態。

希望得到這個幫助。如果您遇到任何其他問題,請告知我。

+0

這是有幫助的,我能寫在SD卡的android文件夾,因爲文件[1]給了我的路徑,有沒有什麼方法可以使用這個或任何其他方法獲得SD卡的根路徑? –

+0

耶穌基督,花了我兩個小時找到你的答案。非常感謝。我試了很多年的環境調用,但它從來沒有用於我的Android 6系統(早期版本工作正常)。這裏有我的讚賞! –

0

而不是使用硬編碼的目錄,請嘗試使用調用Environment.getExternalStorageDirectory並通過附加名稱到路徑打開一個文件

+0

沒有,但沒有積極的結果 –

+0

仍然收到同樣的錯誤? – 2015-07-10 06:25:35

+0

是的,我仍然遇到同樣的問題。 –

1

幾個小時前我試過這個代碼保存圖像它適用於我。

void saveFile() { 
    String RootDir = Environment.getExternalStorageDirectory() 
      + File.separator + "any_folder"; 

    File myDir = new File(RootDir); 
    myDir.mkdirs(); 

    String fname = "mydata.txt"; 
    File file = new File(myDir, fname); 
    if (file.exists()) 
     file.delete(); 
    try { 
     FileOutputStream out = new FileOutputStream(file); 
     out.write(data.getBytes()); 
     out.flush(); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    Toast.makeText(AddText.this, "File saved to 'any_folder' folder", 
      Toast.LENGTH_LONG).show(); 
} 
+1

請你解釋我的答案和BlackHamm3rJack的答案有什麼區別? –

相關問題