android 下载保存图片

简介: 引用:http://www.linuxidc.com/Linux/2011-06/37233.htm 1.java代码,下载图片的主程序 先实现显示图片,然后点击下载图片按钮,执行下载功能。 从网络上取得的图片,生成Bitmap时有两种方法,一种是先转换为byte[],再生成bitmap;一种是直接用InputStream生成bitmap。

引用:http://www.linuxidc.com/Linux/2011-06/37233.htm

1.java代码,下载图片的主程序

先实现显示图片,然后点击下载图片按钮,执行下载功能。

从网络上取得的图片,生成Bitmap时有两种方法,一种是先转换为byte[],再生成bitmap;一种是直接用InputStream生成bitmap。

  1. publicclassAndroidTest2_3_3 extends Activity {   
  2. privatefinalstatic String TAG = "AndroidTest2_3_3";   
  3. privatefinalstatic String ALBUM_PATH    
  4.             = Environment.getExternalStorageDirectory() + "/download_test/";   
  5. private ImageView imageView;   
  6. private Button btnSave;   
  7. private ProgressDialog myDialog = null;   
  8. private Bitmap bitmap;   
  9. private String fileName;   
  10. private String message;   
  11. @Override
  12. protectedvoid onCreate(Bundle savedInstanceState) {   
  13. super.onCreate(savedInstanceState);   
  14.         setContentView(R.layout.main);   
  15.         imageView = (ImageView)findViewById(R.id.imgSource);   
  16.         btnSave = (Button)findViewById(R.id.btnSave);   
  17.         String filePath = "http://hi.csdn.net/attachment/201105/21/134671_13059532779c5u.jpg";   
  18.         fileName = "test.jpg";   
  19. try {   
  20. //////////////// 取得的是byte数组, 从byte数组生成bitmap 
  21. byte[] data = getImage(filePath);         
  22. if(data!=null){         
  23.                 bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);// bitmap       
  24.                 imageView.setImageBitmap(bitmap);// display image       
  25.             }else{         
  26.                 Toast.makeText(AndroidTest2_3_3.this"Image error!"1).show();         
  27.             }   
  28. //////////////////////////////////////////////////////// 
  29. //******** 取得的是InputStream,直接从InputStream生成bitmap ***********/ 
  30.             bitmap = BitmapFactory.decodeStream(getImageStream(filePath));   
  31. if (bitmap != null) {   
  32.                 imageView.setImageBitmap(bitmap);// display image 
  33.             }   
  34. //********************************************************************/ 
  35.             Log.d(TAG, "set image ...");   
  36.         } catch (Exception e) {      
  37.             Toast.makeText(AndroidTest2_3_3.this,"Newwork error!"1).show();      
  38.             e.printStackTrace();      
  39.         }      
  40. // 下载图片 
  41.         btnSave.setOnClickListener(new Button.OnClickListener(){   
  42. publicvoid onClick(View v) {   
  43.                 myDialog = ProgressDialog.show(AndroidTest2_3_3.this"保存图片""图片正在保存中,请稍等..."true);   
  44. new Thread(saveFileRunnable).start();   
  45.         }   
  46.         });   
  47.     }   
  48. /**   
  49.      * Get image from newwork   
  50.      * @param path The path of image   
  51.      * @return byte[] 
  52.      * @throws Exception   
  53.      */
  54. publicbyte[] getImage(String path) throws Exception{      
  55.         URL url = new URL(path);      
  56.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();      
  57.         conn.setConnectTimeout(5 * 1000);      
  58.         conn.setRequestMethod("GET");      
  59.         InputStream inStream = conn.getInputStream();      
  60. if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){      
  61. return readStream(inStream);      
  62.         }      
  63. returnnull;      
  64.     }      
  65. /**   
  66.      * Get image from newwork   
  67.      * @param path The path of image   
  68.      * @return InputStream 
  69.      * @throws Exception   
  70.      */
  71. public InputStream getImageStream(String path) throws Exception{      
  72.         URL url = new URL(path);      
  73.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();      
  74.         conn.setConnectTimeout(5 * 1000);      
  75.         conn.setRequestMethod("GET");   
  76. if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){      
  77. return conn.getInputStream();         
  78.         }      
  79. returnnull;    
  80.     }   
  81. /**   
  82.      * Get data from stream  
  83.      * @param inStream   
  84.      * @return byte[] 
  85.      * @throws Exception   
  86.      */
  87. publicstaticbyte[] readStream(InputStream inStream) throws Exception{      
  88.         ByteArrayOutputStream outStream = new ByteArrayOutputStream();      
  89. byte[] buffer = newbyte[1024];      
  90. int len = 0;      
  91. while( (len=inStream.read(buffer)) != -1){      
  92.             outStream.write(buffer, 0, len);      
  93.         }      
  94.         outStream.close();      
  95.         inStream.close();      
  96. return outStream.toByteArray();      
  97.     }    
  98. /** 
  99.      * 保存文件 
  100.      * @param bm 
  101.      * @param fileName 
  102.      * @throws IOException 
  103.      */
  104. publicvoid saveFile(Bitmap bm, String fileName) throws IOException {   
  105.         File dirFile = new File(ALBUM_PATH);   
  106. if(!dirFile.exists()){   
  107.             dirFile.mkdir();   
  108.         }   
  109.         File myCaptureFile = new File(ALBUM_PATH + fileName);   
  110.         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));   
  111.         bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);   
  112.         bos.flush();   
  113.         bos.close();   
  114.     }   
  115. private Runnable saveFileRunnable = new Runnable(){   
  116. @Override
  117. publicvoid run() {   
  118. try {   
  119.                 saveFile(bitmap, fileName);   
  120.                 message = "图片保存成功!";   
  121.             } catch (IOException e) {   
  122.                 message = "图片保存失败!";   
  123.                 e.printStackTrace();   
  124.             }   
  125.             messageHandler.sendMessage(messageHandler.obtainMessage());   
  126.         }   
  127.     };   
  128. private Handler messageHandler = new Handler() {   
  129. @Override
  130. publicvoid handleMessage(Message msg) {   
  131.             myDialog.dismiss();   
  132.             Log.d(TAG, message);   
  133.             Toast.makeText(AndroidTest2_3_3.this, message, Toast.LENGTH_SHORT).show();   
  134.         }   
  135.     };   
  136. }  

 

 

2.main.xml文件,只有一个button和一个ImageView

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     Android:orientation="vertical"  
  4.     Android:layout_width="fill_parent"  
  5.     Android:layout_height="fill_parent"  
  6.     >  
  7.     <Button  
  8.         Android:id="@+id/btnSave"  
  9.         Android:layout_width="wrap_content"    
  10.         Android:layout_height="wrap_content"  
  11.         Android:text="保存图片"  
  12.         />  
  13.     <ImageView  
  14.         Android:id="@+id/imgSource"  
  15.         Android:layout_width="wrap_content"    
  16.         Android:layout_height="wrap_content"    
  17.         Android:adjustViewBounds="true"  
  18.         />  
  19. </LinearLayout>  

 

3.在mainfest文件中增加互联网权限和写sd卡的权限

  1. <uses-permission Android:name="android.permission.INTERNET" />    
  2. <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  3.    <uses-permission Android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  

 

预览图:

相关文章
|
6月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
4月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
244 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
2月前
|
Java 程序员 开发工具
Android|修复阿里云播放器下载不回调的问题
虽然 GC 带来了很多便利,但在实际编码时,我们也需要注意对象的生命周期管理,该存活的存活,该释放的释放,避免因为 GC 导致的问题。
35 2
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
68 20
Android经典面试题之图片Bitmap怎么做优化
|
4月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
481 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
4月前
|
API 开发工具 Android开发
Android源码下载
Android源码下载
493 0
|
4月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
4月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
240 4
|
4月前
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
121 0