2017-01-10 10 views
0

URLから画像をダウンロードする必要があります。あなたはビットマップかDrawableをお勧めしますか?どんなところでも、私は二度試しましたが、それらはうまくいきません。何が問題なのか知っていますか? (私はインターネットと外部ストレージのパーミッションを書いています)。 JSONオブジェクトでURLを受け取っていることがわかりますが、正しく受信されました。AndroidのURLから画像をダウンロード

私はDrawableの要素でそれを受け取るしたい場合:私はそれ国連ビットマップ要素受け取るしたい場合は

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; 
     } 
    } 

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; 
     } 
    } 

私はImageViewのを持っている場所です。

public class Accedido extends AppCompatActivity { 

    ImageView imagen; 
    Button ok; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_accedido); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     imagen=(ImageView)findViewById(R.id.Img); 
     ok=(Button)findViewById(R.id.btnOk); 
     ok.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Bitmap img=null; 
       Ajax im=new Ajax(); 
       try { 
        String imagen = im.execute(MainActivity.IP_ADDRESS + "Imagen").get(); 
        LeerConsulta lec = new LeerConsulta(imagen, "img"); 
        //img=lec.getBitMap(); 
        /*String res=lec.getContent(); 
        String res2=lec.getData(); 
        Toast.makeText(Accedido.this, "Content:"+res+"Data:"+res2, Toast.LENGTH_LONG).show();*/ 
        img=lec.getBitMap(); 
       } 
       catch(Exception exc) { 
        Toast.makeText(Accedido.this, exc.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
       imagen.setImageBitmap(img); 
      } 
     }); 
    } 

これらのコードを実行すると、プログラムによってエラーが発生します。println needs a message ... B私はプログラムでは決してsystem.out.printlnを書いたことはありません

+0

イメージをStorageまたはImageviewにダウンロードしますか? – W4R10CK

+0

いいえ、それをダウンロードしてImageViewに表示したいのです –

+0

説明してください、**詳細は**、「動作しない」とはどういう意味ですか?たとえば、あなたの例外(現在のコードではできません)からスタックトレースを記録し、そのスタックトレースをあなたの質問に含めることができます。 – CommonsWare

答えて

1

画像をダウンロードするAsynckタスクを使用します。

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

あなたは、あなたのイメージビューにURLから直接画像をダウンロードするためにGlide libraryを使用することができますhttp://www.wingnity.com/blog/android-json-parsing-and-image-loading-tutorial/

+0

ImageViewが別のクラスにあることを示すコードを更新しました。他のクラスのbackGround関数にはどうすればアクセスできますか?そのケースのコードを編集してください。 –

+0

私がオハイオのクラスでこれを行うと間違っていますか? 'String imagen = im.execute(MainActivity.IP_ADDRESS +" Imagen ")。get(); LeerConsulta lec = new LeerConsulta(imagen、 "img"); 文字列src = lec.onPostExecute(); img = lec.doInBackground(src); ' –

+0

最後の解説のコードは機能しませんでしたが、バックグラウンドの回答を得る方法を調査してみました。どうもありがとうございます!!! –

0

私の意見ではビットマップが優れています。 これを試してください。 JSONから取得するURLがイメージのみであることを確認してください。

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()); 

さらに、Universal Image Loaderライブラリも利用できます。それも試してみてください。

+0

私はこのURLからダウンロードしたい:http://10.1.1.2:8080/basket.png(私はそれを私の携帯電話のブラウザに書いたので、そのイメージを見ることができたので、大丈夫です)。イメージはImageViewと同じサイズではないので、可能ですか?私はあなたが書いたものを試してみます –

+0

サイズは決して問題にはなりません。 –

+0

ユニバーサルイメージローダーも試してみることを強くお勧めします。特にこの目的のために設計されています。 –

0

Volleyは、Androidアプリのネットワーキングをより簡単で重要なものに早くするHTTPライブラリです。高レベルでは、RequestQueueを作成し、Requestオブジェクトを渡すことでVolleyを使用します。 RequestQueueは、ネットワーク操作の実行、キャッシュの読み書き、および応答の解析のためのワーカースレッドを管理します。

あなたは、画像のダウンロードにVolleyを使用することができます。

はあなたのGradleにレポを追加します。

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

あなただけ(でのコードを追加し、ImageViewが存在している、あなたのクラスでは、このコードを追加する必要がありますあなたがいずれかを持っている場合)ボタンをダウンロード:

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); 

礼儀Google.com

+0

私はVolleyについて読んだことはありません...それを使用する利点は何ですか?私はクラスの画像を私に与える関数を持っていて、別のクラスのImageViewを持っています....それを考慮してコードを書くことができますか? –

+0

OK、更新されたコードを確認してください。 – W4R10CK

0

このリンクを参照することができます。

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

これは私がこのためのクラスを持っているプロジェクトのためのものです –

+0

ホイールを再創造するのは悪いです、あなたはOOMで終わるでしょう – EpicPandaForce

関連する問題