国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現從網絡獲取圖片顯示并保存到SD卡的方法

2020-04-11 11:12:40
字體:
來源:轉載
供稿:網友

本文實例講述了Android實現從網絡獲取圖片顯示并保存到SD卡的方法。分享給大家供大家參考,具體如下:

問題:

如何不斷獲取圖片并顯示出來,達到視頻的效果?

代碼:

public class GetPictureFromInternetActivity extends Activity {  private ImageView imageView;  public void 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;  }  public void 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();  }  }  public boolean onCreateOptionsMenu(Menu menu)  {  super.onCreateOptionsMenu(menu);  MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit");  item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()  {   public boolean onMenuItemClick(MenuItem item)   {   System.exit(0);   return true;   }  });  return true;  } }

注意: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打開一個流,最簡單實用。

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; }

選擇2:用到類URLConnection打開連接

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; }

選擇3:用到類HttpURLConnection打開連接

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; }

問題2解決方案:

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

還有一種方案就是開一個線程,在while死循環里面用一個sleep睡一會兒。

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

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

public void savePicture(Bitmap bitmap) {  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  {  try  {  File sdcardDir = Environment  .getExternalStorageDirectory();  Time t = new Time();  t.setToNow(); 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();  } } }

注釋:這里用到的bitmap就是上面生成的bitmap。

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

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜章县| 宁都县| 濮阳市| 故城县| 临夏县| 克东县| 老河口市| 昌都县| 容城县| 长宁区| 资阳市| 区。| 四川省| 泸州市| 榆树市| 玛多县| 威海市| 久治县| 万源市| 九龙坡区| 永兴县| 冀州市| 九台市| 肇东市| 鄯善县| 安义县| 汝南县| 西乌珠穆沁旗| 绥芬河市| 山西省| 合作市| 察雅县| 图们市| 定远县| 遵化市| 兰坪| 绵竹市| 万州区| 南宫市| 汉沽区| 右玉县|