无法在 Android 6.0 + 上保存下载的文件
Unable to save downloaded files on Android 6.0 +
我刚刚遇到了一个我自己似乎无法解决的问题。
此应用程序的一个关键要素是从 url 下载和存储文件,为此我使用 AsyncTask
的扩展名
这个文件最终保存到
Environment.getExternalStorageDirectory().toString() + "/" + fileName + ".xls")
然后创建一个文件:
File file = new File(Environment.getExternalStorageDirectory().toString() + "/" + fileName + ".xls");
并创建了一个流
InputStream is = new FileInputStream(file);
此时我得到一个 FileNotFoundException ENOENT:没有这样的文件或目录。
我在 AndroidManifest.xml 文件中设置了适当的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Environment.getExternalStorageState() returns "mounted" 值。
并且我可以确认已建立互联网连接,因为在我可以下载任何文件之前,我必须在应用程序中使用适当的凭据登录。
我正在为 API 16、Android 4.1 (Jelly Bean) 制作此应用。
任何帮助将不胜感激!
编辑:我已经设法在 Samsung SM-G800G(Android 5.1.1,API 22)上完成这项工作。但是该应用程序不会在我的 Nexus One(Android 6.0,API 23)或 SAMSUNG SM-G900F(Android 6.0.1,API 23)上 运行 ).
所以 Android 版本对下载的影响肯定有问题,我现在正在调查。
尝试替换:
`Environment.getExternalStorageDirectory().toString()`
和
`Environment.getExternalStorageDirectory().getAbsolutePath()`
感谢大家的贡献,这个问题出乎我的意料,现在可以很容易地用谷歌搜索。
感谢 MetaSnarf 的
问题确实与 Android 6.0+ (API 23+) 处理权限的方式有关。
将 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
放入 AndroidManifest.xml 文件 不足以让应用程序获得权限。我已通过在我的代码中添加以下块来修复它。
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
}
else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
我刚刚遇到了一个我自己似乎无法解决的问题。
此应用程序的一个关键要素是从 url 下载和存储文件,为此我使用 AsyncTask
这个文件最终保存到
Environment.getExternalStorageDirectory().toString() + "/" + fileName + ".xls")
然后创建一个文件:
File file = new File(Environment.getExternalStorageDirectory().toString() + "/" + fileName + ".xls");
并创建了一个流
InputStream is = new FileInputStream(file);
此时我得到一个 FileNotFoundException ENOENT:没有这样的文件或目录。
我在 AndroidManifest.xml 文件中设置了适当的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Environment.getExternalStorageState() returns "mounted" 值。
并且我可以确认已建立互联网连接,因为在我可以下载任何文件之前,我必须在应用程序中使用适当的凭据登录。
我正在为 API 16、Android 4.1 (Jelly Bean) 制作此应用。 任何帮助将不胜感激!
编辑:我已经设法在 Samsung SM-G800G(Android 5.1.1,API 22)上完成这项工作。但是该应用程序不会在我的 Nexus One(Android 6.0,API 23)或 SAMSUNG SM-G900F(Android 6.0.1,API 23)上 运行 ).
所以 Android 版本对下载的影响肯定有问题,我现在正在调查。
尝试替换:
`Environment.getExternalStorageDirectory().toString()`
和
`Environment.getExternalStorageDirectory().getAbsolutePath()`
感谢大家的贡献,这个问题出乎我的意料,现在可以很容易地用谷歌搜索。
感谢 MetaSnarf 的
问题确实与 Android 6.0+ (API 23+) 处理权限的方式有关。
将 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
放入 AndroidManifest.xml 文件 不足以让应用程序获得权限。我已通过在我的代码中添加以下块来修复它。
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
}
else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}