Пишу приложения в 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();
}
};});}}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Давно хотелось написать приложение на Android, в котором будут составы футбольных команд топ лигПри нажатии на эмблему клуба должен открываться...
Здравствуйте, интересует как можно создать подкласс ListHistory в Person, без сеттеров и передачи уже готового ListHistory
Столкнулся с такой проблемойКак вывести данные на экран в поле jtextArea? JtextArea описан в одном классе, данные для вывода получаются из другого...
Я сделал клиент по обмену сообщениями, в котором сообщения отображаются при помощи recyclerView, но список открывается в самом начале(наверху),...