Ola pessoal,Hoje vou mostrar como acessar um servidor FTP, utilizando android vou criar uma classe client FTP completa com todas as funcionalidades que voce ira precisar como por exemplo listar arquivos, excluir, mudar de diretorio, mas no exemplo pratico sera apresentada a rotina para efetuar um download via FTP.Como de costume vou apresentar todos os fontes utilizados ja com comentarios para facilitar no aprendizado.Abaixo segue um print dos arquivos do projeto:Abaixo segue o arquivo clsFTP.javapackage br.com.EscolaDeAndroid.FTP;import java.io.FileInputStream;import java.io.FileOutputStream;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import android.util.Log;public class clsFTP { FTPClient mFtp; private String TAG = "clsFTP"; //Listar os arquivos e diretorios de um determinado caminho public FTPFile[] Dir(String pDiretorio) { try { FTPFile[] ftpFiles = mFtp.listFiles(pDiretorio); return ftpFiles; } catch(Exception e) { Log.e(TAG, "Erro: nao foi possivel listar os arquivos e pastas do diretorio " + pDiretorio + ". " + e.getMessage()); } return null; } //Pegar o nome do diretorio corrente public String DiretorioCorrente() { try { String workingDir = mFtp.printWorkingDirectory(); return workingDir; } catch(Exception e) { Log.e(TAG, "Erro: nao foi possivel obter o diretorio atual. " + e.getMessage()); } return null; } //Mudar de diretorio public boolean MudarDiretorio(String pDiretorio) { try { mFtp.changeWorkingDirectory(pDiretorio); } catch(Exception e) { Log.e(TAG, "Erro: nao foi possivel mudar o diretorio para " + pDiretorio); } return false; } //Criar um diretorio public boolean CriarDiretorio(String pDiretorio) { try { boolean status = mFtp.makeDirectory(pDiretorio); return status; } catch(Exception e) { Log.e(TAG, "Erro: nao foi possivel criar o diretorio " + pDiretorio); } return false; } //Excluir um diretorio public boolean RemoveDiretorio(String pDiretorio) { try { boolean status = mFtp.removeDirectory(pDiretorio); return status; } catch(Exception e) { Log.e(TAG, "Erro: nao foi possivel remover o diretorio " + pDiretorio); } return false; } //Deletar arquivo public boolean Delete(String pArquivo) { try { boolean status = mFtp.deleteFile(pArquivo); return status; } catch (Exception e) { e.printStackTrace(); } return false; } //Renomear arquivo public boolean Rename(String from, String to) { try { boolean status = mFtp.rename(from, to); return status; } catch (Exception e) { Log.e(TAG, "Erro: Nao pode renomear o arquivo: " + from + " para: " + to); } return false; } //Baixar um arquivo do servidor FTP public boolean Download(String pDiretorioOrigem, String pArqOrigem, String pArqDestino) { boolean status = false; try { MudarDiretorio(pDiretorioOrigem); //Cria o outputStream para ser passado como parametro FileOutputStream desFileStream = new FileOutputStream(pArqDestino);; //Tipo de arquivo mFtp.setFileType(FTP.BINARY_FILE_TYPE); //http://commons.apache.org/net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalActiveMode() mFtp.enterLocalPassiveMode(); //Faz o download do arquivo status = mFtp.retrieveFile(pArqOrigem, desFileStream); //Fecho o output desFileStream.close(); return status; } catch (Exception e) { Log.e(TAG, "Erro: Falha ao efetuar download. " + e.getMessage()); } return status; } //Enviar arquivo para o servidor FTP public boolean Upload(String pArqOrigem, String pArqDestino, String pDiretorioDestino) { boolean status = false; try { FileInputStream srcFileStream = new FileInputStream(pArqOrigem); //muda o diretorio para o destino especifico if (MudarDiretorio(pDiretorioDestino)) { status = mFtp.storeFile(pArqDestino, srcFileStream); } srcFileStream.close(); return status; } catch (Exception e) { Log.e(TAG, "Erro: Falha ao efetuar Upload. " + e.getMessage()); } return status; } //Encerrar a conexao com o servidor FTP public boolean Desconectar() { try { //mFtp.logout(); mFtp.disconnect(); mFtp = null; return true; } catch (Exception e) { Log.e(TAG,