Android скачать каталог с ошибкой FTP

У меня есть музыкальный проигрыватель, который загружает каталог с FTP-сервера на SD-карту. И проигрыватель загружает и принимает настройки сервера (есть две версии ME и CE), но это происходит после сбоя загрузки приложения. Когда я удаляю некоторые папки после загрузки, он нормально работает в режиме ME, но когда я загружаю его, он работает в режиме CE все время, когда происходит сбой приложения.

public class FTPManager {

    public static final String LOG_TAG = FTPManager.class.getName();
    private static final String HOST = "*******";
    private static final String LOGIN = "*******";
    private static final String PASSWORD = "*******";
    private static final int REPEAT_TIMEOUT_MILLIS = 5 * 1000;

    private int mCommandAttempts;

    private String host;
    private String login;
    private String password;
    private FTPClient mFtpClient;

    private FTPManager(String host, String login, String password) {
        this.host = host;
        this.login = login;
        this.password = password;
        mFtpClient = new FTPClient();
    }

    public FTPManager() {
        this(HOST, LOGIN, PASSWORD);
    }

    public boolean connect() {
        mCommandAttempts = 5;
        return attemptConnect();
    }

    private boolean attemptConnect() {
        try {
            mFtpClient.connect(host);
            mFtpClient.login(this.login, password);
            mFtpClient.setPassive(true);
        } catch (Exception e) {
            Log.e(LOG_TAG, e.toString());
            try {
                TimeUnit.MILLISECONDS.sleep(REPEAT_TIMEOUT_MILLIS);
            } catch (InterruptedException e1) {
                Log.e(LOG_TAG, e.toString());
                return false;
            }
            mCommandAttempts--;
            if (mCommandAttempts > 0) {
                return attemptConnect();
            }
        }
        return true;
    }

    public List<String> listFiles() {
        return listFiles(FTPFile.TYPE_FILE);
    }

    public List<String> listDirectores() {
        return listFiles(FTPFile.TYPE_DIRECTORY);
    }

    private List<String> listFiles(int type) {
        mCommandAttempts = 5;
        return attemptListFiles(type);
    }

    private List<String> attemptListFiles(int type) {
        ArrayList<String> names = new ArrayList<>();
        try {
            FTPFile[] files = mFtpClient.list();
            for (FTPFile file : files) {
                if (file.getType() == type) {
                    names.add(file.getName());
                }
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, e.toString());
            try {
                TimeUnit.MILLISECONDS.sleep(REPEAT_TIMEOUT_MILLIS);
            } catch (InterruptedException e1) {
                Log.e(LOG_TAG, e.toString());
                return names;
            }
            mCommandAttempts--;
            if (mCommandAttempts > 0) {
                return attemptListFiles(type);
            }
        }
        return names;
    }

    public boolean downloadFile(OutputStream outputStream, String ftpName) {
        mCommandAttempts = 5;
        return attemptDownloadFile(outputStream, ftpName);
    }


    private boolean attemptDownloadFile(OutputStream outputStream, String ftpName) {
        try {
            mFtpClient.download(ftpName, outputStream, 0, null);
            return true;
        } catch (Exception e) {
            Log.e(LOG_TAG, e.toString());
            try {
                TimeUnit.MILLISECONDS.sleep(REPEAT_TIMEOUT_MILLIS);
            } catch (InterruptedException e1) {
                Log.e(LOG_TAG, e.toString());
                return false;
            }
            mCommandAttempts--;
            if (mCommandAttempts > 0) {
                return attemptDownloadFile(outputStream, ftpName);
            }
        }
        return false;
    }

    public boolean changeDirectory(String path) {
        mCommandAttempts = 5;
        return attemptChangeDirectory(path);
    }

    private boolean attemptChangeDirectory(String path) {
        try {
            mFtpClient.changeDirectory(path);
            return true;
        } catch (Exception e) {
            Log.e(LOG_TAG, e.toString());
            try {
                TimeUnit.MILLISECONDS.sleep(REPEAT_TIMEOUT_MILLIS);
            } catch (InterruptedException e1) {
                Log.e(LOG_TAG, e.toString());
                return false;
            }
            mCommandAttempts--;
            if (mCommandAttempts > 0) {
                return attemptChangeDirectory(path);
            }
        }
        return false;
    }

    public boolean release() {
        if (mFtpClient != null) try {
            mFtpClient.logout();
            mFtpClient.disconnect(true);
            mFtpClient = null;
            return true;
        } catch (Exception e) {
            Log.e(LOG_TAG, e.toString());
            return false;
        }
        return false;
    }


}

А также

public class FTPDirectory implements Parcelable {

    private StringBuilder builder;

    public FTPDirectory(String host) {
        builder = new StringBuilder(host);
    }

    protected FTPDirectory(Parcel in) {
        builder = new StringBuilder(in.readString());
    }

    public static final Creator<FTPDirectory> CREATOR = new Creator<FTPDirectory>() {
        @Override
        public FTPDirectory createFromParcel(Parcel in) {
            return new FTPDirectory(in);
        }

        @Override
        public FTPDirectory[] newArray(int size) {
            return new FTPDirectory[size];
        }
    };

    public FTPDirectory append(String path) {
        builder.append("/").append(path);
        return this;
    }

    public String getPath() {
        return builder.toString();
    }

    public static FTPDirectory getImgDirectory() {
        return new FTPDirectory("/img");
    }

    public static FTPDirectory getAdDirectory() {
        return new FTPDirectory("/adv");
    }

    public static FTPDirectory getMusicDirectory() {
        return new FTPDirectory("/music");
    }


    public static FTPDirectory getChannelDirectory(String channel, int index) {
        return getChannelRootDirectory(channel)
                .append(Integer.toString(index));
    }

    public static FTPDirectory getChannelRootDirectory(String channel) {
        return getMusicDirectory()
                .append(channel);
    }

    @Override
    public String toString() {
        return "FTPDirectory{" +
                "Path=" + builder.toString() +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getPath());
    }
}

Я думаю, что где-то здесь может быть ошибка. Получается, что один файл читает, а другой нет, но формат тот же. Пожалуйста, помогите решить проблему.

0 ответов

Другие вопросы по тегам