无法在Android 6.0 +上保存下载的文件

时间:2016-10-15 13:13:53

标签: android android-asynctask android-external-storage enoent

我刚刚遇到一个我自己似乎无法解决的问题。

此应用程序的一个关键元素是从网址下载和存储文件,我正在使用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()返回“已挂载”值。

我可以确认互联网连接已经建立,就像之前我可以下载任何文件一样,我必须在应用程序中使用适当的凭据登录。

我正在为API 16,Android 4.1(Jelly Bean)制作这个应用程序。 任何帮助将不胜感激!

编辑:我已经设法让这项工作在三星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版本对下载的影响肯定存在,我现在正在研究它。

2 个答案:

答案 0 :(得分:2)

感谢大家的贡献,这个问题比我想象的还要多,现在可以很容易地用Google搜索。

感谢MetaSnarf的this post

问题确实与Android 6.0+(API 23+)处理权限的方式有关。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />放入 AndroidManifest.xml文件 NOT ENOUGH ,以便应用程序获取权限。我已经通过在我的代码中添加以下块来修复它。

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);
            }
        }

答案 1 :(得分:1)

尝试替换:

`Environment.getExternalStorageDirectory().toString()`

`Environment.getExternalStorageDirectory().getAbsolutePath()`