M4V3RICK WAS HERE ! #RedEyeCrew

On 6 de agosto de 2012 by alexascarmo

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.

 

  1. 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.

  1. 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.

4 Responses to “M4V3RICK WAS HERE ! #RedEyeCrew”

  • 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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *