首先,我们使用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.jpg
public 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() {
@Override
public 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{
@Override
public 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(){
@Override
public 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" />