-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() 返回“挂载”值。

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

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

编辑:我已经设法在三星 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 版本如何影响下载肯定会发生一些事情,我现在正在研究它。

4

2 回答 2

2

感谢大家的贡献,这个问题超出了我的想象,现在可以很容易地用谷歌搜索。

感谢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);
            }
        }
于 2016-10-15T15:30:39.860 回答
1

尝试替换:

`Environment.getExternalStorageDirectory().toString()`

`Environment.getExternalStorageDirectory().getAbsolutePath()`
于 2016-10-15T13:16:15.280 回答