android從網路獲取圖片並顯示和儲存
如何不斷獲取圖片並顯示出來,達到視訊的效果。
程式碼:
- <span style="font-size:12px;">publicclass GetPictureFromInternetActivity extends Activity
- {
- private ImageView imageView;
- publicvoid onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- String url = "http://img1.gcimg.net/att/day_120330/1203301402671605a8a7994804.png";
- // String url = "http://www.gezila.com/uploads/allimg/110110/1_110110084544_1.jpg";
- imageView = (ImageView) this.findViewById(R.id.imageView);
- Bitmap bitmap = getHttpBitmap(url);//從網路獲取圖片
- imageView.setImageBitmap(bitmap);
- savePicture(bitmap);//儲存圖片到SD卡
- }
- public Bitmap getHttpBitmap(String url)
- {
- Bitmap bitmap = null;
- try
- {
- URL pictureUrl = new URL(url);
- InputStream in = pictureUrl.openStream();
- bitmap = BitmapFactory.decodeStream(in);
- in.close();
- } catch (MalformedURLException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- return bitmap;
- }
- publicvoid savePicture(Bitmap bitmap)
- {
- String pictureName = "/mnt/sdcard/" + "car"+".jpg";
- File file = new File(pictureName);
- FileOutputStream out;
- try
- {
- out = new FileOutputStream(file);
- bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
- out.flush();
- out.close();
- } catch (FileNotFoundException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- publicboolean onCreateOptionsMenu(Menu menu)
- {
- super.onCreateOptionsMenu(menu);
- MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit");
- item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()
- {
- publicboolean onMenuItemClick(MenuItem item)
- {
- System.exit(0);
- returntrue;
- }
- });
- returntrue;
- }
- }</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開啟一個流,最簡單實用。
- <span style="font-size:18px;"> public Bitmap getHttpBitmap(String url)
- {
- Bitmap bitmap = null;
- try
- {
- URL pictureUrl = new URL(url);
- InputStream in = pictureUrl.openStream();
- bitmap = BitmapFactory.decodeStream(in);
- in.close();
- } catch (MalformedURLException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- return bitmap;
- }</span>
選擇2:用到類URLConnection開啟連線
- <span style="font-size:18px;"> public Bitmap getHttpBitmap(String url)
- {
- Bitmap bitmap = null;
- try
- {
- URL pictureUrl = new URL(url);
- URLConnection con = pictureUrl.openConnection();
- InputStream in = con.getInputStream();
- bitmap = BitmapFactory.decodeStream(in);
- in.close();
- } catch (MalformedURLException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- return bitmap;
- }</span>
選擇3:用到類HttpURLConnection開啟連線
- <span style="font-size:18px;"> public Bitmap getHttpBitmap(String url)
- {
- Bitmap bitmap = null;
- try
- {
- URL pictureUrl = new URL(url);
- HttpURLConnection con = (HttpURLConnection) pictureUrl.openConnection();
- InputStream in = con.getInputStream();
- bitmap = BitmapFactory.decodeStream(in);
- in.close();
- } catch (MalformedURLException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- return bitmap;
- }</span>
問題2解決方案:
很容易想到開啟一個定時器,每隔多久執行一次。
還有一種方案就是開一個執行緒,在while死迴圈裡面用一個sleep睡一會兒。
儲存獲取到的圖片解決方法:
儲存圖片,自然就涉及到SD卡上檔案讀寫操作,這裡是將Bitmap直接寫入檔案。聯想到肯定要用到流,想到這就好辦事了,不過還需要了解到BitmapFactory類的強大之處,這裡展示了用系統時間為儲存檔名稱的實現過程,有一個好處就是可以任意儲存,無需考慮覆蓋和越界問題。
- <p><span style="font-size:18px;">publicvoid savePicture(Bitmap bitmap)
- {
- if (Environment.getExternalStorageState().equals(
- Environment.MEDIA_MOUNTED))
- {
- try
- {
- File sdcardDir = Environment
- .getExternalStorageDirectory();
- Time t = new Time();
- t.setToNow();</span></p><p><span style="font-size:18px;"> String filename = sdcardDir.getCanonicalPath()
- + "/DCIM/camera"
- + String.format(
- "/ReeCam%04d%02d%02d%02d%02d%02d.jpg",
- t.year, t.month + 1, t.monthDay,
- t.hour, t.minute, t.second);
- File file = new File(filename);
- FileOutputStream out = new FileOutputStream(file);
- bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
- out.flush();
- out.close();
- } catch (FileNotFoundException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }</span></p><p><span style="font-size:18px;"> }
- }</span></p>
註釋:這裡用到的bitmap就是上面生成的bitmap。
看到這個問題就感覺像是高中時的綜合題目一樣,將其分解成簡單的問題,將每個小問題解決,那麼複雜問題自然就可以解決了。記得前幾天看了篇帖子,主題是“當問題被分解成更小的問題後,所有的問題都變得如此簡單,而且所有的問題都能這樣去分解。”何為牛人,就是遇到複雜問題時,能保持清晰的思路,分析問題的流程,然後將其分解成足夠小的問題,一個個解決,最後再組合。就如看到一輛小車,零件之多,有點小複雜吧,然而我們如下去分解:四個輪子和車殼,然後輪子再分而鋼圈和輪胎皮, 輪胎皮再分解為內胎和外胎。然後你要做的事就是找到生產輪胎和鋼圈的廠家購買這兩樣元件,然後再利用第三方或者其它工具去組裝成車輪。這裡輪胎和鋼圈相當於Java裡面類,第三方或其他組裝工具,就如你的程式碼,將它們和發動機組裝再一起就實現了車子跑到的功能。學會分解思維,最常用的就是二分法,當然還得具體問題具體分析。