2017-01-10 4 views
0

Ich muss ein Bild von einer URL herunterladen. Empfiehlst du Bitmap oder Drawable? Wie auch immer, ich habe es zweimal versucht, aber die funktionieren nicht. Weißt du, was könnte das Problem sein? (Ich habe das Internet und die externen Speicherberechtigungen geschrieben). Sie werden sehen, dass ich die URL von einem JSON-Objekt erhalten habe, aber ich wurde korrekt empfangen.Download Bild von einer URL in Android

Wenn ich es in einem Auslosungs Elemente empfangen will:

protected Drawable getDrawable() 
    { 
     try{ 
      JSONObject jsonResponse = new JSONObject(content); 
      String src=jsonResponse.getString(data); 
      InputStream is = (InputStream)new URL(src).getContent(); 
      Drawable d=Drawable.createFromStream(is, "basket.png"); 
      return d; 
     } 
     catch(Exception e) 
     { 
      String err="This is the error: "; 
      Log.e(err,e.getMessage()); 
      //e.printStackTrace(); 
      return null; 
     } 
    } 

Wenn ich es un ein Bitmap-Element empfangen will:

protected Bitmap getBitMap() 
    { 
     try{ 
      JSONObject jsonResponse = new JSONObject(content); 
      String src=jsonResponse.getString(data); 
      java.net.URL url = new java.net.URL(src); 
      HttpURLConnection con=(HttpURLConnection)url.openConnection(); 
      con.setDoInput(true); 
      con.connect(); 
      InputStream input=con.getInputStream(); 
      Bitmap myBitmap=BitmapFactory.decodeStream(input); 
      return myBitmap; 
     } 
     catch(Exception e){ 
      String err="This is the error: "; 
      Log.e(err,e.getMessage()); 
      //e.printStackTrace(); 
      return null; 
     } 
    } 

Dies ist, wo ich das Image habe:

Wenn ich diese Codes ausführen, wirft das Programm einen Fehler, der println needs a message ... B sagt ut habe ich noch nie im Programm ein system.out.println geschrieben

+0

Möchten Sie das Bild in Storage oder auf Imageview herunterladen? – W4R10CK

+0

Nein. Ich möchte es nur herunterladen und in einem ImageView anzeigen –

+0

Bitte erklären, ** im Detail **, was "die nicht funktionieren" bedeuten. Sie könnten beispielsweise den Stack-Trace von Ihrer Ausnahme protokollieren (was Ihr aktueller Code nicht tut) und dann diesen Stack-Trace in Ihre Frage aufnehmen. – CommonsWare

Antwort

1

Verwenden Sie die Asynck-Task, um das Image herunterzuladen.

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 
     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon = null; 
      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon; 
     } 

     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
     } 
    } 

können Sie diesen Link verweisen http://www.wingnity.com/blog/android-json-parsing-and-image-loading-tutorial/

+0

Ich habe gerade den Code aktualisiert, um Ihnen zu zeigen, dass ich das ImageView in einer anderen Klasse habe. Wie kann ich auf die BackGround-Funktion in der anderen Klasse zugreifen? Bitte bearbeiten Sie Ihren Code für diesen Fall –

+0

Ist es falsch, wenn ich das in der anderen Klasse mache? 'String imagein = im.execute (MainActivity.IP_ADDRESS +" Imagen "). Get(); LeerConsulta lec = neue LeerConsulta (imagen, "img"); Zeichenfolge src = lec.onPostExecute(); img = lec.doInBackground (src); ' –

+0

Der Code aus dem letzten Kommentar hat nicht funktioniert, aber ich habe versucht, den Hintergrund zu untersuchen, wie ich die Hintergrundantwort bekommen konnte und es funktionierte. Ich danke dir sehr!!! –

0

Bitmap ist meiner Meinung nach besser. Probieren Sie es aus. Stellen Sie sicher, dass die URL, die Sie von der JSON erhalten, nur aus Image besteht.

JSONObject jsonResponse = new JSONObject(content); 
String src=jsonResponse.getString(data); 
java.net.URL url = new java.net.URL(src); 
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 

Darüber hinaus ist die Universal Image Loader-Bibliothek ebenfalls verfügbar. Versuchen Sie es auch.

+0

Ich möchte es von dieser URL herunterladen: http://10.1.1.2:8080/basket.png (Ich schrieb es den Browser meines Telefons und ich konnte das Bild sehen, also ist das in Ordnung).Es könnte möglich sein, weil das Bild nicht die gleiche Größe wie der ImageView hat ?? Ich werde versuchen, was Sie geschrieben haben –

+0

Größe wird nie problematisch sein. –

+0

Ich würde sehr empfehlen, Universal Image Loader auch zu versuchen. Es ist speziell für diesen Zweck konzipiert. –

0

Volley ist eine HTTP-Bibliothek, die das Netzwerken für Android-Apps einfacher und vor allem schneller macht. Auf einer höheren Ebene verwenden Sie Volley, indem Sie eine RequestQueue erstellen und Request-Objekte übergeben. Die RequestQueue verwaltet Worker-Threads zum Ausführen der Netzwerkoperationen, Lesen von und Schreiben in den Cache und Analysieren von Antworten.

Sie können Volley für Bilder zum Herunterladen verwenden:

Repo in Ihrem Gradle hinzufügen:

compile 'com.android.volley:volley:1.0.0' 

Sie müssen diesen Code hinzufügen, in der Klasse, wo ImageView vorhanden ist, einfach den Code hinzufügen (In Download-Taste, wenn Sie welche haben):

ImageRequest imageRequest = new ImageRequest(your_image_url, new Response.Listener<Bitmap>() { 
     @Override 
     public void onResponse(final Bitmap response) { 
        your_image_view.setImageBitmap(response); 
     } 
    }, 0, 0, ImageView.ScaleType.CENTER_INSIDE, null, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(your_activity_context.this, error.toString(), Toast.LENGTH_LONG).show(); 
     } 
    }); 

    RequestQueue requestQueue = Volley.newRequestQueue(your_activity_context.this); 
    requestQueue.add(imageRequest); 

Courtesy Google.com

+0

Ich habe nie über Volley gelesen ... Was ist der Vorteil der Verwendung von? Ich habe die Funktion, die mir das Bild in einer Klasse gibt und ich habe das ImageView in einer anderen Klasse .... Können Sie den Code unter Berücksichtigung dieser schreiben? –

+0

ok, überprüfe meinen aktualisierten Code. – W4R10CK

0

Sie Glide library verwenden können das Bild direkt aus der URL in Ihre Bildansicht zum Download bereit.

Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView); 
+0

Dies ist für ein Projekt, wo ich eine andere Klasse für diese –

+0

haben sollte. Das Rad neu zu erfinden ist schlecht, du wirst mit OOMs enden – EpicPandaForce