2010-12-22 13 views
11

Me gustaría saber si es posible utilizar el método BitmapFactory.decodeFile para decodificar una imagen desde la ubicación http?¿Es posible usar el método BitmapFactory.decodeFile para decodificar una imagen desde la ubicación http?

Por ej.

ImageView imageview = new ImageView(context); 
Bitmap bmp = BitmapFactory.decodeFile("http://<my IP>/test/abc.jpg"); 
imageview.setImageBitmap(bmp); 

Pero bmp siempre devuelve nulo.

¿Hay alguna otra forma de lograr este escenario, donde tengo un conjunto de imágenes en mi PC servidor, y estoy cargando las imágenes a la aplicación de mi galería a través de un xml?

Gracias,
Sen

+0

Espero, usted está recibiendo Skia Decoder Devuelto falso, asegúrese de que está entregando este mensaje o no, consulte Su Logcat, para este mensaje ???? –

+0

@Sankar: ya he comprobado el logcat, estoy __NOT__ "recibiendo el mensaje Skia Decoder Returned false". – Sen

+0

Entonces dime qué mensajes, tienes en tu Logcat? –

Respuesta

10

@Amir & @Sankar: Gracias por sus valiosas sugerencias.

He resuelto el problema anterior de la siguiente fragmento de código:

ImageView iv = new ImageView(context); 

try{ 
    String url1 = "http://<my IP>/test/abc.jpg"; 
    URL ulrn = new URL(url1); 
    HttpURLConnection con = (HttpURLConnection)ulrn.openConnection(); 
    InputStream is = con.getInputStream(); 
    Bitmap bmp = BitmapFactory.decodeStream(is); 
    if (null != bmp) 
     iv.setImageBitmap(bmp); 
    else 
     System.out.println("The Bitmap is NULL"); 

} catch(Exception e) { 
} 

Gracias,
Sen

+4

No olvides desconectarte (y, por este medio, liberar el recurso de flujo de entrada), p. 'finally { if (con! = Null) { con.disconnect(); } } ' Ref: [HttpURLConnection] (http://developer.android.com/reference/java/net/HttpURLConnection.html) – matsev

16

Uso decodeStream y pasar flujo de entrada de la URL en su lugar.

Aquí se muestra un ejemplo:

Bitmap bmp = BitmapFactory.decodeStream(new java.net.URL(url).openStream()) 
+0

¿podría poner algunos fragmentos de código? – Sen

+0

Quizás quiso decir: Bitmap bmp = BitmapFactory.decodeStream ("http: // /test/abc.jpg"); ? – Sen

+0

¿Cómo pasar los inputstream de la URL? – Sen

5
String urldisplay="http://www.google.com/";//sample url 
Log.d("url_dispaly",urldisplay); 
try{  
InputStream in = new java.net.URL(urldisplay).openStream(); 
Bitmap mIcon11 = BitmapFactory.decodeStream(new SanInputStream(in)); 
} 
catch(Exception e){} 

Crear nombre de la clase SanInputStream

public class SanInputStream extends FilterInputStream { 
     public SanInputStream(InputStream in) { 
     super(in); 
     } 
     public long skip(long n) throws IOException { 
     long m = 0L; 
     while (m < n) { 
      long _m = in.skip(n-m); 
      if (_m == 0L) break; 
      m += _m; 
     } 

     return m; 
     } 
} 
+0

¿Cuál es el propósito de SanInputStream? –

+1

@Amir Raminfar: El método BitmapFactory.decodeStream() no puede leer una imagen JPEG (es decir, devuelve nulo) si el método skip() del FilterInputStream utilizado omite menos bytes que la cantidad requerida. Es que había usado ese método de omisión de FilterInputStream en Mi clase SanInputStream –

+0

Hmm nunca tuvo ese problema. Estoy leyendo PNG, JPEG y todo lo demás bien. ¿Es esto un error en 1.6+ tal vez? –

2

Si no me equivoco, el código @Sen fragmento debe devolver nulo en caso de. archivo BMP y logcat deben conectarse:

skia decoder->decode returned false 

Si algo como esto sucede, trate de usar este código (funciona también en caso de BITM entrada ap):

HttpGet httpRequest = null; 

try { 
    httpRequest = new HttpGet(url.toURI()); 
} catch (URISyntaxException e) { 
    e.printStackTrace(); 
} 

HttpClient httpclient = new DefaultHttpClient(); 

HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); 

HttpEntity entity = response.getEntity(); 

BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 

InputStream instream = bufHttpEntity.getContent(); 

bmp = BitmapFactory.decodeStream(instream); 

Source

0

// Crear un objeto para subclase de AsyncTask

GetXMLTask task = new GetXMLTask(); 

// ejecutar la tarea

task.execute(new String[] { "ImageURL" }); 

// entonces en la clase Asyntask asignar la imagen a la vista de imagen para evitar android.os.NetworkOnMainThreadException

private class GetXMLTask extends AsyncTask<String, Void, Bitmap> { 
    @Override 
    protected Bitmap doInBackground(String... urls) { 
     Bitmap map = null; 
     for (String url : urls) { 
      map = downloadImage(url); 
     } 
     return map; 
    } 

    // Sets the Bitmap returned by doInBackground 
    @Override 
    protected void onPostExecute(Bitmap result) { 
     imageView.setImageBitmap(result); 
    } 

    // Creates Bitmap from InputStream and returns it 
    private Bitmap downloadImage(String url) { 
     Bitmap bitmap = null; 
     InputStream stream = null; 
     BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
     bmOptions.inSampleSize = 1; 

     try { 
      stream = getHttpConnection(url); 
      bitmap = BitmapFactory. 
        decodeStream(stream, null, bmOptions); 
      stream.close(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     return bitmap; 
    } 

    // Makes HttpURLConnection and returns InputStream 
    private InputStream getHttpConnection(String urlString) 
      throws IOException { 
     InputStream stream = null; 
     URL url = new URL(urlString); 
     URLConnection connection = url.openConnection(); 

     try { 
      HttpURLConnection httpConnection = (HttpURLConnection) connection; 
      httpConnection.setRequestMethod("GET"); 
      httpConnection.connect(); 

      if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
       stream = httpConnection.getInputStream(); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return stream; 
    } 
} 
Cuestiones relacionadas