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,因为我真的不喜欢所有新的;) –

相关问题