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

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

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

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

(1)ICS4.0及更高版本中的实现

4.0中不允许在主线程,即UI线程中操作网络,所以必须新开一个线程,在子线程中执行网络连接;然后在主线程中显示图片。

public class IcsTestActivity extends Activity {String TAG = "IcsTestActivity"; 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.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(IcsTestActivity.this, "保存图片", "图片正在保存中,请稍等…", true);new Thread(saveFileRunnable).start();}});}/*** Get image from newwork* @param path The path of image* @return byte[]* @throws Exception[] 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;}/*** Get image from newwork* @param path The path of image* @return InputStream* @throws Exception*/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;}/*** Get data from stream* @param inStream* @return byte[]* @throws Exception[] 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();}/*** 保存文件* @param bm* @param fileName* @throws IOExceptionsaveFile(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(){@Overridepublic void run() {try {saveFile(mBitmap, mFileName);mSaveMessage = "图片保存成功!";} catch (IOException e) {mSaveMessage = "图片保存失败!";e.printStackTrace();}messageHandler.sendMessage(messageHandler.obtainMessage());}};private Handler messageHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {mSaveDialog.dismiss();Log.d(TAG, mSaveMessage);Toast.makeText(IcsTestActivity.this, mSaveMessage, Toast.LENGTH_SHORT).show();}};/** 连接网络* 由于在4.0中不允许在主线程中访问网络,所以需要在子线程中访问*/private Runnable connectNet = new Runnable(){@Overridepublic void run() {try {String filePath = "";mFileName = "test.jpg";[] data = getImage(filePath);if(data!=null){mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);// bitmap}else{Toast.makeText(IcsTestActivity.this, "Image error!", 1).show();}mBitmap = BitmapFactory.decodeStream(getImageStream(filePath));//********************************************************************/// 发送消息,通知handler在主线程中更新UIconnectHanlder.sendEmptyMessage(0);Log.d(TAG, "set image …");} catch (Exception e) {Toast.makeText(IcsTestActivity.this,"无法链接网络!", 1).show();e.printStackTrace();}}};private Handler connectHanlder = new Handler() {@Overridepublic void handleMessage(Message msg) {Log.d(TAG, "display image");(mBitmap != null) {mImageView.setImageBitmap(mBitmap);// display image}}};}

(2)2.3以及以下版本可以在主线程中操作网络连接,但最好不要这样做,因为连接网络是阻塞的,如果5秒钟还没有连接上,就会引起ANR。

别小看任何人,越不起眼的人。往往会做些让人想不到的事。

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

相关文章:

你感兴趣的文章:

标签云: