2013-07-09 139 views
13

下面的代码包含从服务器下载文件并将其保存在存储器中,当设备具有内部存储器时可以正常工作。
但是,当我尝试与没有内部存储设备,只有外部存储我得到以下例外。
java.io.filenotfoundexception设备上打开失败的eacces(权限被拒绝)

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"/> 

我已经尝试了很多到目前为止,StackOverflow中的建议似乎没有任何效果。
任何建议可能是什么原因? 顺便说一下Environment.getExternalStorageDirectory()返回/mnt/sdcard/file.mkdir()返回false。

+1

尝试用'File file = new File(dir +“/”+ dlName);' –

+0

不幸的是结果是一样的。顺便说一句file.mkdir()返回false,多数民众赞成在我认为的问题。 @PankajKumar –

+0

如果您正在仿真器上进行调试,请确保您创建的sd卡支持..或者如果真实设备确保存在sd卡(设备未连接USB) –

回答

13

这个问题似乎是由几个因素造成的。

检查#1
首先在您的清单文件中添加此权限,并检查其是否工作:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<application> 
    ... 

</application> 

.....

检查#2:

如果您正在模拟器上运行,请检查属性以查看它是否具有SD卡。

检查#3:从设备

禁止文件传输到电脑。如果启用,该应用程序将无法访问SD卡。

检查#4:
如果仍无法正常工作,请尝试以下操作:

String dir = Environment.getExternalStorageDirectory().getAbsolutePath() 

对我来说,下面的工作:
的问题是,getExternalStorageDirectory返回到/ mnt/SD卡,而我需要的外部存储的实际路径是/ mnt/sdcard-ext,并且在android中没有API可以让我获得可移动SD卡的绝对路径。
我的解决方案是硬编码的目录如下:

String dir = "/mnt/sdcard-ext" ; 

由于应用程序的目的只有一个设备上,上面做了工作上班。
如果遇到同样的问题,请使用file explorer application找出外部目录的名称并对其进行硬编码。

+1

这是一个设备特定路径(如您所述)。例如:我在这里看到String dir =“/ mnt/sdcard”。 – hB0

+0

如果你想访问外部存储(或不是)所有Android手机的文件,你会建议什么? –

+0

我应该怎么做才能从答案中检查#2? – Hemang

10

使用READ_EXTERNAL_STORAGE许可从设备读取数据。

+1

感谢您的建议,但不幸的是它不能解决问题。 –

+15

“任何声明WRITE_EXTERNAL_STORAGE权限的应用程序都被隐式授予此权限。” http://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE –

+0

非常感谢。我没有读过! –

6

你在模拟器上试过吗?检查属性是否有SD卡。我有同样的问题,这是因为模拟器没有SD卡。检查你的是否有。

+3

Facepalm。谢谢:) –

+0

是的,我试图在模拟器上。在哪里检查你所指的属性? – Hemang

4

我有同样的问题,我通过禁用从设备到计算机的文件传输来解决它。 因为如果您启用文件传输,sd卡无法访问调试应用程序。

+0

谢谢,这是我的情况。 – Lev

+1

OMG它解决了我的问题,但3小时内没有进行调试 –

3
try 
Environment.getExternalStorageDirectory().getAbsolutePath() 

,不要忘了加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
1

尝试使用mkdirs代替的mkdir。如果你正在创建一个目录路径并且父目录不存在,那么你应该使用mkdirs。

0

我有同样的问题。我正确使用了清单中的写入和读取权限,但它不起作用!解决方案非常愚蠢:在运行应用程序之前,先将您的手机从PC上拔下。看起来,当您的手机作为“大容量存储器”连接到PC时,应用程序无法访问外部存储器。

相关问题