2016-10-30 160 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。 –