好久没有写东西了。备份下知识吧。免得忘记了 。

首先贴一段代码 --  这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下sd卡。让系统相册重新加载下 。缺点就是只能保存到DCIM的文

件夹下边,暂时不知道怎么获取系统相机的路径,网上找了下说了好几个方法。其中有一条就是去读取本地的图片,然后根据一定的规则识别出本地相册的路径

保存下,不过觉得性能不是很好。谁有更好的方法可以提供下。

 private class DownloadTask extends AsyncTask<String, Integer, String> {

        private Context context;
private String filepath;
public int fileLength = 0; public DownloadTask(Context context) {
this.context = context; File cacheDir = new File(ImageLoader.getExternalCacheDir(context).getAbsolutePath() );
if(!cacheDir.exists()) {
cacheDir.mkdirs();
}
// filepath = ImageLoader.getExternalCacheDir(context).getAbsolutePath() + File.separator + "caihongjiayuan.jpg";
filepath = UIUtils.generateDownloadPhotoPath();
} @SuppressWarnings("resource")
@Override
protected String doInBackground(String... sUrl) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass()
.getName());
wl.acquire(); InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(20000);
connection.connect(); // expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
return "Server returned HTTP " + connection.getResponseCode() + " "
+ connection.getResponseMessage();
fileLength = connection.getContentLength();
input = connection.getInputStream();
output = new FileOutputStream(filepath);
byte data[] = new byte[4096];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
if (isCancelled())
return null;
total += count; if (fileLength > 0) // only if total length is known
publishProgress((int)total);
output.write(data, 0, count);
}
} catch (Exception e) {
return null;
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
} if (connection != null)
connection.disconnect();
wl.release();
}
return filepath;
} @Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
float progress = (float)values[0]/(float)fileLength;
mProgressInfo.setText(getString(R.string.download_progress_info,StringUtils.getKBUnitString(values[0]),StringUtils.getKBUnitString(fileLength)));
mProgressBar.setProgress((int)(progress * 100));
} @Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
mDownloadView.setVisibility(View.GONE);
if (!TextUtils.isEmpty(result)) {
ImageUtils.scanFile(mCurrentActivity, filepath);
ToastUtils.showLongToast(mCurrentActivity, mCurrentActivity.getString(R.string.tips_img_save_path, filepath));
}else {
ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_faile);
} //
// Bitmap bitmap = BitmapFactory.decodeFile(filepath);
// boolean flag = ImageUtils.insertImageToAllbum(bitmap, mCurrentActivity);
// if (flag) {
//// ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_success);
// }else {
// ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_faile);
// }
}
}

  参考了下别的文章,找到下边一个方法能解决大部分机型适配的问题,且可以将照片保存到系统相机拍完照的目录下。供大家参考。

private class DownloadTask extends AsyncTask<String, Integer, Boolean> {

        private Context context;
public int fileLength = 0;
private Bitmap bmp; public DownloadTask(Context context) {
this.context = context; File cacheDir = new File(ImageLoader.getExternalCacheDir(context).getAbsolutePath() );
if(!cacheDir.exists()) {
cacheDir.mkdirs();
}
} @SuppressWarnings("resource")
@Override
protected Boolean doInBackground(String... sUrl) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass()
.getName());
wl.acquire(); InputStream input = null;
ByteArrayOutputStream output = null;
HttpURLConnection connection = null;
try {
URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(20000);
connection.connect(); // expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
return false;
fileLength = connection.getContentLength();
input = connection.getInputStream();
output = new ByteArrayOutputStream();
byte data[] = new byte[4096];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
if (isCancelled())
return false;
total += count; if (fileLength > 0) // only if total length is known
publishProgress((int)total);
output.write(data, 0, count);
}
bmp = BitmapFactory.decodeByteArray(output.toByteArray(),0 , output.toByteArray().length);
return true; } catch (Exception e) {
return false;
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
} if (connection != null)
connection.disconnect();
wl.release();
}
} @Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
float progress = (float)values[0]/(float)fileLength;
mProgressInfo.setText(getString(R.string.download_progress_info,StringUtils.getKBUnitString(values[0]),StringUtils.getKBUnitString(fileLength)));
mProgressBar.setProgress((int)(progress * 100));
} @Override
protected void onPostExecute(Boolean result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
mDownloadView.setVisibility(View.GONE);
if (result.booleanValue() && ImageUtils.insertImageToAllbum(bmp, mCurrentActivity)) { }else {
ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_faile);
} }
}

两个方法的区别就是将FileOutputStream换成了ByteArrayOutputStream项目中主要是有显示下载进度条的需求,所以稍微复杂了点。

另外: ImageUtils 中insertImage 方法如下。

public static boolean insertImageToAllbum(Bitmap bitmap,Context mContext) {
if (bitmap != null) {
String uri = MediaStore.Images.Media.insertImage(mContext.getContentResolver(),bitmap, "", "");
if (!TextUtils.isEmpty(uri)) {
String filePath = getRealPathFromURI(Uri.parse(uri),mContext);
ToastUtils.showLongToast(mContext, mContext.getString(R.string.tips_img_save_path, filePath));
scanFile(mContext,filePath);
return true;
}
}
return false;
} public static void scanFile(Context mContext,String path){
MediaScannerConnection.scanFile(mContext, new String[] { path }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) { }
});
}

  方法scanFile是让系统重新加载SD卡的 。。

  over,有疑问请留言,欢迎指正错误。

Android保存图片到本地相册的更多相关文章

  1. 微信小程序点击保存图片到本地相册——踩坑

    在微信小程序中要保存图片到本地相册,需要获取相册权限. 总之整个功能实现下来需要如下几个小程序的API:wx.getSetting,wx.authorize,wx.openSetting,wx.dow ...

  2. iOS-iOS调用相机调用相册【将图片保存到本地相册】

    设置头部代理 <UINavigationControllerDelegate, UIImagePickerControllerDelegate> 1.调用相机 检测前置摄像头是否可用 - ...

  3. 史上最强Android 开启照相或者是从本地相册选中一张图片以后先裁剪在保存并显示的讲解附源码

    整个程序的布局很简单 只在一个垂直方向上的线性布局里面有俩个按钮(Button)和一个显示图片的控件(ImageView)这里就不给出这部分的代码了   1.是打开系统的相册   Intent alb ...

  4. React Native之图片保存到本地相册(ios android)

    React Native之图片保存到本地相册(ios android) 一,需求分析 1,react native保存网络图片到相册,iOS端可以用RN自带的CameraRoll完美解决,但是andr ...

  5. Android:支持多选的本地相册

    前段时间在做一个动态发布功能,需要用到图片上传.一开始直接调用的系统相册和相机,由于系统相机不支持多选,就花点时间做了个本地相册,在此开源下. 先上截图,依次为选择相册界面.相册详情界面.查看图片大图 ...

  6. Android中通过访问本地相册或者相机设置用户头像

    目前几乎所有的APP在用户注册时都会有设置头像的需求,大致分为三种情况: (1)通过获取本地相册的图片,经过裁剪后作为头像. (2)通过启动手机相机,现拍图片然后裁剪作为头像. (3)在APP中添加一 ...

  7. Xamarin.Android 调用本地相册

    调用本地相册选中照片在ImageView上显示 代码: using System; using System.Collections.Generic; using System.Linq; using ...

  8. Android获取本地相册图片、拍照获取图片

    需求:从本地相册找图片,或通过调用系统相机拍照得到图片. 容易出错的地方: 1,当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直接拿到uri(用全局变量 ...

  9. Android笔记之使用ImageView加载网络图片以及保存图片到本地并更新图库

    ImageView显示网络图片 findViewById(R.id.btnLoad).setOnClickListener(new View.OnClickListener() { @Override ...

随机推荐

  1. 聊聊RocksDB Compact

    | 导语 对于 LevelCompact 策略,RocksDB会根据每一层不同的策略计算出CompactScore,根据CompactScore大小来决定那一层将会优先进行Compact,然后选择Le ...

  2. rest api get 查询接口 多个参数

    查询时,使用get,传递参数至服务器. angular js中,$http可以直接传递object,在get中,params:data 在服务端, query(x=x,y=y)可写成 query(** ...

  3. AngularJS高级程序设计读书笔记 -- 指令篇 之 自定义指令

    2. 自定义指令(15-17 章) Module.directive(name, factory) 2.1 创建自定义指令的方法 Module.directive(name, factory) 示例 ...

  4. 我的学习之路_第二十章_JDBC

    JDBC 使用JDBC技术,通过mysql提供的驱动程序,操作数据库 ● 1. 注册驱动 告知jvm 使用的是什么驱动程序(mysql,oracle) 使用API中的类 DriverManager中的 ...

  5. PHP中小小的header函数

    不废话,直接说功能 1.重定向,语法: header("location:http://www.lemon-x.ga"); file_put_contents("./te ...

  6. mysqlclient和PyMySQL对比

    环境:Python 3.5+, Django 1.9+ 最初用django时,搜索时发现PyMySQL的文章很多,然而在django的官方文档中python3版的mysql客户端驱动确没有提到PyMy ...

  7. Binder的工作原理浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  8. css画三角形,梯形

    (根据调节边框的宽度来调节三角形形状) <!DOCTYPE html> <html> <head> <meta http-equiv="Conten ...

  9. Python3控制结构与函数

    1.if语句的另一种写法: expression1 if boolean_expression else expression2 boolean_expression为true时使用expressio ...

  10. JAVA - 深入JAVA 虚拟机 1

    Java虚拟机与程序的生命周期 Java虚拟机将结束生命周期 1.call System.exit(n) Terminates the currently running JVM. 2.程序正常执行结 ...