2010-12-22 26 views
11

Ich würde gerne wissen, ob es möglich ist, BitmapFactory.decodeFile Methode zu verwenden, um ein Bild von http Standort zu decodieren?Ist es möglich, die BitmapFactory.decodeFile-Methode zu verwenden, um ein Bild vom http-Standort zu dekodieren?

Für z.

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

Aber bmp gibt immer null zurück.

Gibt es einen anderen Weg, um dieses Szenario zu erreichen, wo ich eine Reihe von Bildern in meinem Server-PC habe, und ich die Bilder in meine Galerie-Anwendung über ein XML laden? Statt

Danke,
Sen

+0

ich hoffe, Sie erhalten Skia Decoder zurückgegeben falsch, sicher sein, dass Sie diese Nachricht ergeben oder nicht, überprüfen Sie Ihre Logcat, für diese Nachricht ???? –

+0

@Sankar: ya, ich habe das Logcat überprüft, ich bin __NOT__ "bekommen die Skia Decoder zurückgegeben falsch" Nachricht. – Sen

+0

Dann sag mir, welche Nachrichten du in deinem Logcat bekommen hast? –

Antwort

10

@Amir & @Sankar: Vielen Dank für Ihre wertvolle Anregungen.

ich das oben genannte Problem, indem Sie den folgenden Code-Schnipsel gelöst:

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) { 
} 

Danke,
Sen

+4

Vergessen Sie nicht, die Verbindung zu trennen (und hiermit die Eingabe-Stream-Ressource freizugeben), z. 'endlich { if (con! = Null) { con.disconnect(); } } ' Ref: [HttpURLConnection] (http://developer.android.com/reference/java/net/HttpURLConnection.html) – matsev

16

Verwenden decodeStream und die Input URL übergeben. Hier

ein Beispiel:

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

Könnten Sie bitte ein paar Code-Schnipsel einfügen? – Sen

+0

Meinten Sie: Bitmap bmp = BitmapFactory.decodeStream ("http: // /test/abc.jpg"); ? – Sen

+0

Wie man den Inputstream der URL übergibt ?? – 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){} 

erstellen Klassennamen 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

Was ist der Zweck von SanInputStream? –

+1

@Amir Raminfar: Die BitmapFactory.decodeStream() - Methode kann ein JPEG-Bild nicht lesen (d. H. Gibt null zurück), wenn die skip() -Methode des verwendeten FilterInputStream weniger Bytes als die erforderliche Menge auslässt. Das ist ich hatte verwendet, dass die Skip-Methode von FilterInputStream in meiner Klasse SanInputStream –

+0

Hmm hatte nie dieses Problem. Ich lese PNGs, JPEGs und alles andere gut. Ist das ein Fehler in 1.6+ vielleicht? –

2

Wenn ich mich nicht irre, sollte @Sen Code-Schnipsel bei null zurück. BMP-Datei und logcat einbucht:

skia decoder->decode returned false 

Wenn so etwas wie dies geschieht, versuchen Sie diesen Code verwenden (funktioniert auch bei BITM ap-Eingang):

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

// ein Objekt für Unterklasse von AsyncTask erstellen

GetXMLTask task = new GetXMLTask(); 

// Führen Sie die Aufgabe

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

// dann in Asyntask Klasse Weisen Sie das Bild der Bildansicht zu, um zu vermeiden, dass 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; 
    } 
} 
Verwandte Themen