
Android 6.0/7.0相机及相册图片裁剪功能实现
下载需积分: 13 | 16.94MB |
更新于2025-02-27
| 7 浏览量 | 举报
收藏
为了深入理解如何在Android系统中使用相机或相册获取图片并进行裁剪,我们需要探讨Android 6.0(代号Marshmallow)和7.0(代号Nougat)版本中关于存储访问框架(Storage Access Framework,简称SAF)以及相机应用接口的变化。
### Android 6.0 (Marshmallow) 和 7.0 (Nougat) 的存储访问框架
在Android 6.0和7.0中,系统引入了存储访问框架(SAF),它为用户提供了一种统一的方式来访问存储设备上的文件。开发者不再直接访问文件系统,而是通过文档提供者(Document Provider)来间接访问。文档提供者是第三方应用提供的,用于管理文件的框架,它们可以提供访问其他应用存储的数据的能力。
对于相册或相机应用而言,要获取图片文件进行裁剪操作,通常会用到`Intent`启动外部的图片选择器或者相机应用。在选择器中,用户可以选择一张图片,然后应用可以获取该图片的URI(统一资源标识符),而不是文件的直接路径。
### 获取图片并裁剪流程
1. **请求存储权限**:在Android 6.0及以后,必须在运行时请求存储权限,因为SAF使用了新的权限模型。开发者需要在代码中动态请求权限,通常是在用户尝试访问存储数据之前。
2. **启动图片选择器**:
- 使用`Intent`对象并通过`ACTION_GET_CONTENT`指定类型(如`image/*`),启动图片选择器。
- 或者使用`ACTION_PICK`从特定的文档提供者中选取文件。
这两个`Intent`动作都会返回一个`Uri`对象,该对象指向被选中的图片文件。
3. **处理返回的Uri**:
- 在返回的Uri上可以执行裁剪操作。这通常需要再启动一个新的`Intent`,指定`Intent.ACTION_EDIT`动作,并将上一步获取的Uri作为数据传递。
- 在调用`startActivityForResult`时,还需要传递`裁剪图片的输出Uri`,这是裁剪后图片将要保存的目标位置。
4. **裁剪图片**:
- 调用`startActivityForResult`后,系统会启动图片编辑器。
- 用户在编辑器中对图片进行裁剪操作后,应用可以在`onActivityResult`中处理裁剪后的图片。
5. **保存裁剪后的图片**:
- 通常,裁剪后的图片可以直接通过返回的输出Uri保存。如果有必要,应用也可以将图片数据从Uri中读取出来,并写入到内部存储或SD卡中。
### 注意事项
- **兼容性**:虽然Android 6.0/7.0引入了新的权限模型和SAF,但是为了兼容旧版本,很多开发者会使用第三方库如`RxPermissions`来处理动态权限请求,以及使用兼容库如`com.github.angads25.filepicker`来提供跨版本的图片选择功能。
- **相册和相机区别**:在调用相机应用拍照后,通常会直接获取图片的Uri,而使用相册选择图片时,获取的是已存在的图片的Uri。两者处理流程相似,但需要处理的Uri来源不同。
- **裁剪库**:在Android开发中,为了简化裁剪图片的操作,常会使用现成的裁剪库如`uCrop`或`PhotoEditor`等,它们提供了丰富的API和良好的用户体验。
### 例子代码
以下是一个简化的代码片段,展示如何使用`Intent`启动图片选择器,并处理返回的图片Uri进行裁剪:
```java
// 请求图片选择
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_IMAGE_PICK);
// 处理返回图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_PICK && resultCode == RESULT_OK) {
Uri selectedImage = data.getData();
performImageCropping(selectedImage);
}
}
// 裁剪图片
private void performImageCropping(Uri uri) {
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(uri, "image/*");
cropIntent.putExtra("crop", "true");
// 指定裁剪图片的宽高比
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
// 指定输出图片的格式和大小
cropIntent.putExtra("outputX", 256);
cropIntent.putExtra("outputY", 256);
cropIntent.putExtra("return-data", true);
startActivityForResult(cropIntent, REQUEST_IMAGE_CROP);
}
// 处理裁剪后的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CROP && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
// 使用裁剪后的Bitmap图片
}
}
```
### Unity3d Pluags 相关
文件名称列表中的“Unity3d Pluags”可能指的是Unity 3D游戏开发中使用的插件。虽然这与Android相机或相册获取图片裁剪的内容不直接相关,但值得注意的是Unity 3D允许开发者使用C#脚本和插件来访问Android平台的相机和文件系统。
在Unity中要访问Android相机并获取图片,可以通过编写C#脚本调用Android的Java接口,或者使用Unity Asset Store中提供的现成插件。获取到图片后,开发者需要将其转换为Unity可以处理的格式,并且对图片的存储和裁剪操作也需要遵循Android平台的规则和API。
总而言之,要在Android 6.0/7.0系统中获取图片并进行裁剪,开发者需要熟练掌握存储访问框架(SAF)、动态权限请求、以及如何通过Intent启动和处理相机和图片选择器。此外,还需要对Unity 3D的插件使用有基本了解,以便在跨平台游戏开发中实现相应功能。
相关推荐








nicepainkiller
- 粉丝: 9611
最新资源
- 多线程技术打造Java公共聊天系统
- 最新VB开发的IeTab控件 功能丰富 引人注目
- Reflector:C#.Net、WPF、Silverlight反编译解决方案
- 掌握jQuery自动缩放技术的秘诀
- Linux经典shell脚本集锦:101例学习指南
- 学生管理系统开发与毕业设计指南
- 基于Keil和Protues的数字钟仿真与时间调节
- 空间后方交会程序实现与源码解析
- Apache Ant 1.6.5:Java编译工具的开发包快速使用指南
- Windows平台Memcached服务器安装指南
- VC编写的车牌识别系统源码包
- ASP邮件群发技术详解与JMail44免费下载
- 精选个人网站模板下载指南
- C#聊天室教程:在Visual Studio 2005中实现简易通讯
- C#代码实现设计模式深度解析
- 权威教材《计算机网络》英文原版习题解析
- 80x86汇编语言课程设计源代码汇总
- LPR算法应用:通过sobel算子实现高准确率车牌检测
- Firefox JavaScript调试工具使用教程
- MFC Windows可视化编程深入解析(第二版)
- jQuery 1.2.6中文API手册详细介绍
- Visual C++课程设计案例与源码解析
- 源码分享:开发类似QQ的聊天小程序教程
- 掌握WPF中隔离存储空间的使用方法