调用系统相机拍照,并且保存到系统相册的一般套路

最近遇到也一个需求:调用系统相机拍照,并且照片可以在系统相册显示。 关于照片显示在系统相册这个问题,因为安卓机型太多了,各大厂商都对原生系统进行了不同程度的定制,所以在一般情况下,有的手机会把图片直接显示在相册最前方,但是有的手机却只能在二级文件夹内找到我们拍的照片,两张情况如下图所示:

微信拍摄的照片直接显示最前

自己应用调用相机拍照后某些手机只能在二级文件夹下找到(aaaaaa)

那么问题来了,微信,qq等它们是怎么实现将本应用拍的照片显示在系统相册最前方,而不用再往二级文件夹查找呢?

这个问题我和朋友们讨论之后觉得最有可能的原因就是手机系统对这些App进行了特殊处理,为了验证这个想法,我做了一个实验。

为了验证微信的图片路径是否被“特殊处理”了做的实验:

  1. 首先找到微信图片在本机的存储路径,我的手机是小米5,所以它的路径是:sd卡根目录+/Tencent/MicroMsg/WeiXin/;
  2. 在自己的demo中调用系统相机拍照,并且设置拍照后的图片保存路径为上一步中的路径,文件名为当前系统时间。
String name = System.currentTimeMillis() + ".jpg";
imagePath = new File(rootPath + "/Tencent/MicroMsg/WeiXin/", name);
if (!imagePath.exists()) {   
 imagePath.mkdirs();
}
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imagePath));//设置拍照后图片的保存路径

3.拍照后发现,原本放到aaaaaa路径的话,图片不会显示在最前方,但是当我们把图片的保存位置设置为微信图片的保存路径后,会正常显示在相册最前方。

---------------------------------------------------我是分割线-------------------------------------

下面记录下实现调用相机拍照并保存的一种方法。

1 . 添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />

2 . 拍照的意图

Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
String name = System.currentTimeMillis() + ".jpg";
imagePath = new File(rootPath + "/aaaaaa/", name);
if (!imagePath.exists()) {    imagePath.getParentFile().mkdir();
}
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imagePath));// 设置图片输出路径
imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 图片质量

3 . 拍照成功后在onActivityResult通知图库刷新

try {    
MediaStore.Images.Media.insertImage(getContentResolver(), imagePath.getAbsolutePath(), imagePath.getName(), null);//图片插入到系统图库
}catch (FileNotFoundException e) {    
e.printStackTrace();
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + imagePath.getAbsolutePath())));//通知图库刷新

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏嵌入式程序猿

你还在傻傻的写驱动吗?

因为工作项目中8位单片机经常用microchip,而32位常用NXP的,而两家都在积极推广自己的芯片配置,代码生成工具,microchip有MCC,而NXP有M...

3456
来自专栏HaHack

使用叮当声控智米电风扇

1274
来自专栏沈唁志

GitHub代码托管平台提交代码时emoji表情的使用

1484
来自专栏Web 开发

微软的版本,好复杂啊

MSDN(Microsoft Developer Network):这是微软公司面向软件开发者的一种版本。MSDN 涵盖了所有的可以被开发扩充的平台和应用程序,...

842
来自专栏FreeBuf

基于ArduinoLeonardo板子的BadUSB攻击实战

前言 在Freebuf上许多同学已经对HID攻击谈了自己的看法,如维克斯同学的《利用Arduino快速制作Teensy BadUSB》无论从科普还是实践都给我们...

2677
来自专栏Kubernetes

kubelet最佳配置

author: garnett.wang@gmail.com kubernetes version: 1.6.2 Kubelet Configurations ...

5087
来自专栏小文博客

Windows 10 声音突然变大?——解决方案

1504
来自专栏知无涯

建立自己安全可靠好记的网络密码体系!个人密码安全设置策略建议与技巧

3467
来自专栏北京马哥教育

【重大事件】知名终端模拟软件XSHELL多版本存在后门,或上传用户服务器账号密码!

简介 ▼▼▼ Xshell是一款强大,著名的终端模拟软件,被广泛的用于服务器运维和管理,Xshell支持SSH,SFTP,TELNET,RLOGIN和SERIA...

3465
来自专栏编程微刊

经典小程序源码及其下载地址

1465

扫码关注云+社区