android从网络获取图片并显示和保存

来源:互联网 发布:淘宝用户名可以更改吗 编辑:程序博客网 时间:2024/06/09 18:50

如何不断获取图片并显示出来,达到视频的效果。

 

代码:

[java] view plaincopy
  1. <span style="font-size:12px;">public class GetPictureFromInternetActivity extends Activity  
  2. {  
  3.     private ImageView imageView;  
  4.     public void 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.       
  16.     public  Bitmap getHttpBitmap(String url)  
  17.     {  
  18.         Bitmap bitmap = null;  
  19.         try  
  20.         {  
  21.             URL pictureUrl = new URL(url);  
  22.             InputStream in = pictureUrl.openStream();  
  23.             bitmap = BitmapFactory.decodeStream(in);  
  24.             in.close();  
  25.                       
  26.         } catch (MalformedURLException e)  
  27.         {  
  28.             e.printStackTrace();  
  29.         } catch (IOException e)  
  30.         {  
  31.             e.printStackTrace();  
  32.         }  
  33.           
  34.         return bitmap;  
  35.     }     
  36.     public void savePicture(Bitmap bitmap)  
  37.     {  
  38.         String pictureName = "/mnt/sdcard/" + "car"+".jpg";  
  39.         File file = new File(pictureName);  
  40.         FileOutputStream out;  
  41.         try  
  42.         {  
  43.             out = new FileOutputStream(file);  
  44.             bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);  
  45.             out.flush();  
  46.             out.close();  
  47.         } catch (FileNotFoundException e)  
  48.         {  
  49.             e.printStackTrace();  
  50.         } catch (IOException e)  
  51.         {  
  52.             e.printStackTrace();  
  53.         }     
  54.     }  
  55.     public boolean onCreateOptionsMenu(Menu menu)  
  56.     {  
  57.         super.onCreateOptionsMenu(menu);  
  58.         MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Exit");  
  59.         item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()  
  60.         {  
  61.             public boolean onMenuItemClick(MenuItem item)  
  62.             {  
  63.                 System.exit(0);  
  64.                 return true;  
  65.             }  
  66.         });  
  67.         return true;  
  68.     }     
  69. }</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打开一个流,最简单实用。

[java] view plaincopy
  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.                       
  11.         } catch (MalformedURLException e)  
  12.         {  
  13.             e.printStackTrace();  
  14.         } catch (IOException e)  
  15.         {  
  16.             e.printStackTrace();  
  17.         }  
  18.           
  19.         return bitmap;  
  20.     }</span>  


选择2:用到类URLConnection打开连接

[java] view plaincopy
  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.                       
  12.         } catch (MalformedURLException e)  
  13.         {  
  14.             e.printStackTrace();  
  15.         } catch (IOException e)  
  16.         {  
  17.             e.printStackTrace();  
  18.         }  
  19.           
  20.         return bitmap;  
  21.     }</span>  


选择3:用到类HttpURLConnection打开连接

[java] view plaincopy
  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.                       
  12.         } catch (MalformedURLException e)  
  13.         {  
  14.             e.printStackTrace();  
  15.         } catch (IOException e)  
  16.         {  
  17.             e.printStackTrace();  
  18.         }  
  19.           
  20.         return bitmap;  
  21.     }</span>  


 

问题2解决方案:

很容易想到开启一个定时器,每隔多久执行一次。

还有一种方案就是开一个线程,在while死循环里面用一个sleep睡一会儿。

 

保存获取到的图片解决方法:

保存图片,自然就涉及到SD卡上文件读写操作,这里是将Bitmap直接写入文件。联想到肯定要用到流,想到这就好办事了,不过还需要了解到BitmapFactory类的强大之处,这里展示了用系统时间为保存文件名称的实现过程,有一个好处就是可以任意保存,无需考虑覆盖和越界问题。

[java] view plaincopy
  1. <p><span style="font-size:18px;">public void 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.       
  23.    } catch (FileNotFoundException e)  
  24.    {  
  25.     e.printStackTrace();  
  26.    } catch (IOException e)  
  27.    {  
  28.       
  29.     e.printStackTrace();  
  30.    }</span></p><p><span style="font-size:18px;">  }  
  31.  }</span></p>  

 

注释:这里用到的bitmap就是上面生成的bitmap。

看到这个问题就感觉像是高中时的综合题目一样,将其分解成简单的问题,将每个小问题解决,那么复杂问题自然就可以解决了。记得前几天看了篇帖子,主题是“当问题被分解成更小的问题后,所有的问题都变得如此简单,而且所有的问题都能这样去分解。”何为牛人,就是遇到复杂问题时,能保持清晰的思路,分析问题的流程,然后将其分解成足够小的问题,一个个解决,最后再组合。就如看到一辆小车,零件之多,有点小复杂吧,然而我们如下去分解:四个轮子和车壳,然后轮子再分而钢圈和轮胎皮, 轮胎皮再分解为内胎和外胎。然后你要做的事就是找到生产轮胎和钢圈的厂家购买这两样组件,然后再利用第三方或者其它工具去组装成车轮。这里轮胎和钢圈相当于Java里面类,第三方或其他组装工具,就如你的代码,将它们和发动机组装再一起就实现了车子跑到的功能。学会分解思维,最常用的就是二分法,当然还得具体问题具体分析。


原创粉丝点击