1、httpclient过时,
在Android studio中可以这样设置再使用:
useLibrary 'org.apache.http.legacy'
2、权限:
<!--权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3、布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<Button
android:id="@+id/btn_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/img_down"
android:onClick="clickbutton"
android:text="下载" />
</RelativeLayout>
4、文件工具类
package com.example.administrator.downloadimage;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by Administrator on 2017/5/4.
*/
public class FileUtils {
private static final String CACHE_DIR = Environment.getExternalStorageDirectory()
+ "/my_caches/images";// 缓存文件夹
/**
* 判断sdcard是否挂载
*
* @return
*/
public static boolean isMounted() {
String state = Environment.getExternalStorageState();
return state.equals(Environment.MEDIA_MOUNTED);
}
/**
* 获取sdcard的根目录
*
* @return
*/
public static String getSDCARDDir() {
return Environment.getExternalStorageDirectory().getAbsolutePath();
}
/**
* 存储图片一
*
* @param url : 图片的http网络地址
* @param data
* @throws IOException
*/
public static void saveImage(String url, byte[] data) throws IOException {
// 1. 判断是否有sdcard
if (!isMounted()) {
return;
}
// 2. 判断是否有缓存的文件夹
File dir = new File(CACHE_DIR);
if (!dir.exists()) {
dir.mkdirs();// 多层文件夹
}
// 3. 存储图片到sdcard
File file = new File(dir, getFilename(url));
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
}
/**
* 保存图片二
*
* @param url : 图片的http网络地址
* @param bitmap
* @throws IOException
*/
public static void saveImage(String url, Bitmap bitmap) throws IOException {
// 1. 判断是否有sdcard
if (!isMounted()) {
return;
}
// 2. 判断是否有缓存的文件夹
File dir = new File(CACHE_DIR);
if (!dir.exists()) {
dir.mkdirs();
}
// 3. 存储图片到sdcard
File file = new File(dir, getFilename(url));
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
}
/**
* 获取图片名
*
* @param url
* @return
*/
public static String getFilename(String url) {
return url.substring(url.lastIndexOf("/") + 1);
}
/**
* 读图片
*
* @param url
* @return
*/
public static Bitmap readImage(String url) {
// 判断是否有sdcard
if (!isMounted()) {
return null;
}
File file = new File(CACHE_DIR, getFilename(url));
if (file.exists()) {
// file->bitmap
return BitmapFactory.decodeFile(file.getAbsolutePath());
}
return null;
}
/**
* 清空缓存目录
*/
public void clearCaches() {
File dir = new File(CACHE_DIR);
File[] allfiles = dir.listFiles();
for (File file : allfiles) {
file.delete();
}
}
}
5、加载数据并保存
利用httpclient请求,asynctask异步,加载图片并保存在本地。
package com.example.administrator.downloadimage;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private ImageView img_down;
private String url = "http://b.hiphotos.baidu.com/image/pic/item/d1160924ab18972bf5f68cc8e0cd7b899f510ae7.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_down = (ImageView) this.findViewById(R.id.img_down);
}
public void clickbutton(View view) {
Bitmap bitmap = FileUtils.readImage(url);
if (bitmap != null) {
img_down.setImageBitmap(bitmap);
} else {
// 发送异步请求
new MyAsyncTask(this).execute(url);
}
}
class MyAsyncTask extends AsyncTask<String, Void, byte[]> {
private ProgressDialog pDialog;
public MyAsyncTask(Context context) {
pDialog = new ProgressDialog(context);
pDialog.setIcon(R.mipmap.ic_launcher);
pDialog.setTitle("提示");
pDialog.setMessage("The data is loading...");
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog.show();
}
@Override
protected byte[] doInBackground(String... params) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
byte[] datas = EntityUtils.toByteArray(response.getEntity());
// 缓存工具类:保存图片
FileUtils.saveImage(params[0], datas);// url:params[0]
return datas;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(byte[] result) {
super.onPostExecute(result);
if (result != null) {
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
img_down.setImageBitmap(bitmap);
}
pDialog.dismiss();
}
}
}
注意:
//保存图片后发送广播通知更新数据库
Uri uri = Uri.fromFile(file);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));