Где ошибка? Java-Android - Программирование Android

321
05 апреля 2018, 15:06

Пишу приложения в Android Studio! Суть приложения: На ftp сервере есть папка, назовем ее «Файлы», в ней есть есть еще три папки: «Папка1», «Папка2», «Папка3», в которых находятся еще какие-то папки и файлы. Где-то на Android устройстве (или на SD или во внутренней памяти) есть папка, допустим «datafiles» (она одна на устройстве), и в ней находятся точно такие же три папки: «Папка1», «Папка2», «Папка3», но содержимое отличается (некоторое совпадает). Действие приложения: На экране одна кнопка "Скачать файлы", при нажатии на которую приложение находит на устройстве папку «datafiles» и копирует в нее (с заменой и добавлением), содержимое папки «Файлы» с ftp сервера, то есть: «Папка1», «Папка2», «Папка3». Визуализирует это Progressbar и TextView(состояния в процентах), и сообщением об удачном завершении, или ошибкой, если что-то пошло не так. Я нашел в интернете библиотеку commons-net-3.3.jar и с помощью этой библиотеки пробовал написать даное приложения. Но только я компилирую и с Android устройства запускаю приложения после чего нажимаю кнопку "Скачать файлы" то приложения вылетает! Что я делаю не так??? Я думаю что я где-то в коде ошибся, и скорее всего это "где-то" там где я писал поиск папки на устройстве! Вот файлы: AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ivan.ftpfiledownloader">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ivan.ftpfiledownloader.MainActivity">
<Button
    android:id="@+id/button"
    android:layout_width="194dp"
    android:layout_height="122dp"
    android:layout_marginBottom="27dp"
    android:layout_marginTop="112dp"
    android:text="Скачать файлы"
    android:textColor="@android:color/holo_blue_dark"
    android:textSize="18sp"
    app:layout_constraintBottom_toTopOf="@+id/progressBar"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:ignore="MissingConstraints" />
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="300sp"
    android:layout_height="40sp"
    android:layout_marginBottom="19dp"
    android:layout_marginEnd="25dp"
    android:layout_marginStart="25dp"
    android:visibility="invisible"
    app:layout_constraintBottom_toTopOf="@+id/textView2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button"
    tools:ignore="MissingConstraints"
    tools:visibility="invisible" />
<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="157dp"
    android:textSize="20sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/progressBar"
    app:layout_constraintStart_toStartOf="@+id/progressBar"
    app:layout_constraintTop_toBottomOf="@+id/progressBar"
    tools:ignore="MissingConstraints" />
     </android.support.constraint.ConstraintLayout>

И MainActivity.java:

package com.ivan.ftpfiledownloader;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class MainActivity extends AppCompatActivity {
private static String path=null;
public static float procentuku=0;
static void GetFoldersPath(String folder, String path1){
    File tmp=new File(path1);
    for (File file :tmp.listFiles()) {
        if (file.isDirectory()){
            String a=file.getName();
            if(folder.equals(a)){
                folder = file.getPath().toString();
                path=folder;
                return;
            }
            else{
                GetFoldersPath(folder,file.getPath().toString()+"/"+a);
            }
        }
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btn1;
    final ProgressBar bar;
    final TextView procentu;
    bar=(ProgressBar) findViewById(R.id.progressBar);
    procentu=(TextView) findViewById(R.id.textView2);
    btn1=(Button) findViewById(R.id.button);
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            long size=0;
            bar.setVisibility(View.VISIBLE);
            procentu.setVisibility(View.VISIBLE);
            String address, username, password, road, papka;
            int port;
            address="ftp.example.com";//Вместо 127.0.0.1 в кавычках введите адрес или ftp.*.*
            port=43;//Вместо 27 введите порт
            username="progerum";//Вместо  root в кавычках введите свой username
            password="file1234";//Вместо  12345 в кавычках введите свой пароль
            road="/example/test";//Вместо /files/datafiles в кавычках введите путь к папке(на FTP сервере)
            papka="folder";//Вместо folder в кавычках введите названия папки
            for (File file3 : Environment.getExternalStorageDirectory().listFiles()) {
                if(file3.isDirectory()){
                    if(file3.getName().equals(papka)){
                        path=file3.getPath().toString();
                    }
                    else{
                        GetFoldersPath(papka, file3.getPath());
                        if(path!=null){
                            break;
                        }}
                }}
            if(path==null){
                File file5=new File("/");
                for (File file4 : file5.listFiles()) {
                    if(file4.getName().equals(papka)){
                        path=file4.getPath().toString();
                    }
                    else{
                        GetFoldersPath(papka, file4.getPath());
                        if(path!=null){
                            break;
                        }
                    }
                }}
            if(path!=null){
                FTPClient ftpClient=new FTPClient();
                try {
                    procentu.setVisibility(View.VISIBLE);
                    bar.setVisibility(View.VISIBLE);
                    ftpClient.connect(address, port);
                    ftpClient.login(username, password);
                    ftpClient.enterRemotePassiveMode();
                    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                    ftpClient.changeWorkingDirectory(road);
                    FTPFile[] files = ftpClient.listFiles();
                    for(int i=0;i<files.length;i++){
                        size+=files[i].getSize();
                    }
                    for(FTPFile ftpFile : files){
                        if(procentuku<100){
                            if(ftpFile.getType()==FTPFile.DIRECTORY_TYPE){
                                ftpClient.changeWorkingDirectory(road+"/"+ftpFile.getName());
                                FTPFile[] temp=ftpClient.listFiles();
                                for(FTPFile ftpFile1 : temp){
                                    String nameFile = ftpFile1.getName();
                                    String tmppath=ftpClient.printWorkingDirectory().toString();
                                    String remoteFile1 = tmppath+"/" + nameFile;
                                    File downloadFile1 = new File(path+ "/"+nameFile);
                                    OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
                                    boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
                                    if(success){
                                        procentuku=(ftpFile1.getSize()/size)*100;
                                        procentuku+=new BigDecimal(procentuku).setScale(2, RoundingMode.UP).doubleValue();
                                        procentu.setText("Скачано: "+procentuku+"%");
                                        bar.setProgress((int)(procentuku));
                                    }
                                    else{
                                        ftpClient.disconnect();
                                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                                        builder.setTitle("Ошибка!")
                                                .setMessage("Не удалось скачать файл!")
                                                .setIcon(R.drawable.ic_error)
                                                .setCancelable(false)
                                                .setNegativeButton("ОК",
                                                        new DialogInterface.OnClickListener() {
                                                            public void onClick(DialogInterface dialog, int id) {
                                                                dialog.cancel();
                                                            }
                                                        });
                                        AlertDialog alert = builder.create();
                                        alert.show();
                                        break;
                                    }
                                    outputStream1.close();
                                    ftpClient.changeWorkingDirectory(tmppath);
                                }
                            }
                            else if(ftpFile.getType()==FTPFile.FILE_TYPE){
                                String nameFile = ftpFile.getName();
                                String tmppath=ftpClient.printWorkingDirectory().toString();
                                String remoteFile1 = tmppath+"/" + nameFile;
                                File downloadFile1 = new File(path+ "/"+nameFile);
                                OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
                                boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
                                if(success){
                                    procentuku=(ftpFile.getSize()/size)*100;
                                    procentuku+=new BigDecimal(procentuku).setScale(2, RoundingMode.UP).doubleValue();
                                    procentu.setText("Скачано: "+procentuku+"%");
                                }
                                else{
                                    ftpClient.disconnect();
                                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                                    builder.setTitle("Ошибка!")
                                            .setMessage("Не удалось скачать файл!")
                                            .setIcon(R.drawable.ic_error)
                                            .setCancelable(false)
                                            .setNegativeButton("ОК",
                                                    new DialogInterface.OnClickListener() {
                                                        public void onClick(DialogInterface dialog, int id) {
                                                            dialog.cancel();
                                                        }
                                                    });
                                    AlertDialog alert = builder.create();
                                    alert.show();
                                    break;
                                }
                                outputStream1.close();
                                ftpClient.changeWorkingDirectory(tmppath);
                            }}
                        else {
                            bar.setVisibility(View.INVISIBLE);
                            procentu.setVisibility(View.INVISIBLE);
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setTitle("Успех!")
                                    .setMessage("Скачивание файлов прошло успешно!")
                                    .setIcon(R.drawable.ok)
                                    .setCancelable(false)
                                    .setNegativeButton("ОК",
                                            new DialogInterface.OnClickListener() {
                                                public void onClick(DialogInterface dialog, int id) {
                                                    dialog.cancel();
                                                }
                                            });
                            AlertDialog alert = builder.create();
                            alert.show();
                        }
                    }
                }
                catch (IOException e) {
                    e.printStackTrace();
                }}
            else{
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Ошибка!")
                        .setMessage("Не удалось найти папку!")
                        .setIcon(R.drawable.ic_error)
                        .setCancelable(false)
                        .setNegativeButton("ОК",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                AlertDialog alert = builder.create();
                alert.show();
            }
        };});}}
READ ALSO
Структура приложения. С чего начать и какие технологии использовать?

Структура приложения. С чего начать и какие технологии использовать?

Давно хотелось написать приложение на Android, в котором будут составы футбольных команд топ лигПри нажатии на эмблему клуба должен открываться...

227
GSON Десериализация, создание подкласса

GSON Десериализация, создание подкласса

Здравствуйте, интересует как можно создать подкласс ListHistory в Person, без сеттеров и передачи уже готового ListHistory

245
JtextArea для вывода результата

JtextArea для вывода результата

Столкнулся с такой проблемойКак вывести данные на экран в поле jtextArea? JtextArea описан в одном классе, данные для вывода получаются из другого...

170
Как сделать открытие recyclerView с конца?

Как сделать открытие recyclerView с конца?

Я сделал клиент по обмену сообщениями, в котором сообщения отображаются при помощи recyclerView, но список открывается в самом начале(наверху),...

189