博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android从网络获取图片并显示和保存
阅读量:4140 次
发布时间:2019-05-25

本文共 4707 字,大约阅读时间需要 15 分钟。

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

 

代码:

[java]
  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]
  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]
  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]
  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]
  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里面类,第三方或其他组装工具,就如你的代码,将它们和发动机组装再一起就实现了车子跑到的功能。学会分解思维,最常用的就是二分法,当然还得具体问题具体分析。

转载地址:http://gohvi.baihongyu.com/

你可能感兴趣的文章
我赞同Bob Quinn和Dave Shute的说法: WinSock中的SO_REUSEADDR就是个鸡肋, 最好不用它
查看>>
为什么TCP服务端需要调用bind函数而客户端通常不需要呢?
查看>>
什么是socket的name? 怎样给socket取一个name? --- 以生宝宝并取名的过程再谈socket、name、bind和socket name
查看>>
如何偷窥到socket对应的内核缓冲区中有什么数据? 有多少数据?---利用recv的MSG_PEEK和ioctlsocket的FIONREAD
查看>>
《Windows Sockets 网络编程》. Bob Quinn & Dave Shuttle (非常实用的Windows编程书籍)
查看>>
为什么有时ping不通www.baidu.com但可以访问www.baidu.com网页?
查看>>
从telnet www.baidu.com 80 聊聊我经历过的tcp“三次握手”失败---顺便验证telnet是基于tcp协议的
查看>>
C++智能指针auto_ptr源码完全解析---以微软auto_ptr为例来探讨auto_ptr的用法
查看>>
我修改的问题单居然回归不通过?---趣闻二则
查看>>
模拟linux的shell---顺便复习一下fork,execlp和waitpid函数
查看>>
如何获取linux shell中ls进程的进程号?---有趣的问题!
查看>>
利用thread来简要模拟signal函数功能
查看>>
linux shell “永久环境变量”、“临时环境变量”和“普通变量“之完全解读
查看>>
配置文件的重要性------轻化操作
查看>>
cp后文件时间会变, mv后文件时间不会变化------定位一个低概率core问题时, 差点误导了自己
查看>>
又是缓存惹的祸!!!
查看>>
为什么要实现程序指令和程序数据的分离?
查看>>
我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
查看>>
一起来看看protobuf中容易引起bug的一个细节
查看>>
无protobuf协议情况下的反序列化------貌似无解, 其实有解!
查看>>