1

我試圖將我的數據庫導出到CSV文件。我已將相應權限應用於AndroidManifest.xml。我只是想知道爲什麼我無法在我的(實際設備)Nexus 5X API級別23中編寫/創建該文件,其中相同的代碼在我的模擬器Nexus 7 API級別22中工作。權限是否不夠?java.io.IOException:打開失敗:在API級別23中寫入文件時EACCES(權限被拒絕)

下面的代碼:

private void writeCsv() { 
    File fileDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), 
      File.separator + "Example"); 
    if (!fileDir.exists()) { 
     try { 
       fileDir.mkdirs(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    File file = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), 
      File.separator 
      + "Example" 
      + File.separator 
      + (new Date()) + ".csv"); 
    if (!file.exists()) { 
     try { 
      file.createNewFile(); // THIS IS WHERE THE EXCEPTION POINTS OUT 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    if (file.exists()) { 
     try { 
      FileWriter fileWriter = new FileWriter(file); 
      BufferedWriter bfWriter = new BufferedWriter(fileWriter); 

      bfWriter.write("Id,Text,Timestamp\n"); 
      mDatabase.getWritableDatabase(); 
      List<Text> texts = mDatabase.getAllTexts(); 
      for (Text text : texts) { 
       bfWriter.write(text.getId() + "," + text.getText() 
         + "," + text.getTimestamp() + "\n"); 
      } 

      bfWriter.close(); 
      mDatabase.close(); 

      Toast.makeText(getActivity(), 
        "Texts exported to " + file.getAbsolutePath(), 
        Toast.LENGTH_SHORT).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

AndroidManifest

<application 
... 
</application> 

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

這裏的日誌:

01-21 22:55:22.589 25530-25530/com.example.android W/System.err: java.io.IOException: open failed: EACCES (Permission denied) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at java.io.File.createNewFile(File.java:939) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at com.example.android.settings.SettingsPage.writeCsv(SettingsPage.java:166) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at com.example.android.settings.SettingsPage.onClick(SettingsPage.java:89) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at android.view.View.performClick(View.java:5204) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at android.view.View$PerformClick.run(View.java:21153) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at android.os.Looper.loop(Looper.java:148) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
01-21 22:55:22.599 25530-25530/com.example.android W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
01-21 22:55:22.602 25530-25530/com.example.android W/System.err:  at libcore.io.Posix.open(Native Method) 
01-21 22:55:22.602 25530-25530/com.example.android W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
01-21 22:55:22.603 25530-25530/com.example.android W/System.err:  at java.io.File.createNewFile(File.java:932) 
01-21 22:55:22.603 25530-25530/com.example.android W/System.err: ... 11 more 

回答

7

沒有,宣佈允許瞄準Api23時是不夠的。

您必須在棉花糖之後的運行時請求權限。

http://developer.android.com/training/permissions/requesting.html

可以解決這個問題,現在通過靶向阿比22,而不是23

+0

這是** **的另一個很好的理由要遠離API 23分開...;) –

+0

@HrundiV。 Bakshi我不能那樣做。最終我們會全部使用它。 :)因此,我們要處理它B) –

+0

@ CompaqLE2202x我仍然瞄準API 18,因爲我真的不喜歡所有新的;) –

相關問題