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

首先贴一段代码 --  这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下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. WCF入门的了解准备工作

    了解WCF, 及WCF入门需要掌握哪里基本概念? 1.准备工作 >1.1 . XML >1.2 . Web Service >1.3 . 远程处理 (RPC) >1.4.  消 ...

  2. ionic复选框应用

    如图:在项目中我需要实现这个效果布局和功能(进入页面默认全选,点击之后可以不选择) HTML代码: <div class="row" ng-repeat="engi ...

  3. Ztorg木马分析: 从Android root木马演变到短信吸血鬼

    本月第二次,Google 从官方应用商店 Google Play 中移除了伪装成合法程序的恶意应用.被移除的应用都属于名叫 Ztorg 的 Android 恶意程序家族.目前为止,发现的几十个新的Zt ...

  4. 【原创】Kafka Consumer多线程实例续篇

    在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...

  5. Java注解--实现简单读取excel

    实现工具类 利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及row,rows这些属性了. 定义注解: @Retentio ...

  6. jq和js插件的各个文件夹里放置的内容

    1. demo文件夹,存放各种实例. 2. dist文件夹,全称是distribution.在某些框架中,因为开发和发布的内容或者代码形式是不一样的(比如利用Grunt压缩等等),这时候就需要一个存放 ...

  7. 【Android Developers Training】 39. 获取文件信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. dynamic-load-apk 插件与宿主方法互调

    新建项目 DlPluginHost,下载dynamic-load-apk源码 1.将dynamic-load-apk 文件夹中的lib做为module导入到DlPlginHost 2.导入到Plugi ...

  9. Java之初识

    今天开始学习Java 1.什么是Java? Java是1995年由sun公司推出的一门极富创造力的面向对象编程语言,是由Java之父詹姆斯格斯林博士设计的. Java名字的由来:据说,java刚刚设计 ...

  10. Java文件操作(IO流)

     File 在java中用来表示文件和文件夹的具体类. File的构建 File的常见方法   字节流:       对象序列化:   字符流:     转接流: InputStreamReader. ...