打开失败:在AsyncTask的EACCES(拒绝)从IoBridge.java [英] open failed: EACCES (Permission denied) from IoBridge.java in AsyncTask

查看:1045
本文介绍了打开失败:在AsyncTask的EACCES(拒绝)从IoBridge.java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过FTP下载文件。基本上,我使用的是活动的两个标签片段。 RemoteTabFragment和LocalTabFragment。

I am trying to download a file through FTP. Basically I am using two tabs fragment of an activity. RemoteTabFragment and LocalTabFragment.

在LocalTabFragment,我在我的下载目录列表文件。而在RemoteTabFragment,我列出远程文件并没有选择远程文件下载到本地下载目录。

In LocalTabFragment, I am listing file in my Download directory. While in RemoteTabFragment, I am listing remote files and there is option to download remote file to local download directory.

有关我使用AsyncTask.Here FTP操作是的AsyncTask的doInBackground功能:

For FTP operations I am using AsyncTask.Here is doInBackground function of AsyncTask:

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()method.Here用我只粘贴下载code在performTask方法performTask方法。

And here is performTask method used in doInBackground() method.Here I am only pasting download code in performTask method.

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 =新的FileOutputStream(LOCALDIR); 它给的错误,其实例外,以下是详细的异常堆栈跟踪

So when executing this statement: OutputStream outputStream = new FileOutputStream(localDir); It give error, actually exception and following is exact Stack Trace of exception.

    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 =新的FileOutputStream(LOCALDIR); 在doInBackground()方法?我试过的AsyncTask之外创建的FileOutputStream和类的公共变量发送。但我仍面临着同样的问题。另外,如果我需要的AsyncTask外使用此方法,然后让我知道我可以使用,而我的目的是从FTP下载文件并上传那里。

So can you guys tell what can be reason for that? Is that because I am using OutputStream outputStream = new FileOutputStream(localDir); in doInBackground() method? I tried to create FileOutputStream outside of AsyncTask and sent in a public variable of class. But still I faced same problem. Also if I need to use this method outside of AsyncTask then let me know how can i use that while my purpose is to download file from FTP and upload there.

我在Android清单文件权限和设置是:

My permissions and settings in android manifest file are:

<?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>

请让我知道你在想什么我在做什么,这是造成该异常错误。让我知道如果你知道更好的方式来完成相同的。还随时问,如果你觉得缺了点什么,我需要告诉得到更好的答案。

Please let me know what you think i am doing wrong which is causing that exception. Let me know if you know better way to accomplish same. Also feel free to ask, if you think something is missing that I need to tell to get better answer.

请注意,我发现了很多类似的问题,但他们中许多人differet的答案,所以我想知道我做错了问这个问题。所以,请不要只是点重定向到一些其他的解决方案,但也告诉在这里。

Please note that I found many similar questions but many of them have differet answers so I want to know what I am doing wrong by asking this question. So please dont just redirect by point to some other solution but also tell here.

推荐答案

下面是错误的:

    <uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/>

您需要小写 android.permission

这篇关于打开失败:在AsyncTask的EACCES(拒绝)从IoBridge.java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆