Android 下载网络图片保存到本地

通过网络地址获取网络图片,点击下载将图片显示出来,然后点击图片将图片保存到本地。

首先需要在manifest上添加一些权限:

<!-- 访问网络的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 文件读取的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 向SD卡中创建或者删除的权限。 -->
<uses-permission android:name="andorid.permission.MONUN_UNMOUNT_FILESYSTEMS"/>

package com.xjw.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{

	Button content;
	ImageView image;
	Bitmap bitmap;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		content=(Button)findViewById(R.id.content);
		image=(ImageView)findViewById(R.id.image);
		
		content.setOnClickListener(this);;
		image.setOnClickListener(this);;
	}
	
	/**
	 * 获取网络图片
	 * @param imageurl 图片网络地址
	 * @return Bitmap 返回位图
	 */
	public Bitmap GetImageInputStream(String imageurl){
		URL url;
		HttpURLConnection connection=null;
		Bitmap bitmap=null;
		try {
			url = new URL(imageurl);
			connection=(HttpURLConnection)url.openConnection();
			connection.setConnectTimeout(6000); //超时设置
			connection.setDoInput(true); 
			connection.setUseCaches(false); //设置不使用缓存
			InputStream inputStream=connection.getInputStream();
			bitmap=BitmapFactory.decodeStream(inputStream);
			inputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bitmap;
	}
	
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.content:
			//加入网络图片地址
			new Task().execute("http://pic.4j4j.cn/upload/pic/20130617/55695c3c95.jpg");
			break;
			
		case R.id.image:
			//点击图片后将图片保存到SD卡跟目录下的Test文件夹内
			SavaImage(bitmap, Environment.getExternalStorageDirectory().getPath()+"/Test");
			Toast.makeText(getBaseContext(), "图片保存", Toast.LENGTH_SHORT).show();
			break;
			
		default:
			break;
		}
	}
	
	Handler handler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			if(msg.what==0x123){
				image.setImageBitmap(bitmap);
			}
		};
	};
	
	
	/**
	 * 异步线程下载图片
	 *
	 */
	class Task extends AsyncTask<String, Integer, Void>{

		protected Void doInBackground(String... params) {
			bitmap=GetImageInputStream((String)params[0]);
			return null;
		}
		
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
			Message message=new Message();
			message.what=0x123;
			handler.sendMessage(message);
		}
		
	}
	
	/**
	 * 保存位图到本地
	 * @param bitmap
	 * @param path 本地路径
	 * @return void
	 */
	public void SavaImage(Bitmap bitmap, String path){
		File file=new File(path);
		FileOutputStream fileOutputStream=null;
		//文件夹不存在,则创建它
		if(!file.exists()){
			file.mkdir();
		}
		try {
			fileOutputStream=new FileOutputStream(path+"/"+System.currentTimeMillis()+".png");
			bitmap.compress(Bitmap.CompressFormat.JPEG, 100,fileOutputStream);
			fileOutputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


发布了4 篇原创文章 · 获赞 0 · 访问量 2万+
展开阅读全文

android异步获取图片并且本地存储的后续问题

11-26

我已经实现了头像图片的异步加载以及头像图片的下载及本地保存。 实现方法及源代码请见我的博文:[图片的异步加载及图片本地缓存][1] [1]: http://blog.csdn.net/jkingcl/article/details/8141646 现在出现了一个后续的问题由于是头像,所以我使用了用户的ID作为头像的名称,例如现在我有3个好友分别是user1,user2,user3,以及我自己myUser. 那么第一次读取过后我本地的头像就为user1.jpg,user2.jpg,user3.jpg,myUser.jpg. 好了问题来了,当我的好友们的头像发生变化的时候,我去读取的时候首先检查的是本地是否有这样图片,那么本地是有图片的,则不会去服务器下载了,但是就没有办法获取到最新的头像了。 当然在我的app里面有清除本地缓存的功能,但是不可能因为一个人头像变化就把所有的头像图片资源全部清除了吧。 不知道有没有什么好的建议和方法呢? 我现在的思路有如下: 1.定时从服务器获取一次头像,比如1天2天或者一周什么的,虽然即时性不高,但是头像更改的频率一般的用户也不会太高。 2.服务器端加头像有更改的状态字段,那么当头像有更改的时候将该状态设置一下,但是因为头像都是跟着其他数据已XML的方式发送过来的,许多涉及到头像的地方那么都要加这一个统一的字段。同时我的方法里面也需要添加代码进行这个字段的判断检查,然后对应的重现下载图片。这样会在服务器和客户端都进行修改比较麻烦一点。 以上就是我的一些思路,不过感觉都还不是很好一样,请有经验的朋友如果好的建议和方法的请支点招,谢谢,说说解决方案就都行!欢迎交流~ 问答

服务器端下载多张图片保存到本地,现在只能保存一张图片

10-30

服务端代码: resp.setContentType("text/html;charset=UTF-8"); // 得到下载用户的名字 String name=req.getParameter("name"); //下载的所有图片 ArrayList<String> downList=UserDbUtil.getInstance().downloadPIC(DbUtil.openDb(), name); FileInputStream fis=null; OutputStream toClient=null; for (int i = 0; i < downList.size(); i++) { System.out.println("下载图片的路径:"+downList.get(i)); // 解决中文乱码问题 String filename = new String(downList.get(i).getBytes( "iso-8859-1"), "UTF-8"); // 创建file对象 File file = new File(filename); // 设置response的编码方式 resp.setContentType("application/x-msdownload"); // 写明要下载的文件的大小 resp.setContentLength((int) file.length()); // 设置附加文件名 // response.setHeader("Content-Disposition","attachment;filename="+filename); // 解决中文乱码 resp.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gbk"), "iso-8859-1")); // 读出文件到i/o流 fis = new FileInputStream(file); BufferedInputStream buReader = new BufferedInputStream(fis); byte[] b = new byte[1024];// 相当于我们的缓存 // 从response对象中得到输出流,准备下载 toClient = resp.getOutputStream(); int num; // 开始循环下载 while ((num = buReader.read(b)) != -1) { // 将b中的数据写到客户端的内存 toClient.write(b, 0, num); } // 将写入到客户端的内存的数据,刷新到磁盘 toClient.flush(); toClient.close(); fis.close(); System.out.println("下载图片到本地。。。。"); } android代码: /** * 下载图像方法 * * @param url * @return */ public static Bitmap downloadBitmap(String url) { Bitmap bitmap = null; HttpGet get = new HttpGet(url);// 下载地址 // 客户端对象 HttpClient client = new DefaultHttpClient(); try { HttpResponse resp = client.execute(get); if (resp.getStatusLine().getStatusCode() == 200) { // 连接成功,获取下载的数据流 InputStream in = resp.getEntity().getContent(); // 将数据流转为图像并返回(注意大图处理) bitmap = BitmapFactory.decodeStream(in); //获取长度 in.close();// 关闭流 Log.e("nnnnnnn", "服务器下载到图片"); } client.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 执行连接获取结果 return bitmap; } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览