android从网络获取图片以及异步加载图片
16lz
2021-12-19
import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Environment;import android.util.Log;import android.widget.ImageView;/** * 处理图片的工具类 */public class ImageUtils {/** * 图片基准路径 */private static final String BASE_SDCARD_IMAGES = "/mnt/sdcard/demo/images/";private static final String TAG = "ImageUtils";/** * 判断文件是否存在 * * @param 文件在本地的完整名 * @return */private static boolean judgeExists(String fullName) {File file = new File(fullName);return file.exists();}/** * 获取最后的‘/’后的文件名 * * @param name * @return */private static String getLastName(String name) {int lastIndexOf = 0;try {lastIndexOf = name.lastIndexOf('/');} catch (Exception e) {e.printStackTrace();}return !name.equals("") ? name.substring(lastIndexOf + 1) : "";}/** * 拼接一个完整的本地文件名 * @param 文件的网络路径 * @return */private static String getImageFullName(String name) {return BASE_SDCARD_IMAGES + getLastName(name);}/** * 通过该网络路径获取Bitmap * @param 该图片的网络路径 */public static Bitmap getBitmap(String urlPath) {Bitmap bitmap = null;String fullName = getImageFullName(urlPath);if (ImageUtils.judgeExists(fullName)) {/* 存在就直接使用 */Log.e(TAG, "使用了sdcard里的图片");bitmap = BitmapFactory.decodeFile(fullName);} else {/* 去下载图片,下载完成之后返回该对象 */Log.e(TAG, "去下载了图片");bitmap = downloadAndSaveBitmap(urlPath, fullName);}return bitmap;}/** * 下载保存图片 * * @param urlPath * 下载路径 * @param fullName * 文件保存路径+文件名 * @return */private static Bitmap downloadAndSaveBitmap(String urlPath, String fullName) {Bitmap bitmap = downloadImage(urlPath);/* 首先判断是否挂载了sdcard */if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {if (bitmap != null) {saveBitmap(fullName, bitmap);}} else {Log.e(TAG, "没有sdcard无法保存图片");}return bitmap;}/** * 保存图片 * * @param fullName * @param bitmap */private static void saveBitmap(String fullName, Bitmap bitmap) {if (bitmap != null) {try {File file = new File(fullName);if (!file.exists()) {creatFolder(fullName);file.createNewFile();}FileOutputStream fos = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();} catch (IOException e) {e.printStackTrace();Log.e(TAG, "图片保存失败,异常信息是:" + e.toString());}} else {Log.e(TAG, "没有下载成功图片,无法保存");}}/** * 创建保存文件的文件夹 * * @param fullName * 带文件名的文件路径 * @return */private static void creatFolder(String fullName) {if (getLastName(fullName).contains(".")) {String newFilePath = fullName.substring(0, fullName.lastIndexOf('/'));File file = new File(newFilePath);file.mkdirs();}}/** * 下载图片 * * @param urlPath * @return */private static Bitmap downloadImage(String urlPath) {try {byte[] byteData = getImageByte(urlPath);if (byteData == null) {Log.e(TAG, "没有得到图片的byte,问题可能是path:" + urlPath);return null;}int len = byteData.length;BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.RGB_565;options.inPurgeable = true;options.inInputShareable = true;options.inJustDecodeBounds = false;if (len > 200000) {// 大于200K的进行压缩处理options.inSampleSize = 2;}return BitmapFactory.decodeByteArray(byteData, 0, len);} catch (Exception e) {e.printStackTrace();Log.e(TAG, "图片下载失败,异常信息是:" + e.toString());return null;}}/** * 获取图片的byte数组 * * @param urlPath * @return */private static byte[] getImageByte(String urlPath) {InputStream in = null;byte[] result = null;try {URL url = new URL(urlPath);HttpURLConnection httpURLconnection = (HttpURLConnection) url.openConnection();httpURLconnection.setDoInput(true);httpURLconnection.connect();if (httpURLconnection.getResponseCode() == 200) {in = httpURLconnection.getInputStream();result = readInputStream(in);in.close();} else {Log.e(TAG, "下载图片失败,状态码是:"+ httpURLconnection.getResponseCode());}} catch (Exception e) {Log.e(TAG, "下载图片失败,原因是:" + e.toString());e.printStackTrace();} finally {Log.e(TAG, "下载图片失败!");if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}return result;}/** * 将输入流转为byte数组 * * @param in * @return * @throws Exception */private static byte[] readInputStream(InputStream in) throws Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = in.read(buffer)) != -1) {baos.write(buffer, 0, len);}baos.close();in.close();return baos.toByteArray();}/** * 此方法用来异步加载图片 * @param imageview * @param path */public static void downloadAsyncTask(final ImageView imageview,final String path) {new AsyncTask<String, Void, Bitmap>() {@Overrideprotected Bitmap doInBackground(String... params) {return getBitmap(path);}@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);if (result != null && imageview != null) {imageview.setImageBitmap(result);} else {Log.e(TAG, "在downloadAsyncTask里异步加载图片失败!");}}}.execute(new String[] {});}}
更多相关文章
- Android(安卓)中保存图片的代码
- android 保存和读取文件
- android之将图片转化为圆形图片
- Android(安卓)Cache 解析
- android图片裁剪
- Android(安卓)O(android 8.1) SYSTEM_UID应用无法使用FileProvider
- android中的状态保存
- Android拍照、录像、录音代码范例
- android 实现保存图片到相册