Android本地相册与拍照图片获取实践指南
143 浏览量
更新于2024-09-03
2
收藏 90KB PDF 举报
在Android应用开发中,获取本地相册图片和拍照获取图片是常见的功能需求。本文档详细讲解了如何在Android平台实现这两个功能,并提供了解决常见问题的方法。
首先,对于从本地相册获取图片,开发人员通常会通过`MediaStore` API访问用户的图片库。当指定照片的URI时,直接使用`uri`而不是通过`data.getData()`获取uri非常重要,因为后者可能会导致uri丢失。正确的做法是将uri存储在一个全局变量或者使用其他方式保存,以便后续在`ImageView`中设置:
```java
Uri selectedImage = ...; // 获取用户选择的图片uri
imageView.setImageURI(selectedImage);
```
然而,当使用后置摄像头拍摄的照片较大时,直接设置uri可能会导致内存溢出(OOM)错误。这时,需要先将URI转换为`Bitmap`对象,再进行压缩处理,例如使用`BitmapFactory.decodeFile()`或`BitmapFactory.decodeStream()`。压缩后的`Bitmap`可以安全地赋值给`ImageView`:
```java
File photoFile = ...; // 从uri获取到的实际文件
Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath());
if (bitmap != null) {
try (Bitmap.CompressFormat format = Bitmap.CompressFormat.JPEG; FileOutputStream out = new FileOutputStream(file)) {
bitmap.compress(format, 80, out); // 压缩质量设置
imageView.setImageBitmap(bitmap);
} catch (Exception e) {
Log.e("TAG", "Error compressing bitmap", e);
}
}
```
在将照片存储到外部存储(如SD卡)后,由于系统的同步延迟,新照片可能不会立即出现在系统的相册中。为了确保相册能够及时更新,开发者需要发送一个广播通知相册刷新,这通常通过`ACTION_MEDIA_SCANNER_SCAN_FILE`实现:
```java
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), photoFile.getName())));
sendBroadcast(mediaScanIntent);
```
此外,文中提到使用了`SharedPreferences`来管理数据,但在使用完毕后应确保清除缓存,避免占用过多内存。这可以通过`Editor`对象的`clear()`方法来实现:
```java
SharedPreferences sharedPreferences = getSharedPreferences("MyPreferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.apply();
```
总结来说,实现Android本地相册图片获取和拍照功能涉及选择图片uri的正确处理、大图片的内存优化、及时更新相册以及管理缓存。这些细节是确保用户体验和应用性能的关键部分。通过理解并遵循这些最佳实践,开发者可以有效地实现这些功能。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2017-11-27 上传
2016-10-14 上传
2023-08-26 上传
2021-01-03 上传
2016-07-21 上传
2019-08-13 上传
weixin_38616809
- 粉丝: 6
- 资源: 981
最新资源
- 行业文档-设计装置-一种切袋器.zip
- android应用源码高仿天天动听音乐-IT计算机-毕业设计.zip
- Assign3
- SMOK
- Luang:一个文件的简单Lua库即可翻译和格式化文本
- conf-deadlines
- tdd-checkout
- 基于python3.7+Qtpy5+opencv的交通监控图像处理.zip
- Sistemas-Distribuidos
- 网络IO模型 Linux环境下的network IO
- CSVFile
- IBM-Data-Analyst
- youshould:Web应用程序可帮助人们向朋友推荐事物
- node-asbs-dummy-ai:使用 node-asbs-lib 的虚拟船舶 AI
- vc在文件改变时得到通知,文件监控程序
- Famintos-Mobile:Projeto de Desenvolvimento Mobile