首页 文章

如何在Android中通过URL加载ImageView? [关闭]

提问于
浏览
483

如何在_849658中使用URL引用的图像?

23 回答

  • 2
    imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
    
  • 9

    来自Android developer

    // show The Image in a ImageView
    new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
                .execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
    
    public void onClick(View v) {
        startActivity(new Intent(this, IndexActivity.class));
        finish();
    
    }
    
    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);
        }
    }
    

    确保您在 AndroidManifest.xml 中设置了以下权限才能访问互联网 .

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

    你必须先下载图像

    public static Bitmap loadBitmap(String url) {
        Bitmap bitmap = null;
        InputStream in = null;
        BufferedOutputStream out = null;
    
        try {
            in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);
    
            final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
            out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
            copy(in, out);
            out.flush();
    
            final byte[] data = dataStream.toByteArray();
            BitmapFactory.Options options = new BitmapFactory.Options();
            //options.inSampleSize = 1;
    
            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
        } catch (IOException e) {
            Log.e(TAG, "Could not load Bitmap from: " + url);
        } finally {
            closeStream(in);
            closeStream(out);
        }
    
        return bitmap;
    }
    

    然后使用Imageview.setImageBitmap将位图设置为ImageView

  • 70

    1. Picasso允许在您的应用程序中轻松加载图像 - 通常在一行代码中!

    Use Gradle:

    implementation 'com.squareup.picasso:picasso:2.71828'
    

    只需一行代码!

    Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
    

    2. Glide适用于Android的图像加载和缓存库专注于平滑滚动

    Use Gradle:

    repositories {
      mavenCentral() 
      google()
    }
    
    dependencies {
       implementation 'com.github.bumptech.glide:glide:4.7.1'
       annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
    }
    

    // For a simple view:

    Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
    

    3. fresco是一个功能强大的系统,用于在Android应用程序中显示图像.Fresco负责图像加载和显示,因此您不必这样做 .

    Getting Started with Fresco

  • 3

    我写了一个类来处理这个问题,因为它似乎是我各种项目中反复出现的需求:

    https://github.com/koush/UrlImageViewHelper

    UrlImageViewHelper将使用在URL处找到的图像填充ImageView . 该示例将执行Google图像搜索并异步加载/显示结果 . UrlImageViewHelper将自动下载,保存和缓存BitmapDrawables的所有图像URL . 重复的网址不会被加载到内存中两次 . 位图内存通过使用弱引用哈希表进行管理,因此只要您不再使用该图像,就会自动对其进行垃圾回收 .

  • 3

    无论如何,人们会将我的评论发布为答案 . 我发布了 .

    URL newurl = new URL(photo_url_str); 
    mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream());
    profile_photo.setImageBitmap(mIcon_val);
    

    谢谢 .

  • 25

    如果您基于按钮单击加载图像,则上面接受的答案很棒,但是如果您在新活动中执行此操作,则会将UI冻结一两秒 . 环顾四周,我发现一个简单的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);
    

    结果是一个快速加载的活动和一个图像视图,它会在一瞬间显示,具体取决于用户的网络速度 .

  • 58

    您还可以使用此LoadingImageView视图从URL加载图像:

    http://blog.blundellapps.com/imageview-with-loading-spinner/

    从该链接添加类文件后,您可以实例化URL图像视图:

    在xml中:

    <com.blundell.tut.LoaderImageView
      android:id="@+id/loaderImageView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      image="http://developer.android.com/images/dialog_buttons.png"
     />
    

    在代码中:

    final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
    

    并使用以下方法更新它

    image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
    
  • 3
    public class LoadWebImg extends Activity {
    
    String image_URL=
     "http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png";
    
       /** Called when the activity is first created. */
       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
    
           ImageView bmImage = (ImageView)findViewById(R.id.image);
        BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        Bitmap bm = LoadImage(image_URL, bmOptions);
        bmImage.setImageBitmap(bm);
       }
    
       private Bitmap LoadImage(String URL, BitmapFactory.Options options)
       {       
        Bitmap bitmap = null;
        InputStream in = null;       
           try {
               in = OpenHttpConnection(URL);
               bitmap = BitmapFactory.decodeStream(in, null, options);
               in.close();
           } catch (IOException e1) {
           }
           return bitmap;               
       }
    
    private InputStream OpenHttpConnection(String strURL) throws IOException{
     InputStream inputStream = null;
     URL url = new URL(strURL);
     URLConnection conn = url.openConnection();
    
     try{
      HttpURLConnection httpConn = (HttpURLConnection)conn;
      httpConn.setRequestMethod("GET");
      httpConn.connect();
    
      if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
       inputStream = httpConn.getInputStream();
      }
     }
     catch (Exception ex)
     {
     }
     return inputStream;
    }
    }
    
  • 7

    嗨,我有最简单的代码试试这个

    public class ImageFromUrlExample extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);  
                ImageView imgView =(ImageView)findViewById(R.id.ImageView01);
                Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png");
                imgView.setImageDrawable(drawable);
    
        }
    
        private Drawable LoadImageFromWebOperations(String url)
        {
              try{
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
          }catch (Exception e) {
            System.out.println("Exc="+e);
            return null;
          }
        }
       }
    

    main.xml中

    <LinearLayout 
        android:id="@+id/LinearLayout01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        xmlns:android="http://schemas.android.com/apk/res/android">
       <ImageView 
           android:id="@+id/ImageView01"
           android:layout_height="wrap_content" 
           android:layout_width="wrap_content"/>
    

    试试这个

  • 5

    我最近发现了一个线程here,因为我必须对带有图像的列表视图做类似的事情,但原理很简单,因为你可以在那里显示的第一个示例类中读取(通过jleedev) . 你得到图像的输入流(来自网络)

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
    

    然后将图像存储为Drawable,然后将其传递给ImageView(通过setImageDrawable) . 再从上面的代码片段看一下整个线程 .

    InputStream is = fetch(urlString);
    Drawable drawable = Drawable.createFromStream(is, "src");
    
  • 59

    这里有很多好消息...我最近发现了一个名为SmartImageView的类,到目前为止看起来效果非常好 . 非常容易合并和使用 .

    http://loopj.com/android-smart-image-view/

    https://github.com/loopj/android-smart-image-view

    UPDATE :我最后写了一个blog post about this,所以请查看它以获得有关使用SmartImageView的帮助 .

    2ND UPDATE :我现在总是使用Picasso(见上文)并强烈推荐它 . :)

  • 7

    对我来说这个任务最好的现代图书馆是Square的Picasso . 它允许通过URL使用单行将图像加载到ImageView:

    Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
    
  • 3

    这是一个迟到的回复,正如上面提到的 AsyncTask 将会和谷歌搜索后我找到了另一种方法来解决这个问题 .

    Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");

    imageView.setImageDrawable(drawable);

    这是完整的功能:

    public void loadMapPreview () {
        //start a background thread for networking
        new Thread(new Runnable() {
            public void run(){
                try {
                    //download the drawable
                    final Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
                    //edit the view in the UI thread
                    imageView.post(new Runnable() {
                        public void run() {
                            imageView.setImageDrawable(drawable);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    

    不要忘记在 AndroidManifest.xml 中添加以下权限以访问互联网 .

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

    我自己尝试了这个,但我还没有遇到任何问题 .

  • 129

    这会对你有所帮助......

    定义imageview并将图像加载到其中.....

    Imageview i = (ImageView) vv.findViewById(R.id.img_country);
    i.setImageBitmap(DownloadFullFromUrl(url));
    

    然后定义此方法:

    public Bitmap DownloadFullFromUrl(String imageFullURL) {
        Bitmap bm = null;
        try {
            URL url = new URL(imageFullURL);
            URLConnection ucon = url.openConnection();
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
            }
            bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
                    baf.toByteArray().length);
        } catch (IOException e) {
            Log.d("ImageManager", "Error: " + e);
        }
        return bm;
    }
    
  • 8
    private Bitmap getImageBitmap(String url) {
            Bitmap bm = null;
            try {
                URL aURL = new URL(url);
                URLConnection conn = aURL.openConnection();
                conn.connect();
                InputStream is = conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                bm = BitmapFactory.decodeStream(bis);
                bis.close();
                is.close();
           } catch (IOException e) {
               Log.e(TAG, "Error getting bitmap", e);
           }
           return bm;
        }
    
  • 6

    一个简单而干净的方法是使用开源库Prime .

  • 3
    String img_url= //url of the image
        URL url=new URL(img_url);
        Bitmap bmp; 
        bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
        ImageView iv=(ImageView)findviewById(R.id.imageview);
        iv.setImageBitmap(bmp);
    
  • 10

    这段代码经过测试,完全正常 .

    URL req = new URL(
    "http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png"
    );
    Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection()
                      .getInputStream());
    
  • 150

    Working for imageView in any container , like listview grid view , normal layout

    private class LoadImagefromUrl extends AsyncTask< Object, Void, Bitmap > {
            ImageView ivPreview = null;
    
            @Override
            protected Bitmap doInBackground( Object... params ) {
                this.ivPreview = (ImageView) params[0];
                String url = (String) params[1];
                System.out.println(url);
                return loadBitmap( url );
            }
    
            @Override
            protected void onPostExecute( Bitmap result ) {
                super.onPostExecute( result );
                ivPreview.setImageBitmap( result );
            }
        }
    
        public Bitmap loadBitmap( String url ) {
            URL newurl = null;
            Bitmap bitmap = null;
            try {
                newurl = new URL( url );
                bitmap = BitmapFactory.decodeStream( newurl.openConnection( ).getInputStream( ) );
            } catch ( MalformedURLException e ) {
                e.printStackTrace( );
            } catch ( IOException e ) {
    
                e.printStackTrace( );
            }
            return bitmap;
        }
    /** Usage **/
      new LoadImagefromUrl( ).execute( imageView, url );
    
  • 10

    具有异常处理和异步任务的版本:

    AsyncTask<URL, Void, Boolean> asyncTask = new AsyncTask<URL, Void, Boolean>() {
        public Bitmap mIcon_val;
        public IOException error;
    
        @Override
        protected Boolean doInBackground(URL... params) {
            try {
                mIcon_val = BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
            } catch (IOException e) {
                this.error = e;
                return false;
            }
            return true;
        }
    
        @Override
        protected void onPostExecute(Boolean success) {
            super.onPostExecute(success);
            if (success) {
                image.setImageBitmap(mIcon_val);
            } else {
                image.setImageBitmap(defaultImage);
            }
        }
    };
    try {
        URL url = new URL(url);
        asyncTask.execute(url);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    
  • 676

    Try this way,hope this will help you to solve your problem.

    在这里,我解释了如何使用“AndroidQuery”外部库以asyncTask方式从url / server加载图像,同时还将缓存加载的图像添加到设备文件或缓存区域 .

    • 下载"AndroidQuery" library from here

    • 将此jar复制/粘贴到项目lib文件夹,并将此库添加到项目构建路径

    • 现在我展示了如何使用它的演示 .

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center">
    
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
    
                <ImageView
                    android:id="@+id/imageFromUrl"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:adjustViewBounds="true"/>
                <ProgressBar
                    android:id="@+id/pbrLoadImage"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"/>
    
            </FrameLayout>
        </LinearLayout>
    

    MainActivity.java

    public class MainActivity extends Activity {
    
    private AQuery aQuery;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        aQuery = new AQuery(this);
        aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);
     }
    }
    
    Note : Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by "AndroidQuery"to load your image easily.
    
  • 3

    Android Query可以为您处理更多内容(如缓存和加载进度) .

    看看here .

    我认为这是最好的方法 .

相关问题