Foros del Web » Programando para Internet » Android »

Error al devolver imagen de PHP a android

Estas en el tema de Error al devolver imagen de PHP a android en el foro de Android en Foros del Web. Estoy haciendo una aplicación con varias funcionalidades y me he quedado atascada en una de ellas. En concreto en la de recibir una imagen desde ...
  #1 (permalink)  
Antiguo 17/02/2014, 08:25
Avatar de cender  
Fecha de Ingreso: agosto-2011
Mensajes: 15
Antigüedad: 12 años, 8 meses
Puntos: 0
Error al devolver imagen de PHP a android

Estoy haciendo una aplicación con varias funcionalidades y me he quedado atascada en una de ellas. En concreto en la de recibir una imagen desde un servidor PHP a través de una petición android.
Consiste en mostrar un listado con todas las imágenes y cuando se clickea en alguna aparece la imagen y la ruta, pero por ahora no consigo si quiera ver visualizada el layout de mi aplicación. La aplicación se me cierra de golpe y sólo me aparecen estos errores:

Código:
Can't open keycharmap file
Error loading keycharmap file '/system/usr/keychars/melfas_touchkey.kcm.bin'. hw.keyboards.65537.devname='melfas_touchkey'
Using default keymap: /system/usr/keychars/qwerty.kcm.bin
He estado buscando soluciones y la verdad es que no me ha servido de mucha ayuda, así que cualquier comentario que me hagáis me servirá de mucho
  #2 (permalink)  
Antiguo 24/02/2014, 07:16
(Desactivado)
 
Fecha de Ingreso: agosto-2011
Mensajes: 327
Antigüedad: 12 años, 7 meses
Puntos: 3
Respuesta: Error al devolver imagen de PHP a android

Me muestras el código ?

Así miro de ayudarte!
  #3 (permalink)  
Antiguo 26/02/2014, 08:36
Avatar de cender  
Fecha de Ingreso: agosto-2011
Mensajes: 15
Antigüedad: 12 años, 8 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
  #4 (permalink)  
Antiguo 26/02/2014, 10:05
Avatar de tomerqueves  
Fecha de Ingreso: marzo-2005
Ubicación: algeciras (cadiz)
Mensajes: 200
Antigüedad: 19 años
Puntos: 7
Respuesta: Error al devolver imagen de PHP a android

jo, sí que da miedo
__________________
A todos los moderadores y admiinistradores. Si algun día me banean, por favor devolverme la carita de mi avatar
  #5 (permalink)  
Antiguo 26/02/2014, 11:55
Avatar de racanix  
Fecha de Ingreso: diciembre-2008
Ubicación: Morelia Mich.
Mensajes: 192
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: Error al devolver imagen de PHP a android

Que tal

veo que tu código intenta directamente pasar un array de imágenes al adaptador, y este
intenta buscar un recurso statico en la app, deberías pesarle los bitmaps, ademas no se si estas contemplando el tamaño de las imágenes, recuerda que los moviles están limitados en memoria y deberias usar la cache, ademas te recomiendo usar async ya que gestiona el hilo por ti


te sugiero que leas un poco este tutorial de como cargar las imagenes en android correctamente.

http://developer.android.com/trainin...aps/index.html

Suerte
  #6 (permalink)  
Antiguo 03/03/2014, 06:17
Avatar de cender  
Fecha de Ingreso: agosto-2011
Mensajes: 15
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Error al devolver imagen de PHP a android

Gracias por contestar racanix ^^

¿Pesarle los bits a la imagen? ¿Cómo podría hacer eso a través del array? He estado leyendo el tema que me has pasado de los BitmapDrawable, pero solo he conseguido liarme aún más (principalmente porque el inglés no es mi fuerte...).
¿El array de la imagen no sería suficiente para que éste me devolviera una imagen cuyo tamaño está especificado en el layout?
Es más... lo que me preocupa también es que no consigo visualizar todo el listado de las imágenes, independientemente de si consigo verlas o no.

Quizás me falta más desenvoltura en este lenguaje, pero he empezando relativamente a estudiarlo, así que no tengo mucha idea de como desenvolverme para encontrar la solución de esto...

Etiquetas: androi, devolver, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:05.