以下代码包括从服务器下载文件并将其保存在存储中,当设备具有内部存储时,该代码可正常工作。
但是当我使用没有内部存储的设备尝试它时,只有外部存储器才会出现以下异常。
java.io.filenotfoundexception打开失败的eacces(权限被拒绝)
public void downloadFile(String dlUrl, String dlName) {
int count;
HttpURLConnection con = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URL url = new URL( dlUrl );
con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.connect();
is = url.openStream();
String dir = Environment.getExternalStorageDirectory() + Util.DL_DIRECTORY;
File file = new File( dir );
if( !file.exists() ){
file.mkdir();
}
Util.LOG_W(TAG, "Downloading: " + dlName + " ...");
fos = new FileOutputStream(file + "/" + dlName);
byte data[] = new byte[1024];
while( (count = is.read(data)) != -1 ){
fos.write(data, 0, count);
}
Util.LOG_D(TAG, dlName + " Download Complete!");
} catch (Exception e) {
Util.LOG_E(TAG, "DOWNLOAD ERROR = " + e.toString() );
bServiceDownloading = false;
}
finally{
try {
if( is != null)
is.close();
if( fos != null)
fos.close();
if( con != null)
con.disconnect();
} catch (Exception e) {
Util.LOG_E(TAG, "CLOSE ERROR = " + e.toString() );
}
}
}
在清单文件中,我有以下内容:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
任何建议可能是什么原因? 顺便说一句 Environment.getExternalStorageDirectory()返回 / mnt / sdcard / , file.mkdir()返回false。
答案 0 :(得分:14)
这个问题似乎是由几个因素造成的。
检查#1
强>
首先在清单文件中添加此权限,并检查它是否正常工作:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
...
</application>
.....
检查#2:强>
如果您在模拟器上运行,请检查属性以查看它是否具有SD卡。
检查#3:强>
禁用从设备到计算机的文件传输。如果启用,则应用程序将无法访问SD卡。
检查#4:
强>
如果仍然无法正常工作,请尝试以下操作:
String dir = Environment.getExternalStorageDirectory().getAbsolutePath()
对我来说,以下是有效的:
问题是getExternalStorageDirectory返回/ mnt / sdcard而我需要外部存储的实际路径,即/ mnt / sdcard-ext,并且android中没有API可以获得可移动SD卡的绝对路径。
我的解决方案是对目录进行硬编码,如下所示:
String dir = "/mnt/sdcard-ext" ;
由于该应用程序仅适用于一台设备,因此上述工作完成了这项工作
如果您遇到同样的问题,请使用file explorer application查找外部目录的名称并对其进行硬编码。
答案 1 :(得分:10)
使用READ_EXTERNAL_STORAGE
权限从设备读取数据。
答案 2 :(得分:6)
你在模拟器上试过吗?如果有SD卡,请检查属性。我有同样的问题,这是因为模拟器没有SD卡。检查你的是否有。
答案 3 :(得分:4)
我遇到了同样的问题,我通过禁用从设备到计算机的文件传输解决了这个问题。 因为如果你启用文件传输,调试应用程序无法访问SD卡。
答案 4 :(得分:3)
try
Environment.getExternalStorageDirectory().getAbsolutePath()
并且不要忘记添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 5 :(得分:2)
我怀疑您运行的是Android 6.0 Marshmallow(API 23)或更高版本。如果是这种情况,则必须在尝试读取/写入外部存储之前实现运行时权限。 https://developer.android.com/training/permissions/requesting.html
答案 6 :(得分:2)
在定向到应用程序时,默认情况下此属性为“ false” Android 10或更高版本。
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
答案 7 :(得分:1)
尝试使用mkdirs而不是mkdir。如果您正在创建目录路径且父级不存在,那么您应该使用mkdirs。
答案 8 :(得分:0)
我遇到了同样的问题。我正确地使用了清单中的写入和读取权限,但它没有用!解决方案非常愚蠢:在运行应用程序之前从PC上拔下手机。当您的手机作为“大容量存储”连接到PC时,应用程序无法访问外部存储。
答案 9 :(得分:0)
我犯了非常愚蠢的错误。 我已经放入了AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
并在java文件中添加权限,如实际获得权限。 但是有Manifest.permission.READ_EXTERNAL_STORAGE错误。 请使用 Manifest.permission.WRITE_EXTERNAL_STORAGE 。
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
答案 10 :(得分:0)
该设备可能需要您手动授予手机权限,检查设备并检查是否在设备上激活了写权限。