[英]open failed: EACCES (Permission denied) from IoBridge.java in AsyncTask
我正在尝试通过FTP下载文件。 基本上,我正在使用活动的两个选项卡片段。 RemoteTabFragment和LocalTabFragment。
在LocalTabFragment中,我正在下载目录中列出文件。 在RemoteTabFragment中,我列出了远程文件,并且可以选择将远程文件下载到本地下载目录。
对于FTP操作,我使用的是AsyncTask。这是AsyncTask的doInBackground函数:
protected FTPClient doInBackground(Void... args) {
Log.d("siteobj", site.toString());
try {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(site.get("host"));
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.login(site.get("login_name"), site.get("password"));
performTask(ftpClient);
String reply = ftpClient.getReplyString();
if (ftpClient.getReplyString().contains("250")) {
message = "Files loaded";
} else {
message = reply;
}
} catch (Exception e) {
exception = e;
}
return ftpClient;
}
这是doInBackground()方法中使用的performTask方法。这里我只是将下载代码粘贴到performTask方法中。
private FTPClient performTask (FTPClient ftpClient) {
if(path == null) {
path = "/";
}
try {
switch (task) {
case "download":
ftpClient.changeWorkingDirectory(path);
String filename = args.getString("filename");
String localPath = args.getString("localPath");
File localDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsoluteFile(), filename);
//File file = new File(localDir, filename);
Log.d("localDir", localDir.getPath());
OutputStream outputStream = new FileOutputStream(localDir);
Log.d("output stream", outputStream.toString());
Boolean success = ftpClient.retrieveFile (filename, outputStream);
workingDirectory = ftpClient.printWorkingDirectory();
Log.d("working directory", workingDirectory);
break;
default:
files = ftpClient.listFiles("/");
}
} catch (IOException ex){
ex.printStackTrace();
//Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
}
return ftpClient;
}
因此,在执行以下语句时: OutputStream outputStream = new FileOutputStream(localDir);
它给出了错误,实际上是异常,下面是异常的确切堆栈跟踪。
12-21 04:13:29.132 412-2013/com.hafiz.ftp W/System.err﹕ java.io.FileNotFoundException: /mnt/sdcard/Download/5021.shtml: open failed: EACCES (Permission denied)
12-21 04:13:29.152 412-2013/com.hafiz.ftp W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:406)
12-21 04:13:29.172 412-2013/com.hafiz.ftp W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
12-21 04:13:29.172 412-2013/com.hafiz.ftp W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
12-21 04:13:29.192 412-2013/com.hafiz.ftp W/System.err﹕ at com.hafiz.ftp.FtpTask.performTask(FTPTask.java:119)
12-21 04:13:29.192 412-2013/com.hafiz.ftp W/System.err﹕ at com.hafiz.ftp.FtpTask.doInBackground(FTPTask.java:72)
12-21 04:13:29.202 412-2013/com.hafiz.ftp W/System.err﹕ at com.hafiz.ftp.FtpTask.doInBackground(FTPTask.java:26)
12-21 04:13:29.212 412-2013/com.hafiz.ftp W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-21 04:13:29.223 412-2013/com.hafiz.ftp W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-21 04:13:29.232 412-2013/com.hafiz.ftp W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-21 04:13:29.242 412-2013/com.hafiz.ftp W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-21 04:13:29.242 412-2013/com.hafiz.ftp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-21 04:13:29.252 412-2013/com.hafiz.ftp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-21 04:13:29.262 412-2013/com.hafiz.ftp W/System.err﹕ at java.lang.Thread.run(Thread.java:856)
12-21 04:13:29.272 412-2013/com.hafiz.ftp W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
12-21 04:13:29.322 412-2013/com.hafiz.ftp W/System.err﹕ at libcore.io.Posix.open(Native Method)
12-21 04:13:29.612 412-418/com.hafiz.ftp D/dalvikvm﹕ GC_CONCURRENT freed 2295K, 21% free 9538K/11975K, paused 12ms+28ms
12-21 04:13:29.712 412-2013/com.hafiz.ftp W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
12-21 04:13:30.002 412-2013/com.hafiz.ftp W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:390)
12-21 04:13:30.172 412-2013/com.hafiz.ftp W/System.err﹕ ... 12 more
你们能告诉我原因是什么吗? 那是因为我正在使用OutputStream outputStream = new FileOutputStream(localDir);
在doInBackground()方法中? 我试图在AsyncTask之外创建FileOutputStream,并发送给class的公共变量。 但是我仍然面临着同样的问题。 另外,如果我需要在AsyncTask之外使用此方法,请告诉我如何使用它,而我的目的是从FTP下载文件并在那里上传。
我在清单文件中的权限和设置是:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hafiz.ftp" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:debuggable="true"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".TabActivity"
android:label="@string/title_activity_tab" >
</activity>
</application>
</manifest>
请让我知道您认为我做错了什么导致了该异常。 让我知道您是否知道实现此目标的更好方法。 如果您认为缺少某些内容,请随时询问,以获取更好的答案。
请注意,我发现了许多类似的问题,但是其中许多问题的答案不同,所以我想通过问这个问题来了解自己在做错什么。 因此,请不要仅通过指向其他解决方案的重定向,也请在此处说明。
这是一个错误:
<uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/>
您需要小写的android.permission
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.