`
jsntghf
  • 浏览: 2532522 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

下载图片并保存到SD卡中

阅读更多

本文实现功能:先显示图片,然后点击下载图片按钮,执行下载功能,并保存到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" />

 

分享到:
评论

相关推荐

    批量下载网络图片并且保存到SD卡后显示viewpage

    在Android应用开发中,批量下载网络图片并保存到SD卡是一项常见的需求,特别是在构建图片浏览类应用时。本文将详细讲解如何实现这一功能,并展示如何将下载的图片以ViewPager的形式展示给用户。 首先,我们需要理解...

    异步下载图片保存到sd卡

    在Android开发中,异步下载图片并保存到SD卡是一个常见的需求,特别是在构建涉及大量图像显示的应用时。这个过程涉及到网络请求、线程管理、内存和磁盘缓存策略等多个技术点。以下是对这个主题的详细阐述: 1. **...

    Android实现图片下载并保存SD卡

    本项目专注于实现从网络请求图片并将其保存到设备的外部存储(通常称为SD卡),同时在应用界面中展示这些图片。下面我们将深入探讨这个过程中的关键知识点。 1. **Android权限管理**: 在Android 6.0(API级别23)...

    STM32F407+ESP8266图片传输并保存至SD卡

    在这个项目中,STM32F407微控制器(MCU)与ESP8266 Wi-Fi模块协同工作,实现了图片的无线传输并将其保存至SD卡。下面我们将详细探讨这一技术实现的关键知识点。 首先,**STM32F407**是意法半导体的一款高性能、低...

    图片保存到sd卡

    标题“图片保存到SD卡”涉及的是Android平台上关于图片存储的知识点。在Android系统中,开发者经常需要处理图片的保存和读取,特别是在用户需要保存应用内生成的图片或者下载的图片时。以下是对这个主题的详细解释:...

    下载图片保存到SD卡上

    根据提供的文件信息,本文将详细解释如何在Android应用中使用Java语言下载图片并保存到SD卡上。这一过程包括了网络请求、图片处理以及文件存储等环节。 ### 一、项目背景与概述 #### 1. 项目目标 该项目旨在通过...

    android下载图片保存SD卡

    总结来说,实现“android下载图片保存SD卡”涉及的关键知识点包括: 1. 网络请求:使用`HttpURLConnection`或第三方库(如OkHttp)发起HTTP GET请求。 2. 文件操作:创建输出流,将网络数据写入SD卡指定路径的文件。...

    Android 图片滤镜渲染并保存到SD卡

    在Android开发中,图片滤镜渲染并保存到SD卡是一个常见的需求,这涉及到图像处理、图形渲染以及存储管理等多个方面。下面将详细讲解这个过程涉及的关键知识点。 首先,我们需要了解Android中的图片处理基础。...

    拍照并保存到SDCard

    具体功能:将拍摄的照片保存到SDcard中 具体需求: 1.图片名保存格式:图片名称_手机型号_随机4位数.jpg 2.将图片分解,压缩,显示 3.写入SDCard卡保存 具体实现: 1.定义布局文件 2.编写业务代码

    Android 从网络上获取图片保存到SD卡中

    在Android开发中,从网络获取图片并保存到SD卡是一个常见的需求,这涉及到网络编程、文件操作以及存储权限等多个知识点。下面将详细讲解这个过程涉及的技术点。 首先,我们需要使用Android的网络API来获取网络上的...

    下载网络图片展示和保存到SD卡

    在Android应用开发中,"下载网络图片展示和保存到SD卡"是一个常见的需求。这个话题主要涉及以下几个关键知识点: 1. **网络请求**:首先,我们需要获取图片的URL,然后通过HTTP或HTTPS协议来发送网络请求下载图片。...

    二维码扫描和生成,生成带图片的,二维码图片保存到sd卡

    本文将深入探讨二维码的生成与扫描,特别是在嵌入图片以及将二维码图片保存到SD卡方面的实现。 一、二维码基本原理 二维码(Quick Response Code)由日本Denso Wave公司于1994年发明,其核心是将数据以特定的矩阵...

    将拍照后的图片指定路径保存在SD卡上

    在Android开发中,经常会遇到需要将拍照后的图片保存到SD卡的需求。本篇文章将详细解释如何实现这一功能,并提供具体的代码示例。 #### 一、环境判断与权限检查 在进行图片保存之前,首先需要确保设备已经插入了SD...

    Android相机、相册获取图片显示并保存到SD卡

    使用`MediaStore.Images.Media.insertImage()`方法可以直接将图片保存到公共图库,并返回一个可持久化的`Uri`。 以上就是Android应用中相机、相册获取图片并保存到SD卡的核心技术点。通过理解和实践这些知识点,...

    Android 下载图片保存到相册

    在Android中,通常会将图片保存到公共的外部存储目录,这样系统相册应用可以检测到并显示出来: ```java private void saveImageToGallery(byte[] imageData) { File storageDir = Environment....

    rtthread + STM32F407VE + esp8266 +SD卡 从网络下载文件存到SD卡中

    在本文中,我们将深入探讨如何使用RTThread操作系统、STM32F407VE微控制器、ESP8226 Wi-Fi模块以及SD卡,实现从网络下载文件并将其存储到SD卡上的完整流程。这个项目涉及到嵌入式系统开发中的多个关键环节,包括网络...

    绘制手势并保存图片到SD卡

    4. 保存手势图片到SD卡:在Android中,你需要检查SD卡是否可用,然后获取到外部存储的写入权限。使用Bitmap.createBitmap()创建一个Bitmap对象,基于你的Canvas的大小。然后调用Canvas的draw()方法将手势绘制到...

    异步显示网络图片,并将图片保存到sd卡

    异步将网络图片显示,显示之后,将其复制到sd卡, 复制网络图片的原理是 将drawable 转为byte 数组 再用 FileOutputStream fos fos.write(myByte); 写如sd卡 复制好的图片目录是 sd/tese/a.jpg

    android 网络获取图片并在SD卡上保存与读取

    在Android开发中,网络获取图片并将其保存到SD卡上是一项常见的任务,这对于应用的多媒体功能,如加载网络壁纸或缓存用户头像等至关重要。本文将深入探讨如何实现这一过程,并讨论如何从SD卡中读取这些图片。 首先...

Global site tag (gtag.js) - Google Analytics