【发布时间】:2016-11-23 11:59:24
【问题描述】:
问题是相当基本的,但它仍然让我发疯:我怎样才能创建一个简单的文本文件到一个公开可见的目录,比如下载文件夹?我正在使用的 android 使用 android 版本 6.0.1,并且应用程序本身具有最低 sdk 级别 20。
我没有 sdcard,但据我所知,内部和外部这两个术语指的是目录的可见性和访问权限:如果只有应用程序可以看到文件,它就是内部的。如果用户看到该文件,它是外部的。
首先,我在 AnrdoidManifext.xml 中有所需的 uses-permission 标签,尽管在这个问题的上下文中我不需要读取权限。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mylittleapp">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application>
<!-- Not relevant... right? -->
</application>
</manifest>
然后是代码本身。您可以从调试日志中看出我对此感到有些沮丧。
public class LogFileWriter {
File mFile;
FileOutputStream mStream;
LogFileWriter(String filename) {
// Check if storage is available
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
Log.d("LogFileWriter", "I'm not your state buddy!");
return;
}
File target = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
if (!target.exists() && !target.mkdir()) {
Log.d("LogFileWriter", "I'm not your folder guy!");
return
}
mFile = new File(target, filename);
try {
if (!mFile.exists())
Log.d("LogFileWriter", "I'm not your file friend!");
else {
mStream = new FileOutputStream(mFile);
}
} catch (FileNotFoundException e) {
Log.d("LogFileWriter", "Exceptional!");
}
}
这里,程序在!mFile.exist() 检查失败并打印I'm not your file friend! 如果我要在那里添加mFile.createNewFile(),那将导致 IOException...
java.io.IOException: open failed: EACCES (Permission denied)
尽管程序应该有权访问公共目录!
我也尝试将文件写入Context.getExternalFilesDir() directry,但结果相同:我仍然没有写入权限。
我还检查了Environment.getExternalStoragePublicDirectory 指向的位置。它的路径是/storage/0/emulated/Download。
如何获得对外部存储的写权限?有什么想法吗?
【问题讨论】:
-
你试用的是哪个版本的Android,Android 6.0+以上必须在运行时提供权限
-
6.0.1,所以这可能是问题所在。我得去看看。
-
你必须设置运行时权限@TukeV
-
if (!mFile.exists()) Log.d("LogFileWriter", "I'm not your file friend!"); else { mStream = new FileOutputStream(mFile);。 ???您应该始终打开 FileOutputStream,尤其是当文件不存在时。