android 之文件下载
来源:互联网 发布:博得之门增强版 mac 编辑:程序博客网 时间:2024/04/28 14:40
首先,我们使用IO对文件进行下载操作,把下载到的文件保存到sdCard目录下。前提是保证有sdCard。
看代码吧:
ImageService.java
package com.hkrt.action;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.text.SimpleDateFormat;import java.util.Date;public class ImageService {//从互联网上读取图片http://hiphotos.baidu.com/huyangdiy/pic/item/7509b40db709fce9d0581bfc.jpgpublic static byte[] getImage(String path) throws Throwable{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setReadTimeout(5*1000);if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){InputStream is = conn.getInputStream();return readIS(is);}else{throw new Exception("请求路径错误");}}public static byte [] readIS(InputStream is) throws IOException{ByteArrayOutputStream bos = new ByteArrayOutputStream();byte [] buff = new byte[1024];int length=0;while((length =is.read(buff))!=-1){bos.write(buff, 0, length);}return bos.toByteArray();}/** * @param path 资源路径 * @return 资源文件流 * @throws Throwable */public static InputStream getInputStream(String path) throws Throwable{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setReadTimeout(5*1000);if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){InputStream is = conn.getInputStream();return is;}return null;}/**对下载文件以时间重命名*/public static String getDateTime(){return new SimpleDateFormat("yyyy-MM-dd hh-MM-ss").format(new Date()).toString();}}ImageViewActivity.java
package com.hkrt.action;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;/** * 点击按钮从网下查看图片 * @author Administrator * */public class ImageViewActivity extends Activity {private static final String TAG="ImageViewActivity"; private EditText urlEdt;//文件路径 private ImageView imageView;//页面中展示的图片 private Button downLoadButton ;//下载按钮@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); urlEdt=(EditText)this.findViewById(R.id.path); imageView =(ImageView)this.findViewById(R.id.image); downLoadButton =(Button)this.findViewById(R.id.button); downLoadButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String imagePath = urlEdt.getText().toString();try {byte [] imageByte = ImageService.getImage(imagePath);Bitmap bm = BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length);imageView.setImageBitmap(bm);String imageSuffix = imagePath.substring(imagePath.lastIndexOf("."), imagePath.length());downLoadImage(imagePath,ImageService.getDateTime()+imageSuffix );//下载图片} catch (Throwable e) {Log.i(TAG, e.toString());Toast.makeText(getApplicationContext(), "图片儿获取失败", Toast.LENGTH_SHORT).show();}}}); }/**下载文件到sd卡上*/public void downLoadImage(String path,String fileName){ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File sdCardDir = Environment.getExternalStorageDirectory();//获取到文件的存储路径 InputStream is=null ; try { File dest =new File(sdCardDir.getCanonicalPath()+File.separator+"imageMe"); is = ImageService.getInputStream(path); if(!dest.exists()){ dest.mkdirs(); } OutputStream output = new FileOutputStream(dest+File.separator+fileName); byte[] buffer = new byte[8192]; while((is.read(buffer)) != -1){ output.write(buffer); } output.flush(); System.out.println("下载成功");} catch (Throwable e) {e.printStackTrace();}finally{if(is!=null){try {is.close();} catch (IOException e) {e.printStackTrace();}}} }}}
效果图:
注:把下载的文件导出去,使用文件预览打不开,原始不明。换其他的打开方式。
以上方法是实现了图片显示和下载的功能,但下载的时候是在主线程中执行的,这人时候就会有问题了。UI线程执行代码的速度最好不要超过10秒。
这个时候,做下载时,我们应该独立开启一个线程做下载功能处理。
主要实现代码:
在点击获取图片是开启一个新的线程:
Thread loginThread = new Thread(new DownloadThread()); loginThread.start();
线程的新方法实现下载,并把下载成功与否返回给handle 。
private class DownloadThread implements Runnable{@Overridepublic void run() {String imageSuffix = imagePath.substring(imagePath.lastIndexOf("."), imagePath.length());boolean down =downLoadImage(imagePath,ImageService.getDateTime()+imageSuffix );//下载图片Message message = new Message();Bundle bun = new Bundle();bun.putBoolean("downLoadState", down);message.setData(bun);downLoadHandler.sendMessage(message);}}
返回handle处理结果信息并通知下载成功与否:
downLoadHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {Bundle bun = msg.getData();boolean downState = (Boolean)bun.getBoolean("downLoadState");if(downState){Intent intent = new Intent(ImageViewActivity.this,OtherActivity.class);PendingIntent contentIntent = PendingIntent.getActivity(ImageViewActivity.this, 0, intent, 0);Notification notify = new Notification();notify.icon=R.drawable.icon1;notify.tickerText="启动otherActivity通知";notify.when=System.currentTimeMillis();notify.defaults=Notification.DEFAULT_SOUND;notify.defaults=Notification.DEFAULT_ALL;notify.setLatestEventInfo(ImageViewActivity.this, "普通通知", "点击查看", contentIntent);NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);manager.notify(0, notify);}else{Toast.makeText(getApplicationContext(), "图片儿下载失败", Toast.LENGTH_SHORT).show();}super.handleMessage(msg);} };
同时需要添加通知震动的权限:
<uses-permission android:name="android.permission.VIBRATE" />
- android 之文件下载
- Android之文件下载
- Android之文件下载
- Android之文件下载
- Android之文件下载
- android 之文件下载
- Android之文件下载
- android之文件下载
- Android之文件下载
- Android开发之文件下载
- android 开发之文件下载
- Android文件下载之断点续传
- Android之网络文件下载
- Android开发之文件下载
- [转]android 之文件下载
- android示例之文件下载
- android 开发之文件下载
- Android开发之文件下载
- VMware中虚拟的linux系统空间不足增加硬盘的办法
- Android重要资源
- android应用开发全程实录-用户界面部分章节-你真的会用最简单的TextView么?
- 数组不可以是泛型的,但是有泛型数组
- [观点]架构师如何界定项目边界 把握系统全局
- android 之文件下载
- Source Insight操作
- 在Ubuntu上下载、编译和安装Android最新源代码
- AppMobi将开源其所有HTML5 API
- echsop 兼容jquery(解决与transport.js冲突)
- 我眼中的奥巴马
- liunx中多线程操作实例解析
- 关于FillSchema与Fill
- dedeCMS常用标签调用集合