1. 程式人生 > >android從網路獲取圖片並顯示和儲存

android從網路獲取圖片並顯示和儲存

如何不斷獲取圖片並顯示出來,達到視訊的效果。

程式碼:

  1. <span style="font-size:12px;">publicclass GetPictureFromInternetActivity extends Activity  
  2. {  
  3.     private ImageView imageView;  
  4.     publicvoid onCreate(Bundle savedInstanceState)  
  5.     {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.          String url = "http://img1.gcimg.net/att/day_120330/1203301402671605a8a7994804.png";  
  9. //       String url = "http://www.gezila.com/uploads/allimg/110110/1_110110084544_1.jpg";
  10.         imageView = (ImageView) this.findViewById(R.id.imageView);  
  11.         Bitmap bitmap = getHttpBitmap(url);//從網路獲取圖片
  12.         imageView.setImageBitmap(bitmap);  
  13.         savePicture(bitmap);//儲存圖片到SD卡    
  14.     }  
  15.     public  Bitmap getHttpBitmap(String url)  
  16.     {  
  17.         Bitmap bitmap = null;  
  18.         try
  19.         {  
  20.             URL pictureUrl = new URL(url);  
  21.             InputStream in = pictureUrl.openStream();  
  22.             bitmap = BitmapFactory.decodeStream(in);  
  23.             in.close();  
  24.         } catch (MalformedURLException e)  
  25.         {  
  26.             e.printStackTrace();  
  27.         } catch (IOException e)  
  28.         {  
  29.             e.printStackTrace();  
  30.         }  
  31.         return bitmap;  
  32.     }     
  33.     publicvoid savePicture(Bitmap bitmap)  
  34.     {  
  35.         String pictureName = "/mnt/sdcard/" + "car"+".jpg";  
  36.         File file = new File(pictureName);  
  37.         FileOutputStream out;  
  38.         try
  39.         {  
  40.             out = new FileOutputStream(file);  
  41.             bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);  
  42.             out.flush();  
  43.             out.close();  
  44.         } catch (FileNotFoundException e)  
  45.         {  
  46.             e.printStackTrace();  
  47.         } catch (IOException e)  
  48.         {  
  49.             e.printStackTrace();  
  50.         }     
  51.     }  
  52.     publicboolean onCreateOptionsMenu(Menu menu)  
  53.     {  
  54.         super.onCreateOptionsMenu(menu);  
  55.         MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit");  
  56.         item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()  
  57.         {  
  58.             publicboolean onMenuItemClick(MenuItem item)  
  59.             {  
  60.                 System.exit(0);  
  61.                 returntrue;  
  62.             }  
  63.         });  
  64.         returntrue;  
  65.     }     
  66. }</span>  


注意:1、許可權問題,

涉及網路時的許可權:<uses-permission android:name="android.permission.INTERNET"/>
涉及SD卡讀寫許可權:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

問題分解:

問題1、如何從網路獲取圖片並顯示:
問題2、如何不斷顯示圖片:

擴充套件?如何儲存獲取到的圖片:

問題1解決方案:

看似有三種選擇方案,其實質就一種模式,換湯不換藥。先通過統一資源定位器URl(uniform resource location)獲取一個讀取圖片流,然後將其解壓成Bitmap,最後顯示出來。具體實現程式碼如下:

選擇1:直接類URL開啟一個流,最簡單實用。

  1. <span style="font-size:18px;">  public  Bitmap getHttpBitmap(String url)  
  2.     {  
  3.         Bitmap bitmap = null;  
  4.         try
  5.         {  
  6.             URL pictureUrl = new URL(url);  
  7.             InputStream in = pictureUrl.openStream();  
  8.             bitmap = BitmapFactory.decodeStream(in);  
  9.             in.close();  
  10.         } catch (MalformedURLException e)  
  11.         {  
  12.             e.printStackTrace();  
  13.         } catch (IOException e)  
  14.         {  
  15.             e.printStackTrace();  
  16.         }  
  17.         return bitmap;  
  18.     }</span>  


選擇2:用到類URLConnection開啟連線

  1. <span style="font-size:18px;">  public  Bitmap getHttpBitmap(String url)  
  2.     {  
  3.         Bitmap bitmap = null;  
  4.         try
  5.         {  
  6.             URL pictureUrl = new URL(url);  
  7.             URLConnection con = pictureUrl.openConnection();  
  8.             InputStream in = con.getInputStream();  
  9.             bitmap = BitmapFactory.decodeStream(in);  
  10.             in.close();  
  11.         } catch (MalformedURLException e)  
  12.         {  
  13.             e.printStackTrace();  
  14.         } catch (IOException e)  
  15.         {  
  16.             e.printStackTrace();  
  17.         }  
  18.         return bitmap;  
  19.     }</span>  


選擇3:用到類HttpURLConnection開啟連線

  1. <span style="font-size:18px;">  public  Bitmap getHttpBitmap(String url)  
  2.     {  
  3.         Bitmap bitmap = null;  
  4.         try
  5.         {  
  6.             URL pictureUrl = new URL(url);  
  7.             HttpURLConnection con = (HttpURLConnection) pictureUrl.openConnection();  
  8.             InputStream in = con.getInputStream();  
  9.             bitmap = BitmapFactory.decodeStream(in);  
  10.             in.close();  
  11.         } catch (MalformedURLException e)  
  12.         {  
  13.             e.printStackTrace();  
  14.         } catch (IOException e)  
  15.         {  
  16.             e.printStackTrace();  
  17.         }  
  18.         return bitmap;  
  19.     }</span>  

問題2解決方案:

很容易想到開啟一個定時器,每隔多久執行一次。

還有一種方案就是開一個執行緒,在while死迴圈裡面用一個sleep睡一會兒。

儲存獲取到的圖片解決方法:

儲存圖片,自然就涉及到SD卡上檔案讀寫操作,這裡是將Bitmap直接寫入檔案。聯想到肯定要用到流,想到這就好辦事了,不過還需要了解到BitmapFactory類的強大之處,這裡展示了用系統時間為儲存檔名稱的實現過程,有一個好處就是可以任意儲存,無需考慮覆蓋和越界問題。

  1. <p><span style="font-size:18px;">publicvoid savePicture(Bitmap bitmap)  
  2.  {  
  3.   if (Environment.getExternalStorageState().equals(  
  4.     Environment.MEDIA_MOUNTED))  
  5.   {       
  6.    try
  7.    {  
  8.     File sdcardDir = Environment  
  9.       .getExternalStorageDirectory();  
  10.     Time t = new Time();  
  11.     t.setToNow();</span></p><p><span style="font-size:18px;">    String filename = sdcardDir.getCanonicalPath()  
  12.       + "/DCIM/camera"
  13.       + String.format(  
  14.         "/ReeCam%04d%02d%02d%02d%02d%02d.jpg",  
  15.         t.year, t.month + 1, t.monthDay,  
  16.         t.hour, t.minute, t.second);  
  17.     File file = new File(filename);  
  18.     FileOutputStream out = new FileOutputStream(file);  
  19.     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);  
  20.     out.flush();  
  21.     out.close();  
  22.    } catch (FileNotFoundException e)  
  23.    {  
  24.     e.printStackTrace();  
  25.    } catch (IOException e)  
  26.    {  
  27.     e.printStackTrace();  
  28.    }</span></p><p><span style="font-size:18px;">  }  
  29.  }</span></p>  

註釋:這裡用到的bitmap就是上面生成的bitmap。

看到這個問題就感覺像是高中時的綜合題目一樣,將其分解成簡單的問題,將每個小問題解決,那麼複雜問題自然就可以解決了。記得前幾天看了篇帖子,主題是“當問題被分解成更小的問題後,所有的問題都變得如此簡單,而且所有的問題都能這樣去分解。”何為牛人,就是遇到複雜問題時,能保持清晰的思路,分析問題的流程,然後將其分解成足夠小的問題,一個個解決,最後再組合。就如看到一輛小車,零件之多,有點小複雜吧,然而我們如下去分解:四個輪子和車殼,然後輪子再分而鋼圈和輪胎皮, 輪胎皮再分解為內胎和外胎。然後你要做的事就是找到生產輪胎和鋼圈的廠家購買這兩樣元件,然後再利用第三方或者其它工具去組裝成車輪。這裡輪胎和鋼圈相當於Java裡面類,第三方或其他組裝工具,就如你的程式碼,將它們和發動機組裝再一起就實現了車子跑到的功能。學會分解思維,最常用的就是二分法,當然還得具體問題具體分析。