Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/02/2014, 08:36
Avatar de cender
cender
 
Fecha de Ingreso: agosto-2011
Mensajes: 15
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Error al devolver imagen de PHP a android

Sí claro. No lo he puesto antes por si nadie me contestaba o se asustaba de ver tanto código.
Ya he conseguido que no se me bloquee la aplicación, pero sigo sin poder visualizar mi lista de imágenes de la aplicación...

A ver, pongo por trozos.

Esta es la parte del main.java
Código java:
Ver original
  1. package com.example.aplicacionimagen;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import java.util.ArrayList;
  6. import android.view.Menu;
  7. import android.widget.ListView;
  8.  
  9. public class Tercero extends Activity {
  10.  
  11.     @Override
  12.     protected void onCreate(Bundle savedInstanceState) {
  13.         super.onCreate(savedInstanceState);
  14.         setContentView(R.layout.activity_tercero);
  15.  
  16.         ListView lvimages = (ListView) findViewById(R.id.lv_imagenes);
  17.         ArrayList<Imagen> imagesAvaiable = new ArrayList<Imagen>();
  18.  
  19.         //MI HILO SECUNDARIO
  20.         MiThread hilo= new MiThread(imagesAvaiable);
  21.         hilo.start();            
  22.  
  23.         // Creamos el objeto AdapterImage y lo asignamos al ListView
  24.         Adapterimagen adapterimagen = new Adapterimagen(this, imagesAvaiable);
  25.         lvimages.setAdapter(adapterimagen);
  26.     }
  27.  
  28.  
  29.     @Override
  30.     public boolean onCreateOptionsMenu(Menu menu) {
  31.         getMenuInflater().inflate(R.menu.tercero, menu);
  32.         return true;
  33.     }
  34.    
  35. }

He puesto un hilo secundario para que no se me bloqueara la aplicación:
Código java:
Ver original
  1. package com.example.aplicacionimagen;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.ArrayList;
  7.  
  8. import org.apache.http.HttpEntity;
  9. import org.apache.http.HttpResponse;
  10. import org.apache.http.client.HttpClient;
  11. import org.apache.http.client.methods.HttpGet;
  12. import org.apache.http.entity.BufferedHttpEntity;
  13. import org.apache.http.impl.client.DefaultHttpClient;
  14. import org.json.JSONArray;
  15. import org.json.JSONObject;
  16.  
  17. import android.util.Log;
  18.  
  19.  
  20. class MiThread extends Thread {
  21.    
  22.         private ArrayList<Imagen> imagesAvaiable;
  23.  
  24.         public MiThread(ArrayList<Imagen> imagesAvaiable2)
  25.         {
  26.             this.imagesAvaiable= imagesAvaiable2;
  27.         }
  28.    
  29.        @Override
  30.  
  31.        public void run() { 
  32.            
  33.            try
  34.            {
  35.             // Llamamos al servicio web para recuperar los datos
  36.                HttpGet httpGet = new HttpGet("http://URL/write.php");
  37.                HttpClient httpClient = new DefaultHttpClient();
  38.                HttpResponse response = (HttpResponse)httpClient.execute(httpGet);
  39.                HttpEntity entity = response.getEntity();
  40.                BufferedHttpEntity buffer = new BufferedHttpEntity(entity);
  41.                InputStream iStream = buffer.getContent();
  42.                
  43.                String aux = "";
  44.  
  45.                 BufferedReader r = new BufferedReader(new InputStreamReader(iStream));
  46.                 //StringBuilder total = new StringBuilder();
  47.                 String line;
  48.                 while ((line = r.readLine()) != null) {
  49.                     aux += line;
  50.                 }
  51.                
  52.                
  53.                 // Parseamos la respuesta obtenida del servidor a un objeto JSON
  54.                 JSONObject jsonObject = new JSONObject(aux);
  55.                 JSONArray images = jsonObject.getJSONArray("images");
  56.  
  57.                 // Recorremos el array con los elementos images
  58.                 for(int i = 0; i < images.length(); i++) {
  59.                     JSONObject ima = images.getJSONObject(i);
  60.  
  61.                     // Creamos el objeto Imagen
  62.                     Imagen c = new Imagen(ima.getInt("id"), ima.getString("ruta"));
  63.                     c.setData(ima.getString("photo"));
  64.  
  65.                     // Almacenamos el objeto en el array que hemos creado anteriormente
  66.                     imagesAvaiable.add(c);
  67.                 }
  68.            }
  69.            catch(Exception e)
  70.            {
  71.                 Log.e("WebService", e.getMessage());
  72.            }
  73.            
  74.     }
  75.  
  76. }

La implementación de mi clase imagen:
Código java:
Ver original
  1. package com.example.aplicacionimagen;
  2.  
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.util.Base64;
  6.  
  7. public class Imagen {
  8.     protected long id;
  9.     protected String ruta;
  10.     protected Bitmap photo;
  11.     private String data;
  12.  
  13.     public Imagen(long id, String ruta) {
  14.         this.id = id;
  15.         this.ruta=ruta;
  16.     }
  17.  
  18.     public long getId() {
  19.         return id;
  20.     }
  21.  
  22.     public void setId(long id) {
  23.         this.id = id;
  24.     }
  25.    
  26.     public String getruta() {
  27.         return ruta;
  28.     }
  29.  
  30.     public void setruta(String ruta) {
  31.         this.ruta = ruta;
  32.     }
  33.  
  34.     public String getData() {
  35.         return data;
  36.     }
  37.  
  38.     public void setData(String data) {
  39.         this.data = data;
  40.         try {
  41.             byte[] byteData = Base64.decode(data, Base64.DEFAULT);
  42.             this.photo = BitmapFactory.decodeByteArray( byteData, 0, byteData.length);
  43.         }
  44.         catch(Exception e) {
  45.             e.printStackTrace();
  46.         }
  47.     }
  48.  
  49.     public Bitmap getPhoto() {
  50.         return photo;
  51.     }
  52. }

He creado otra clase llamada AdapterImage para hacer de "adapter" con la ListView:

Código java:
Ver original
  1. package com.example.aplicacionimagen;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import android.app.Activity;
  6. import android.content.Context;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13.  
  14. public class Adapterimagen extends BaseAdapter {
  15.  
  16.     protected Activity activity;
  17.     protected ArrayList<Imagen> items;
  18.  
  19.     public Adapterimagen(Activity activity, ArrayList<Imagen> items) {
  20.         this.activity = activity;
  21.         this.items = items;
  22.     }
  23.  
  24.     @Override
  25.     public int getCount() {
  26.         return items.size();
  27.     }
  28.  
  29.     @Override
  30.     public Object getItem(int position) {
  31.         return items.get(position);
  32.     }
  33.  
  34.     @Override
  35.     public long getItemId(int position) {
  36.         return items.get(position).getId();
  37.     }
  38.  
  39.     @Override
  40.     public View getView(int position, View convertView, ViewGroup parent) {
  41.         View vi=convertView;
  42.  
  43.         if(convertView == null) {
  44.             LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  45.             vi = inflater.inflate(R.layout.list_item_layout, null);
  46.         }
  47.  
  48.         Imagen im = items.get(position);
  49.  
  50.         ImageView image = (ImageView) vi.findViewById(R.id.imageView2);
  51.         image.setImageBitmap(im.getPhoto());
  52.  
  53.         TextView ruta = (TextView) vi.findViewById(R.id.imageName);
  54.         ruta.setText(im.getruta());
  55.  
  56.         return vi;
  57.     }
  58. }

Y el código en PHP:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $con = mysql_connect('localhost', 'usuario', 'contraseña');  
  4. mysql_query("SET CHARACTER SET utf8");  
  5. mysql_query("SET NAMES utf8");  
  6.  
  7. $images['images'] = array();
  8.  
  9. if( $con )  
  10. {  
  11.   mysql_select_db('images');  
  12.  
  13.   $res = mysql_query('select id, ruta, photo from images');
  14.    
  15.   while( $row = mysql_fetch_array($res) ) {
  16.     array_push($images['images'], array('id' => $row['id'], 'ruta' => $row['ruta'], 'photo' => base64_encode($row['photo'])));
  17.   }
  18.   mysql_close($con);
  19. }
  20.  
  21. header('Content-type: application/json');
  22. echo json_encode($images);
  23.  
  24. ?>

PD: En el fichero PHP he editado el código para no mostrar el usuario ni la contraseña del servidor.

Última edición por cender; 26/02/2014 a las 08:50