史上最强Android 开启照相或者是从本地相册选中一张图片以后先裁剪在保存并显示的讲解附源码
2023-09-11 14:17:59 时间
整个程序的布局很简单
只在一个垂直方向上的线性布局里面有俩个按钮(Button)和一个显示图片的控件(ImageView)
这里就不给出这部分的代码了
1.是打开系统的相册
Intent albumIntent = new Intent(Intent.ACTION_PICK, null);
albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(albumIntent, ALBUM_OK);
这里是通过启动一个系统的隐式意图打开的本地相册
2.是开启系统的拍照
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 下面这句指定调用相机拍照后的照片存储的路径
if (pre.exists()) {
pre.delete();
}
try {
pre.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pre));
startActivityForResult(cameraIntent, CAMERA_OK);
通过开启一个隐式意图打开照相机
3.进行裁剪 这里的裁剪也是通过一个隐式意图调用系统的功能的
/**
* 裁剪图片方法实现
*
* @param uri 图片来源
*/
public void clipPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
startActivityForResult(intent, CUT_OK);
}
4.显示、保存图片
/**
* 保存裁剪之后的图片数据 将图片设置到imageview中
*
* @param picdata
*/
private void setPicToView(Intent picdata) {
CLog.d(TAG, "将图片显示在控件上");
Bundle extras = picdata.getExtras();
if (extras != null) {
bitmap = extras.getParcelable("data");
// TODO 设置图片之前 应该将之前的图片删除,将最新的图片保存
readBitmap2File(bitmap);
headPhoto.setImageBitmap(bitmap);
}
}
下面附上整个程序的源代码(其中还包括一个队图片进行二次采样的工具类)
这里面有一个问题有待验证。
在保存图片的时候,当时我的做法是先判断SDCard卡是否可用,
不可用的情况直接保存到手机内存,在这个地方,有人和我提到过好像由于某些问题,是不能保存到这个地方的。
可用的情况下,直接就在SDCard卡中保存。
点击下载源代码
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章
- Android系统自带的android.util.Base64的实现源码
- Android Studio “懒人”必备插件android layout id converter
- Android studio 2.0--android增量更新的那些事
- Android TabLayout 使用进阶(含源码)
- Android入门之Fragment和FragmentActivity的使用方法
- android源码
- 【Android开发】2022Android官方架构指南
- 从零开始学android开发-setBackgroundDrawable与setBackgroundResource的区别
- Android 超简单集成活体检测技术 快速识别“假脸”
- 《Android 源码设计模式解析与实战》——第1章,第1.5节系统有更高的灵活性——接口隔离原则
- 《Android 源码设计模式解析与实战》——第2章,第2.2节单例模式的定义
- 《Android 源码设计模式解析与实战》——第2章,第2.3节单例模式的使用场景
- 《Android 源码设计模式解析与实战》——第2章,第2.4节单例模式UML类图
- 140款Android开源优秀项目源码
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- Activity的绘制流程简单分析(基于android 4.0源码进行分析)
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
- SwiftUI AppStore上线技巧之如何处理App包含其他品牌问题例如Apple或Android
- Android事件处理第一节(View对Touch事件的处理)
- android中进行布局管理界面_一、利用ListView进行布局
- 《OpenGL ES应用开发实践指南:Android卷》—— 2.1 为什么选择空气曲棍球
- Android编程 EditView 中如何设置最多可以输入的字符数量 属性 android:ems 与 android:maxLength 的区别
- Android Menu 32种 菜单布局、源码、demo
- 行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)
- Android实现戴口罩人脸检测和戴口罩识别(附Android源码)
- Android View体系(五)从源码解析View的事件分发机制
- Android使用TextView,设置onClick属性无效解决的方法
- GitHub上不错的Android开源项目(三)
- Github上不错的Android开源代码(一)