从url加载图片

我有一个图片url。 我想要在ImageView中显示来自此URL的图像,但我无法做到这一点。

这怎么能实现?

URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464"); Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); imageView.setImageBitmap(bmp); 

上面接受的答案是很好的,如果你正在加载的图像基于一个button点击,但是如果你正在做一个新的活动它冻结了一两个用户界面。 环顾四周,我发现一个简单的asynctask消除了这个问题。

要在活动结束时使用asynctask添加此类,请执行以下操作:

 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 mIcon11 = null; try { InputStream in = new java.net.URL(urldisplay).openStream(); mIcon11 = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return mIcon11; } protected void onPostExecute(Bitmap result) { bmImage.setImageBitmap(result); } } 

并使用您的onCreate()方法调用:

 new DownloadImageTask((ImageView) findViewById(R.id.imageView1)) .execute(MY_URL_STRING); 

不要忘记在清单文件中添加下面的权限

 <uses-permission android:name="android.permission.INTERNET"/> 

对我很好。 🙂

尝试picassso好,并在一个声明完成

 Picasso.with(context) .load(ImageURL) .resize(width,height).into(imageView); 

教程: https : //youtu.be/DxRqxsEPc2s

 import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.ImageView; import android.widget.Toast; public class imageDownload { Bitmap bmImg; void downloadfile(String fileurl,ImageView img) { URL myfileurl =null; try { myfileurl= new URL(fileurl); } catch (MalformedURLException e) { e.printStackTrace(); } try { HttpURLConnection conn= (HttpURLConnection)myfileurl.openConnection(); conn.setDoInput(true); conn.connect(); int length = conn.getContentLength(); int[] bitmapData =new int[length]; byte[] bitmapData2 =new byte[length]; InputStream is = conn.getInputStream(); BitmapFactory.Options options = new BitmapFactory.Options(); bmImg = BitmapFactory.decodeStream(is,null,options); img.setImageBitmap(bmImg); //dialog.dismiss(); } catch(IOException e) { // TODO Auto-generated catch block e.printStackTrace(); // Toast.makeText(PhotoRating.this, "Connection Problem. Try Again.", Toast.LENGTH_SHORT).show(); } } } 

在你的活动中进行imageview&设置资源imageDownload(url,yourImageview);

试试这个添加picasso lib jar文件

 Picasso.with(context) .load(ImageURL) .resize(width,height).noFade().into(imageView); 

UrlImageViewHelper将使用在URL中find的图像来填充ImageView。 UrlImageViewHelper会自动下载,保存和caching所有的图像url的BitmapDrawables。 重复的url不会被加载到内存中两次。 位图内存是通过使用弱引用哈希表来pipe理的,所以一旦图像不再被你使用,它就会被自动垃圾收集。

UrlImageViewHelper.setUrlDrawable(imageView,“http://example.com/image.png”);;

https://github.com/koush/UrlImageViewHelper

试试这个

 public static Void downloadfile(String fileurl,ImageView img) { Bitmap bmImg = null; URL myfileurl =null; try { myfileurl= new URL(fileurl); } catch (MalformedURLException e) { e.printStackTrace(); } try { HttpURLConnection conn= (HttpURLConnection)myfileurl.openConnection(); conn.setDoInput(true); conn.connect(); int length = conn.getContentLength(); if(length>0) { int[] bitmapData =new int[length]; byte[] bitmapData2 =new byte[length]; InputStream is = conn.getInputStream(); bmImg = BitmapFactory.decodeStream(is); // img.setImageBitmap(bmImg); } else { } } catch(IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

UrlImageViewHelper最适合从URL加载图片。

基于这个答案我写我自己的装载机。

具有加载效果和显示效果:

 import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ProgressBar; import java.io.InputStream; /** * Created by Sergey Shustikov (pandarium.shustikov@gmail.com) at 2015. */ public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { public static final int ANIMATION_DURATION = 250; private final ImageView mDestination, mFakeForError; private final String mUrl; private final ProgressBar mProgressBar; private Animation.AnimationListener mOutAnimationListener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mProgressBar.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } }; private Animation.AnimationListener mInAnimationListener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (isBitmapSet) mDestination.setVisibility(View.VISIBLE); else mFakeForError.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } }; private boolean isBitmapSet; public DownloadImageTask(Context context, ImageView destination, String url) { mDestination = destination; mUrl = url; ViewGroup parent = (ViewGroup) destination.getParent(); mFakeForError = new ImageView(context); destination.setVisibility(View.GONE); FrameLayout layout = new FrameLayout(context); mProgressBar = new ProgressBar(context); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER; mProgressBar.setLayoutParams(params); FrameLayout.LayoutParams copy = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); copy.gravity = Gravity.CENTER; copy.width = dpToPx(48); copy.height = dpToPx(48); mFakeForError.setLayoutParams(copy); mFakeForError.setVisibility(View.GONE); mFakeForError.setImageResource(android.R.drawable.ic_menu_close_clear_cancel); layout.addView(mProgressBar); layout.addView(mFakeForError); mProgressBar.setIndeterminate(true); parent.addView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); } protected Bitmap doInBackground(String... urls) { String urlDisplay = mUrl; Bitmap bitmap = null; try { InputStream in = new java.net.URL(urlDisplay).openStream(); bitmap = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return bitmap; } protected void onPostExecute(Bitmap result) { AlphaAnimation in = new AlphaAnimation(0f, 1f); AlphaAnimation out = new AlphaAnimation(1f, 0f); in.setDuration(ANIMATION_DURATION * 2); out.setDuration(ANIMATION_DURATION); out.setAnimationListener(mOutAnimationListener); in.setAnimationListener(mInAnimationListener); in.setStartOffset(ANIMATION_DURATION); if (result != null) { mDestination.setImageBitmap(result); isBitmapSet = true; mDestination.startAnimation(in); } else { mFakeForError.startAnimation(in); } mProgressBar.startAnimation(out); } public int dpToPx(int dp) { DisplayMetrics displayMetrics = mDestination.getContext().getResources().getDisplayMetrics(); int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); return px; } } 

添加权限

 <uses-permission android:name="android.permission.INTERNET"/> 

并执行:

  new DownloadImageTask(context, imageViewToLoad, urlToImage).execute(); 

最好的方法我试过,而不是使用任何库

 public Bitmap getbmpfromURL(String surl){ try { URL url = new URL(surl); HttpURLConnection urlcon = (HttpURLConnection) url.openConnection(); urlcon.setDoInput(true); urlcon.connect(); InputStream in = urlcon.getInputStream(); Bitmap mIcon = BitmapFactory.decodeStream(in); return mIcon; } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); return null; } } 

您可以使用Picasso和Glide图像加载器并显示到imageview

看看这些问题,并专注于第一个答案,在这里你可以find两个简单而完整的方法来做到这一点:

第一种方法(更完整)

要么

第二种方法(更简单)

下面的代码展示了如何使用RxAndroid从一个urlstring设置ImageView。 首先,添加RxAndroid库2.0

 dependencies { // RxAndroid compile 'io.reactivex.rxjava2:rxandroid:2.0.0' compile 'io.reactivex.rxjava2:rxjava:2.0.0' // Utilities compile 'org.apache.commons:commons-lang3:3.5' } 

现在使用setImageFromUrl来设置图像。

 public void setImageFromUrl(final ImageView imageView, final String urlString) { Observable.just(urlString) .filter(new Predicate<String>() { @Override public boolean test(String url) throws Exception { return StringUtils.isNotBlank(url); } }) .map(new Function<String, Drawable>() { @Override public Drawable apply(String s) throws Exception { URL url = null; try { url = new URL(s); return Drawable.createFromStream((InputStream) url.getContent(), "profile"); } catch (final IOException ex) { return null; } } }) .filter(new Predicate<Drawable>() { @Override public boolean test(Drawable drawable) throws Exception { return drawable != null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Drawable>() { @Override public void accept(Drawable drawable) throws Exception { imageView.setImageDrawable(drawable); } }); } 

在清单中添加Internet权限

 <uses-permission android:name="android.permission.INTERNET" /> 

比如下创build方法,

  public static Bitmap getBitmapFromURL(String src) { try { Log.e("src", src); URL url = new URL(src); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); Log.e("Bitmap", "returned"); return myBitmap; } catch (IOException e) { e.printStackTrace(); Log.e("Exception", e.getMessage()); return null; } } 

现在在你的onCreate方法中添加这个,

  ImageView img_add = (ImageView) findViewById(R.id.img_add); img_add.setImageBitmap(getBitmapFromURL("http://www.deepanelango.me/wpcontent/uploads/2017/06/noyyal1.jpg")); 

这对我很有用。

 loadImage("http://relinjose.com/directory/filename.png"); 

干得好

 void loadImage(String image_location) { URL imageURL = null; if (image_location != null) { try { imageURL = new URL(image_location); HttpURLConnection connection = (HttpURLConnection) imageURL .openConnection(); connection.setDoInput(true); connection.connect(); InputStream inputStream = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(inputStream);// Convert to bitmap ivdpfirst.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } else { //set any default } } 

尝试这个:

 InputStream input = contentResolver.openInputStream(httpuri); Bitmap b = BitmapFactory.decodeStream(input, null, options); 
 public class MainActivity extends Activity { Bitmap b; ImageView img; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = (ImageView)findViewById(R.id.imageView1); information info = new information(); info.execute(""); } public class information extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... arg0) { try { URL url = new URL("http://10.119.120.10:80/img.jpg"); InputStream is = new BufferedInputStream(url.openStream()); b = BitmapFactory.decodeStream(is); } catch(Exception e){} return null; } @Override protected void onPostExecute(String result) { img.setImageBitmap(b); } } } 

对我而言, Fresco是其他图书馆中最好的。

只需设置 Fresco,然后像这样设置imageURI:

 draweeView.setImageURI(uri); 

看看这个答案解释一些壁画的好处。