Hoje vou mostrar como acessar um servidor FTP, utilizando android vou criar uma classe client FTP completa com todas as funcionalidades que você irá precisar como por exemplo listar arquivos, excluir, mudar de diretório, mas no exemplo prático será apresentada a rotina para efetuar um download via FTP.
Como de costume vou apresentar todos os fontes utilizados já com comentários para facilitar no aprendizado.
Abaixo segue um print dos arquivos do projeto:
Abaixo segue o arquivo clsFTP.java
package 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 diretórios de um determinado caminho
public FTPFile[] Dir(String pDiretorio)
{
try {
FTPFile[] ftpFiles = mFtp.listFiles(pDiretorio);
return ftpFiles;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível listar os arquivos e pastas do diretório " + pDiretorio + ". " + e.getMessage());
}
return null;
}
//Pegar o nome do diretório corrente
public String DiretorioCorrente()
{
try {
String workingDir = mFtp.printWorkingDirectory();
return workingDir;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível obter o diretório atual. " + e.getMessage());
}
return null;
}
//Mudar de diretório
public boolean MudarDiretorio(String pDiretorio)
{
try {
mFtp.changeWorkingDirectory(pDiretorio);
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível mudar o diretório para " + pDiretorio);
}
return false;
}
//Criar um diretório
public boolean CriarDiretorio(String pDiretorio)
{
try {
boolean status = mFtp.makeDirectory(pDiretorio);
return status;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível criar o diretório " + pDiretorio);
}
return false;
}
//Excluir um diretório
public boolean RemoveDiretorio(String pDiretorio)
{
try {
boolean status = mFtp.removeDirectory(pDiretorio);
return status;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível remover o diretório " + 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: Não 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 diretório para o destino específico
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 conexão com o servidor FTP
public boolean Desconectar()
{
try {
//mFtp.logout();
mFtp.disconnect();
mFtp = null;
return true;
} catch (Exception e) {
Log.e(TAG, "Erro: ao desconectar. " + e.getMessage());
}
return false;
}
//Efetuar conexão com o servidor FTP
public boolean Conectar(String pHost, String pUsuario, String pSenha, int pPorta)
{
try {
mFtp = new FTPClient();
// conectando no host
mFtp.connect(pHost, pPorta);
//verifica se a conexão está ok
if (FTPReply.isPositiveCompletion(mFtp.getReplyCode())) {
//efetua login
boolean status = mFtp.login(pUsuario, pSenha);
mFtp.setFileType(FTP.BINARY_FILE_TYPE);
mFtp.enterLocalPassiveMode();
return status;
}
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível conectar ao host " + pHost);
}
return false;
}
}
Abaixo segue o arquivo TesteFTPActivity.java:
package br.com.EscolaDeAndroid.FTP;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.EditText;
import android.widget.Toast;
public class TesteFTPActivity extends Activity {
clsFTP mClienteFTP;
EditText editText;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText)findViewById(R.id.editText1);
String lstrArq = "";
try {
mClienteFTP = new clsFTP();
//Definindo o nome do arquivo que será gravado no SD
lstrArq = "/teste2.txt";
File lArquivo = new File(Environment.getExternalStorageDirectory(), lstrArq);
mClienteFTP.Conectar("ftp.seuendereco.com", "usuario", "senha", 21);
//Faz o download do arquivo passando o nome dele(dentro o servidor) e local onde ele vai ser guardado
mClienteFTP.Download("/nomedapasta", "teste.txt", lArquivo.toString());
//Desconecta do ftp
mClienteFTP.Desconectar();
//Efetua a leitura do arquivo
FileReader fileReader= new FileReader(lArquivo);
BufferedReader leitor= new BufferedReader(fileReader);
String linha = null;
//Loop para ler e carregar o editText
while((linha = leitor.readLine()) != null) {
editText.append(linha);
}
leitor.close();
fileReader.close();
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
Abaixo segue o arquivo AndroidManifest.xml, onde deveremos adicionar as permissões para acessar a internet e gravar no SD:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid.FTP"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".TesteFTPActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Abaixo segue o arquivo main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
Por enquanto é isso pessoal, espero que seja útil esse projeto para vocês, e caso necessitem, por exemplo, enviar um arquivo via FTP, dentro da classe clsFTP.java já possui esse e outros métodos.
Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.
Desenv com qualidade!

