M4V3RICK WAS HERE ! #RedEyeCrew
Este artigo irá auxiliar no envio e recebimento de imagens via webservice utilizando json.
Para tal funcionalidade, iremos utilizar o Base64, que é uma forma de enviar arquivos binários por meios de transmissão que só lidam com texto. Para mais informações acesse:
http://developer.android.com/reference/android/util/Base64.html
A documentação oficial para base64 codificação e decodificação pode ser encontrado no Android dentro do pacote Android.uitl.package.
Mas geralmente você não costuma encontra-lo para ser utilizado. Para resolver tal situação, Robert W. Harder criou uma classe bem mais completa sobre o Base64 quer você pode utilizar em seus projetos.
Para fazer o download da classe, visite o site do Roberthttp://iharder.sourceforge.net/current/index.html e faça do download do arquivo.
Depois de feito o download, copie a classe para dentro de seu projeto e pronto, você já poderá utilizar os métodos da classe.
Depois de conseguir acessar o Base64, já podemos começar a utilizar os métodos para codificar e decodificar uma imagem.
- Primeiro passo é converter a imagem em String. A figura abaixo mostra como converter a imagem em String.
2. Segundo passo é converter o String para Json.
Depois de tudo feito, você já consegue enviar e armazenar uma imagem para um banco através de webservice.
Para recuperar a imagem de volta, é tão simples quanto o envio.
- Primeiro será necessário converter o Json é String:
2. E finalmente converter a String para imagem (Bitmap) novamente.
Espero que este artigo tenha ajudado a entender um pouco mais sobre Base64.
Olá alexascarmo, achei interessante seu post.
Estou precisando disso.
Tambem tenho uma aplicação Android, porem no outro lado tenho um WebService feito em C# (.Net).
Essa solução tb funciona dentro do C# ?
Consigo importar o Base64 no C# ?
(“getBitmapFromString”)
Ola Pessoal, é com grande satisfação que consegui resolver o meu problema.
Depois de dias tentando, eu consegui.
A solução é realmente do jeito que eu estava pensando.
A Logica ficou assim:
(Java)
*** Obter a Imagem do diretório no Android(java)
*** Transformar a Imagem em Code(Base64) no java
*** Chamar a Thread que conversa com o Método do Web Service(C#) de dentro do java
(C# Web Service)
*** Dentro do Método receber o parâmetro passado pelo java que é nada mais nada menos que a Imagem convertida no formato Base64(String)
*** Converter esse parâmetro para uma Image do tipo System.Drawing.Image;
*** Depois salvar essa Imagem no diretório do Servidor Usando o próprio obj Image com o Método Save.
Segue o Código:
—————————————————————————————————————————————–
*** JAVA ***
—————————————————————————————————————————————–
/*
import java.io.File;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import ClassesBanco.DBAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import ClassesBanco.*;
import android.widget.*;
import android.util.Base64;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.ByteArrayOutputStream;
*/
// IMPORTAR FOTOS
private String fotosString = “”;
private String fotosNome = “”;
private String retornoEnviarFoto = “”;
private void EnviarFotos()
{
File rootFotos = new File(PATH_FOTOS);
File[] fotos = rootFotos.listFiles();
for (File fileFoto : fotos) {
if(fileFoto.exists())
{
fotosNome += “;” + fileFoto.getName();
Bitmap foto = BitmapFactory.decodeFile(PATH_FOTOS + fileFoto.getName());
fotosString += “;” + encodeTobase64(foto);
}
else
{
retornoEnviarFoto += “Foto não encontrada: ” + fileFoto.getName();
return;
}
}
try
{
threadEnviarFotos.start();
}
catch(Exception ex)
{
threadEnviarFotos.stop();
}
// Aguarda
while(threadEnviarFotos.isAlive())
{
Aguardar(1000);
}
}
public static String encodeTobase64(Bitmap image){
Bitmap immagex=image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
return imageEncoded;
}
public Thread threadEnviarFotos = new Thread(){
@Override
public void run() {
try {
SOAP_ACTION = “http://tempuri.org/EnviarFoto”;
METHOD_NAME = “EnviarFoto”;
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
request.addProperty(“paramFotosString”, fotosString);
request.addProperty(“paramNomeFotos”, fotosNome);
HttpTransportSE ht = new HttpTransportSE(URL, 900000);
ht.call(SOAP_ACTION, envelope);
final SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
final String retornoWs = response.toString();
retornoEnviarFoto = retornoWs;
}
catch (Exception e) {
retornoEnviarFoto = “Erro Chamada WS”;
}
}
};
—————————————————————————————————————————————–
*** Agora Segue aqui meu código do Web Service – C# ***
—————————————————————————————————————————————–
using System.IO;
using System.Drawing;
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public bool EnviarFoto(string paramFotosString, string paramNomeFotos)
{
if (String.IsNullOrEmpty(paramFotosString) || String.IsNullOrEmpty(paramNomeFotos)) return false;
string[] fotosString = paramFotosString.Split(‘;’);
string[] fotosNome = paramNomeFotos.Split(‘;’);
string caminhoFotos = System.Configuration.ConfigurationManager.AppSettings[“CaminhoFotos”].ToString();
try
{
for (int i = 1; i < fotosNome.Length; i++)
{
Image img = Base64ToImage(fotosString[i]);
img.Save(caminhoFotos + "\\" + fotosNome[i]);
}
return true;
}
catch (Exception ex)
{
return false;
}
}
private Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}
Eu fiz o download da Classe Base64 na versão 2.3.7
e nessa atual versão não tem o metodo Base64.encodeToString.
qual a versão da classe utilizada no post?
Obrigado.
Cara, muito obrigado pelo artigo!
Foi muito, muito difícil de encontrar, e ainda está em português.
Valeu mesmo!