我有一个图片 URL。我想在 ImageView 中显示来自此 URL 的图像,但我无法做到这一点。
如何做到这一点?
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(); } } }
在你的活动中 获取图像视图和设置资源 下载(网址: yourImageview) ;
下面是从 URL 显示图像的示例代码。
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); } } catch (IOException e) { e.printStackTrace(); } }
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464"); Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); imageView.setImageBitmap(bmp);
如果你只是单击一个按钮就可以加载图片,那么上面的答案是非常好的,但是如果你是在一个新的活动中这样做的话,它会使 UI 冻结一到两秒钟。环顾四周,我发现一个简单的异步任务消除了这个问题。
使用异步任务在活动结束时添加此类:
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"/>
对我很有效:)
UrlImageViewHelper 将用在 URL 中找到的图像填充 ImageView。UrlImageViewHelper 将自动下载、保存和缓存 BitmapDrawables 的所有图像 URL。重复的 url 不会被加载到内存中两次。位图内存是使用弱引用哈希表管理的,因此一旦图像不再被您使用,它将被自动垃圾收集。
SetUrlDrawable (image/view,“ http://example.com/image.png”) ;
Https://github.com/koush/urlimageviewhelper
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);
试试这个 添加毕加索 lib jar 文件
Picasso.with(context) .load(ImageURL) .resize(width,height).noFade().into(imageView);
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); } } }
我根据 这个答案编写自己的加载程序。
具有载荷效应和外观效应:
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; } }
添加权限
执行:
new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();
尝试 picasso好,并完成在一个声明
picasso
Picasso.with(context) .load(ImageURL) .resize(width,height).into(imageView);
教程: Https://youtu.be/dxrqxsepc2s
(最新版本中的 注: ABC0已被重命名为 Picasso.get())
Picasso.get()
我尝试过的最佳方法,而不是使用任何库
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; } }
对我来说,壁画是其他库中最好的。
只要 设计壁画,然后像这样简单地设置图像 URI:
draweeView.setImageURI(uri);
看看 这个的答案,解释一些壁画的好处。
下面的代码向您展示了如何使用 RxAndroid 从 URL 字符串设置 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" />
比创建如下方法,
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"));
这对我有用。
有两种方式:
1)使用 Glide 库 这是从 URL 加载图像的最佳方式,因为当你第二次试图显示相同的 URL 时,它将从缓存中显示,从而提高应用程序的性能
Glide.with(context).load("YourUrl").into(imageView);
从属关系: implementation 'com.github.bumptech.glide:glide:4.10.0'
implementation 'com.github.bumptech.glide:glide:4.10.0'
2)使用 Stream 在这里你想要从一个 URL 图像创建一个位图
URL url = new URL("YourUrl"); Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); imageView.setImageBitmap(bitmap);
这是我使用 Adrian 的代码示例得到的工作解决方案:
private void loadImage(String pUrl) { Thread imageDataThread = new Thread(() -> { try { URL tUrl = new URL(pUrl); Bitmap imageBitmap = BitmapFactory.decodeStream(tUrl.openConnection().getInputStream()); runOnUiThread(() -> image_preview.setImageBitmap(imageBitmap)); } catch(IOException pExc) { showToast("Error loading image for this question!"); pExc.printStackTrace(); } }); imageDataThread.start(); }
注意: 您可以使用这个预定义的方法来加载图像位图,或者您可以使用您的,以防您需要调整图像大小或对图像进行类似的操作。