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
這是** **的另一個很好的理由要遠離API 23分開...;) –
@HrundiV。 Bakshi我不能那樣做。最終我們會全部使用它。 :)因此,我們要處理它B) –
@ CompaqLE2202x我仍然瞄準API 18,因爲我真的不喜歡所有新的;) –