本文实现功能:先显示图片,然后点击下载图片按钮,执行下载功能,并保存到SD卡的指定目录。
从网络上取得的图片,生成Bitmap时有两种方法,一种是先转换为byte[],再生成bitmap,另一种是直接用InputStream生成bitmap。
activity_main.xml,只有一个按钮和一个图片
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存图片" /> <ImageView android:id="@+id/imgSource" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" /> </LinearLayout>
对应的MainActivity代码
public class MainActivity extends Activity { private final static String ALBUM_PATH = Environment .getExternalStorageDirectory() + "/download_test/"; private ImageView mImageView; private Button mBtnSave; private ProgressDialog mSaveDialog = null; private Bitmap mBitmap; private String mFileName; private String mSaveMessage; private String filePath = "图片地址"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImageView = (ImageView) findViewById(R.id.imgSource); mBtnSave = (Button) findViewById(R.id.btnSave); new Thread(connectNet).start(); // 下载图片 mBtnSave.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { mSaveDialog = ProgressDialog.show(MainActivity.this, "保存图片", "图片正在保存中,请稍等...", true); new Thread(saveFileRunnable).start(); } }); } // 方法1 public byte[] getImage(String path) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); InputStream inStream = conn.getInputStream(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { return readStream(inStream); } return null; } public static byte[] readStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } outStream.close(); inStream.close(); return outStream.toByteArray(); } // 方法2 public InputStream getImageStream(String path) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { return conn.getInputStream(); } return null; } public void saveFile(Bitmap bm, String fileName) throws IOException { File dirFile = new File(ALBUM_PATH); if (!dirFile.exists()) { dirFile.mkdir(); } File myCaptureFile = new File(ALBUM_PATH + fileName); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(myCaptureFile)); bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close(); } private Runnable saveFileRunnable = new Runnable() { @Override public void run() { try { saveFile(mBitmap, mFileName); mSaveMessage = "图片保存成功"; } catch (IOException e) { mSaveMessage = "图片保存失败"; e.printStackTrace(); } messageHandler.sendMessage(messageHandler.obtainMessage()); } }; private Handler messageHandler = new Handler() { @Override public void handleMessage(Message msg) { mSaveDialog.dismiss(); Toast.makeText(MainActivity.this, mSaveMessage, Toast.LENGTH_SHORT) .show(); } }; // 连接网络 4.0中不允许在主线程中访问网络,需要在子线程中访问 private Runnable connectNet = new Runnable() { @Override public void run() { try { mFileName = "test.jpg"; // 以下是取得图片的两种方法 // 方法1:取得的是byte数组, 从byte数组生成bitmap byte[] data = getImage(filePath); if (data != null) { mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } else { Toast.makeText(MainActivity.this, "Image error!", 1).show(); } // 方法2:取得的是InputStream,直接从InputStream生成bitmap mBitmap = BitmapFactory.decodeStream(getImageStream(filePath)); // 发送消息,通知handler在主线程中更新UI connectHanlder.sendEmptyMessage(0); } catch (Exception e) { Toast.makeText(MainActivity.this, "无法连接网络", 1).show(); e.printStackTrace(); } } }; private Handler connectHanlder = new Handler() { @Override public void handleMessage(Message msg) { // 更新UI,显示图片 if (mBitmap != null) { mImageView.setImageBitmap(mBitmap); } } }; }
AndroidManifest.xml增加以下权限配置
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
相关推荐
在Android应用开发中,批量下载网络图片并保存到SD卡是一项常见的需求,特别是在构建图片浏览类应用时。本文将详细讲解如何实现这一功能,并展示如何将下载的图片以ViewPager的形式展示给用户。 首先,我们需要理解...
在Android开发中,异步下载图片并保存到SD卡是一个常见的需求,特别是在构建涉及大量图像显示的应用时。这个过程涉及到网络请求、线程管理、内存和磁盘缓存策略等多个技术点。以下是对这个主题的详细阐述: 1. **...
本项目专注于实现从网络请求图片并将其保存到设备的外部存储(通常称为SD卡),同时在应用界面中展示这些图片。下面我们将深入探讨这个过程中的关键知识点。 1. **Android权限管理**: 在Android 6.0(API级别23)...
在这个项目中,STM32F407微控制器(MCU)与ESP8266 Wi-Fi模块协同工作,实现了图片的无线传输并将其保存至SD卡。下面我们将详细探讨这一技术实现的关键知识点。 首先,**STM32F407**是意法半导体的一款高性能、低...
标题“图片保存到SD卡”涉及的是Android平台上关于图片存储的知识点。在Android系统中,开发者经常需要处理图片的保存和读取,特别是在用户需要保存应用内生成的图片或者下载的图片时。以下是对这个主题的详细解释:...
根据提供的文件信息,本文将详细解释如何在Android应用中使用Java语言下载图片并保存到SD卡上。这一过程包括了网络请求、图片处理以及文件存储等环节。 ### 一、项目背景与概述 #### 1. 项目目标 该项目旨在通过...
总结来说,实现“android下载图片保存SD卡”涉及的关键知识点包括: 1. 网络请求:使用`HttpURLConnection`或第三方库(如OkHttp)发起HTTP GET请求。 2. 文件操作:创建输出流,将网络数据写入SD卡指定路径的文件。...
在Android开发中,图片滤镜渲染并保存到SD卡是一个常见的需求,这涉及到图像处理、图形渲染以及存储管理等多个方面。下面将详细讲解这个过程涉及的关键知识点。 首先,我们需要了解Android中的图片处理基础。...
具体功能:将拍摄的照片保存到SDcard中 具体需求: 1.图片名保存格式:图片名称_手机型号_随机4位数.jpg 2.将图片分解,压缩,显示 3.写入SDCard卡保存 具体实现: 1.定义布局文件 2.编写业务代码
在Android开发中,从网络获取图片并保存到SD卡是一个常见的需求,这涉及到网络编程、文件操作以及存储权限等多个知识点。下面将详细讲解这个过程涉及的技术点。 首先,我们需要使用Android的网络API来获取网络上的...
在Android应用开发中,"下载网络图片展示和保存到SD卡"是一个常见的需求。这个话题主要涉及以下几个关键知识点: 1. **网络请求**:首先,我们需要获取图片的URL,然后通过HTTP或HTTPS协议来发送网络请求下载图片。...
本文将深入探讨二维码的生成与扫描,特别是在嵌入图片以及将二维码图片保存到SD卡方面的实现。 一、二维码基本原理 二维码(Quick Response Code)由日本Denso Wave公司于1994年发明,其核心是将数据以特定的矩阵...
在Android开发中,经常会遇到需要将拍照后的图片保存到SD卡的需求。本篇文章将详细解释如何实现这一功能,并提供具体的代码示例。 #### 一、环境判断与权限检查 在进行图片保存之前,首先需要确保设备已经插入了SD...
使用`MediaStore.Images.Media.insertImage()`方法可以直接将图片保存到公共图库,并返回一个可持久化的`Uri`。 以上就是Android应用中相机、相册获取图片并保存到SD卡的核心技术点。通过理解和实践这些知识点,...
在Android中,通常会将图片保存到公共的外部存储目录,这样系统相册应用可以检测到并显示出来: ```java private void saveImageToGallery(byte[] imageData) { File storageDir = Environment....
在本文中,我们将深入探讨如何使用RTThread操作系统、STM32F407VE微控制器、ESP8226 Wi-Fi模块以及SD卡,实现从网络下载文件并将其存储到SD卡上的完整流程。这个项目涉及到嵌入式系统开发中的多个关键环节,包括网络...
4. 保存手势图片到SD卡:在Android中,你需要检查SD卡是否可用,然后获取到外部存储的写入权限。使用Bitmap.createBitmap()创建一个Bitmap对象,基于你的Canvas的大小。然后调用Canvas的draw()方法将手势绘制到...
异步将网络图片显示,显示之后,将其复制到sd卡, 复制网络图片的原理是 将drawable 转为byte 数组 再用 FileOutputStream fos fos.write(myByte); 写如sd卡 复制好的图片目录是 sd/tese/a.jpg
在Android开发中,网络获取图片并将其保存到SD卡上是一项常见的任务,这对于应用的多媒体功能,如加载网络壁纸或缓存用户头像等至关重要。本文将深入探讨如何实现这一过程,并讨论如何从SD卡中读取这些图片。 首先...