【问题标题】:How to display image from URL on Android如何在 Android 上显示来自 URL 的图像
【发布时间】:2011-09-18 10:29:20
【问题描述】:

我想在屏幕上显示图像。图片应该来自 URL,而不是可绘制的。

代码在这里:

<ImageView android:id="@+id/ImageView01" android:src = "http://l.yimg.com/a/i/us/we/52/21.gif"
    android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>

但它在编译时会出错。

如何在 Android 中显示来自 URL 的图像?

【问题讨论】:

    标签: android image url https


    【解决方案1】:

    举个简单的例子,
    http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device

    您必须使用 httpClient 并下载图像(如果需要,将其缓存),

    为在列表视图中显示图像提供的解决方案,基本相同的代码(检查从 url 设置 imageview 的代码)用于显示。

    Lazy load of images in ListView

    【讨论】:

      【解决方案2】:

      您可以直接从网络显示图像而无需下载。请检查以下功能。它会将来自网络的图像显示到您的图像视图中。

      public static Drawable LoadImageFromWebOperations(String url) {
          try {
              InputStream is = (InputStream) new URL(url).getContent();
              Drawable d = Drawable.createFromStream(is, "src name");
              return d;
          } catch (Exception e) {
              return null;
          }
      }
      

      然后使用 Activity 中的代码将图像设置为 imageview。

      【讨论】:

      【解决方案3】:
      InputStream URLcontent = (InputStream) new URL(url).getContent();
      Drawable image = Drawable.createFromStream(URLcontent, "your source link");
      

      这对我有用

      【讨论】:

      • “你的源链接”基本上是什么?我有一个谷歌的图片网址,我希望该图片加载到上面代码使用的图片视图中,但它返回 null ?如何解决这个问题?
      • url"your source link" 一样吗?
      【解决方案4】:

      我重试了来自 URL 的图像并使用以下代码存储在我的 SD 卡上:

      public String Downloadfromurl(String Url)
      {
      
       String filepath=null;
      
       try {
      
        URL url = new URL(Url);
      
        //create the new connection
      
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
      
        //set up some things on the connection
        urlConnection.setRequestMethod("GET");
      
        urlConnection.setDoOutput(true); 
      
         //and connect!
      
        urlConnection.connect();
      
        //set the path where we want to save the file
        //in this case, going to save it on the root directory of the
        //sd card.
      
        folder = new File(Environment.getExternalStorageDirectory().toString()+"/img");
      
        folder.mkdirs();
      
        //create a new file, specifying the path, and the filename
        //which we want to save the file as.
      
        String filename= "page"+no+".PNG";   
      
        file = new File(folder,filename);
      
        if(file.createNewFile())
      
        {
      
         file.createNewFile();
      
        }
      
        //this will be used to write the downloaded data into the file we created
        FileOutputStream fileOutput = new FileOutputStream(file);
      
        //this will be used in reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();
      
        //this is the total size of the file
        int totalSize = urlConnection.getContentLength();
        //variable to store total downloaded bytes
        int downloadedSize = 0;
      
        //create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0; //used to store a temporary size of the buffer
      
        //now, read through the input buffer and write the contents to the file
        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
         //add the data in the buffer to the file in the file output stream (the file on the sd card
         fileOutput.write(buffer, 0, bufferLength);
         //add up the size so we know how much is downloaded
         downloadedSize += bufferLength;
         //this is where you would do something to report the prgress, like this maybe
         Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
        }
        //close the output stream when done
        fileOutput.close();
        if(downloadedSize==totalSize)  
            filepath=file.getPath();
      
       //catch some possible errors...
       } catch (MalformedURLException e) {
        e.printStackTrace();
       } catch (IOException e) {
        filepath=null;
        e.printStackTrace();
       }
       Log.i("filepath:"," "+filepath) ;
      
      
       return filepath;
      
      }
      

      【讨论】:

      • **如果要显示来自 sdcard 的图像,请使用此 ** Bitmap bmp = BitmapFactory.decodeFile(folder + "/page"+no+".PNG"); imgview.setImageBitmap(bmp);
      【解决方案5】:

      你可以试试我在另一个问题中找到的这个。

      Android, Make an image at a URL equal to ImageView's image

      try {
        ImageView i = (ImageView)findViewById(R.id.image);
        Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
        i.setImageBitmap(bitmap); 
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      

      【讨论】:

      • 是否导入必要的文件?例如 java.io.IOException 等等。
      • 如果您的设备运行在 3.x 或 4.x 上,您需要使用 handler 或 asynctask 在 UI Thread 之外进行下载操作。因为 UI Thread 中禁止下载操作。此博客可能有用androiddesignpatterns.com/2012/06/….
      【解决方案6】:

      使用ASyncTask编写代码进行http处理。

      Bitmap b;
      ImageView img;
      ......
      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){}
      ......
      img.setImageBitmap(b);
      

      【讨论】:

        【解决方案7】:

        我也有同样的问题。我测试了这段代码并且运行良好。此代码从 URL 获取图像并放入 - "bmpImage"

        URL url = new URL("http://your URL");
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout(60000 /* milliseconds */);
                    conn.setConnectTimeout(65000 /* milliseconds */);
                    conn.setRequestMethod("GET");
                    conn.setDoInput(true);
                    conn.connect();
                    int response = conn.getResponseCode();
                    //Log.d(TAG, "The response is: " + response);
                    is = conn.getInputStream();
        
        
                    BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
        
                    Bitmap bmpImage = BitmapFactory.decodeStream(bufferedInputStream);
        

        【讨论】:

          【解决方案8】:

          我试过这段代码为我工作,直接从 url 获取图像

                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.image)) .execute("http://scoopak.com/wp-content/uploads/2013/06/free-hd-natural-wallpapers-download-for-pc.jpg");

          【讨论】:

          • 有效,但我必须添加: ... 到避免出现“不允许明文 HTTP 流量”的问题(请参阅 stackoverflow.com/questions/45940861/…
          • 这快把我逼疯了!为什么对我不起作用!
          【解决方案9】:

          你可以试试 Picasso,它真的很不错,也很简单。 不要忘记在清单中添加权限。

          Picasso.with(context)
                               .load("http://ImageURL")
                               .resize(width,height)
                               .into(imageView );
          

          您也可以在此处查看教程: Youtube / Github

          【讨论】:

            【解决方案10】:

            您可以简单地使用 Glide API。它避免了所有样板代码,并且可以在两行代码中完成任务。您参考此链接https://blog.mindorks.com/downloading-and-showing-image-with-glide-library-in-android。享受

            【讨论】:

            • 虽然链接可能有用,但最好直接在 SO 上发布解决方案。
            • 步骤 1 ) 转到 build.gradle 并复制粘贴这两个依赖项 1) implementation 'com.github.bumptech.glide:glide:4.9.0' annotationProcessor 'com.github.bumptech.glide: compiler:4.9.0' 然后在你的相对布局中创建一个 ImageView。 3) 将此代码放入您的 Java 文件中
            猜你喜欢
            • 2017-01-07
            • 1970-01-01
            • 2011-09-23
            • 1970-01-01
            • 1970-01-01
            • 2014-05-20
            • 2014-01-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多