2016-10-30 111 views
0

如何从URL加载图像并将其保存在Android设备的内存中?不要说我使用毕加索或oser laibrary。 我需要: 如果设备获得互联网连接我从URL加载图像到ImageView并将其保存在设备的内存中,否则我需要将其中一个保存图像加载到imageView。感谢`的帮助从URL加载图像并保存在内存中android

P.S.对不起,我可以犯一些错误,因为我不太熟悉英语。 这是我的类:

public class ImageManager { 
    String file_path; 
    Bitmap bitmap = null; 
    public Bitmap donwoaledImageFromSD() { 

     File image = new File(Environment.getExternalStorageDirectory().getPath(),file_path); 
     BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
     bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(),bmOptions); 

     return bitmap; 
    } 

    private void savebitmap() { 
     File file = new File("first"); 
     file_path = file.getAbsolutePath(); 
     try { 
      FileOutputStream fileOutputStream = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 90,fileOutputStream); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void fetchImage(final String url, final ImageView iView) { 
     new AsyncTask<String, Void, Bitmap>() { 
      protected Bitmap doInBackground(String... iUrl) { 

       try { 
        InputStream in = new URL(url).openStream(); 
        bitmap = BitmapFactory.decodeStream(in); 
        savebitmap(); 

       } catch (Exception e) { 
        donwoaledImageFromSD(); 
       } 
       return bitmap; 
      } 

      protected void onPostExecute(Bitmap result) { 
       super.onPostExecute(result); 
       if (iView != null) { 
        iView.setImageBitmap(result); 
       } 
      } 
     }.execute(url); 
    } 
} 
+1

Ÿ不ü使用像滑翔可靠库,Picaso等 –

+0

它是不准使用标准库(Glide,Picaso等)的标准之一 –

+0

请提供一个[mcve]演示你已经尝试了什么,以及你遇到了什么具体问题。 – CommonsWare

回答

0

尝试使用此代码:从imageUrl

public Bitmap getBitmapFromURL(String imageUrl) { 
     try { 
      URL url = new URL(imageUrl); 
      HttpURLConnection connection = (HttpURLConnection) 

    url.openConnection(); 
       connection.setDoInput(true); 
       connection.connect(); 
       InputStream inputStream = connection.getInputStream(); 
       Bitmap imageBitmap = BitmapFactory.decodeStream(inputStream); 
       return imageBitmap; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

用于加载图像的方法,你应该在一个单独的线程中使用它,这样的:

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Bitmap bitmap = getBitmapFromURL(<URL of your image>); 
        imageView.setImageBitmap(bitmap); 

       } catch (Exception e) { 

        e.printStackTrace(); 
        e.getMessage(); 
       } 

      } 
     }).start(); 

但使用毕加索 - 的确是一种更好的方式。

更新:

为了节省Bitmap在外部存储(SD卡)可以使用的方法类似这样的文件:

public static void writeBitmapToSD(String aFileName, Bitmap aBitmap) { 

      if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
       return; 
      } 

      File sdPath = Environment.getExternalStorageDirectory(); 
      File sdFile = new File(sdPath, aFileName); 

      if (sdFile.exists()) { 
       sdFile.delete(); 
      } 

      try { 
       FileOutputStream out = new FileOutputStream(sdFile); 
       aBitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
       out.flush(); 
       out.close(); 
      } catch (Exception e) { 

      } 

     } 

记住,你需要

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

为它。

And for loading `Bitmap` from file on external storage You can use method like that: 

public static Bitmap loadImageFromSD(String aFileName) { 
     Bitmap result = null; 
     if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
      try { 
       FileInputStream fis = new FileInputStream(new File(Environment.getExternalStorageDirectory(), aFileName)); 
       result = BitmapFactory.decodeStream(fis); 
       fis.close(); 
      } catch (FileNotFoundException e) { 
       Log.d(TAG, "loadImageFromSD: " + e.getMessage()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return result; 
    } 

你需要

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

做到这一点。

更新2

方法getBitmapFromURL(),但ImageView应该从UI线程的更新,所以你应该叫getBitmapFromURL(),例如,像这样:

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        final Bitmap bitmap = getBitmapFromURL("<your_image_URL>"); 

        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          imageView.setImageBitmap(bitmap); 
         } 
        }); 


       } catch (Exception e) { 

        e.printStackTrace(); 
        e.getMessage(); 
       } 

      } 
     }).start(); 
+0

感谢您的回答,但我需要保存位图并将其粘贴到imageView。我也知道毕加索是更好的方式。但它是不使用标准库(Glide,Picaso等)的标准之一 –

+0

对不起,但加载图像从网址 - 工作。 –

+0

请看答案的更新2。 –