最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下.

  • 调用系统拍照
    private fun openCamera() {  //调用相机拍照// 创建File对象,用于存储拍照后的图片var outputImage = File(externalCacheDir, "output_image.jpg")try {if (outputImage.exists()) {outputImage.delete()}outputImage.createNewFile()} catch (e: IOException) {e.printStackTrace()}if (Build.VERSION.SDK_INT < 24) {imageUri = Uri.fromFile(outputImage) } else { //Android 7.0系统开始 使用本地真实的Uri路径不安全,使用FileProvider封装共享Uri //参数二:fileprovider绝对路径 com.yaoli.testcamerademo:项目包名 imageUri = FileProvider.getUriForFile(this@MainActivity, "com.yaoli.testcamerademo.fileprovider", outputImage) } // 启动相机程序 val intent = Intent("android.media.action.IMAGE_CAPTURE") intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri) startActivityForResult(intent, 1) }

为了适配Android7.0以后的版本,需要在AndroidManifest配置一下(在后面相册选图也需要用到)

<application>...  <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.yaoli.testcamerademo.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>

其中的 file_paths是这样的

  • 调用系统相册
 private fun pickPhoto() {val intent = Intent("android.intent.action.GET_CONTENT")intent.type = "image/*"      startActivityForResult(Intent.createChooser(intent,"Select Picture"), 2) // 打开相册,这种方式可以打开图片或图库或文件管理中的图片}

再来看下onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {when (requestCode) {1 -> {//拍照if (resultCode == AppCompatActivity.RESULT_OK) {startPhoneCrop(imageUri!!)}}2 -> {//打开相册// 判断手机系统版本号if (Build.VERSION.SDK_INT >= 21) {// 4.4及以上系统使用这个方法处理图片handleImageOnKitKat(data!!)} else {// 4.4以下系统使用这个方法处理图片handleImageBeforeKitKat(data!!)}}
    START_CROP_IMAGE_REQUEST -> {      if (resultCode == Activity.RESULT_OK) {        var file = File(outputUri!!.path)    }
}

其中涉及到一些系统裁剪相关的方法

  • 调用系统裁剪
    /*** 调用系统裁剪的方法*/private fun startPhoneCrop(uri: Uri) {outputUri = Uri.fromFile(File(Environment.getExternalStorageDirectory().absolutePath + "/" + System.currentTimeMillis() + ".jpg"))val intent = Intent("com.android.camera.action.CROP")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)}intent.setDataAndType(uri, "image/*")//是否可裁剪intent.putExtra("corp", "true")intent.putExtra("scale", true)//裁剪器高宽比intent.putExtra("aspectY", 1)intent.putExtra("aspectX", 1)//设置裁剪框高宽intent.putExtra("outputX", 150)intent.putExtra("outputY", 150)//返回数据intent.putExtra("return-data", false)intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri)intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString())startActivityForResult(intent, START_CROP_IMAGE_REQUEST)}
// 4.4及以上系统使用这个方法处理图片 相册图片返回的不再是真实的Uri,而是分装过的Uri@TargetApi(21)private fun handleImageOnKitKat(data: Intent) {var imagePath = ""val uri: Uri = data.dataif (DocumentsContract.isDocumentUri(this, uri)) {// 如果是document类型的Uri,则通过document id处理val docId = DocumentsContract.getDocumentId(uri)if ("com.android.providers.media.documents" == uri.authority) {val id = docId.split(":")[1] // 解析出数字格式的idval selection = MediaStore.Images.Media._ID + "=" + idimagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection)} else if ("com.android.providers.downloads.documents" == uri.authority) {val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), docId.toLong())imagePath = getImagePath(contentUri, null)}} else if ("content".equals(uri.scheme, true)) {// 如果是content类型的Uri,则使用普通方式处理imagePath = getImagePath(uri, null)} else if ("file".equals(uri.scheme, true)) {// 如果是file类型的Uri,直接获取图片路径即可imagePath = uri.path}val imgUri = FileProvider.getUriForFile(applicationContext, "com.yaoli.example.fileprovider", File(imagePath))startPhoneCrop(imgUri)}private fun handleImageBeforeKitKat(data: Intent) {val uri = data.dataval imagePath = getImagePath(uri, null)val imgUri: Uri = Uri.fromFile(File(imagePath))startPhoneCrop(imgUri)}
  private fun getImagePath(uri: Uri, selection: String?): String {var path = ""// 通过Uri和selection来获取真实的图片路径val cursor = contentResolver.query(uri, null, selection, null, null)if (cursor != null) {if (cursor.moveToFirst()) {path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)) } cursor.close() } return path }
 

裁剪之后的返回也在onActivityResult方法中.

startActivityForResult(Intent.createChooser(intent, "Select Picture"), 2)

转载于:https://www.cnblogs.com/fuyaozhishang/p/9466258.html

Android调用系统拍照裁剪和选图功能相关推荐

  1. MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题

    Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题 直接上代码 首先添加拍照需要的权限 <uses-permission android:name="andr ...

  2. android调用系统拍照、相册

    1.调用系统拍照 首先需要申请相机权限 <uses-permission android:name="android.permission.CAMERA" /> pri ...

  3. Android调用系统打电话和发短信功能

    一.打电话 1.添加打电话的权限在manifast文件中. <uses-permission Android:name="android.permission.CALL_PHONE&q ...

  4. android 实现自动拍照,Android:调用系统相机实现拍照+裁切(兼容7.0以上系统)

    android.jpg 前言 在平时的工作中,我们会经常遇到这样的需求:比如更改用户头像,我们就需要打开相机或相册,选择照片后进行裁剪,最后上传给后台... 相信这样的功能对小伙伴们来说可能早已司空见 ...

  5. Android调用系统的拍照,打开相册功能

    Android调用系统的拍照,打开相册功能 1 添加权限: <!-- 往SDCard写入数据权限 --> <uses-permission android:name="an ...

  6. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  7. Android调用系统相机拍照并保存到指定位置

    Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto)void onclick() {Intent intent = new Intent(MediaSt ...

  8. Android 调用系统裁剪,适配11和12及手机

    前言:发现Android 调用系统裁剪时,在各Android 版本出现各种问题,踩了一堆坑,做一下总结,免得以后忘记 后面会有完整裁剪代码 1,一加手机报错 intent.putExtra(" ...

  9. Android 调用系统照相机拍照和录像

    Android 调用系统照相机拍照和录像 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.and ...

最新文章

  1. HDU - 3078 Network 倍增LCA
  2. Groovy开发语言
  3. php5.6.33安装教程,centos7手动安装PHP5.6.33详解
  4. Zephyr应用笔记:mcuboot引导程序简单介绍
  5. 通信原理速识1:绪论
  6. Silverlight 出现“无法加载 URI 的内容。URI 可能无效”错误的解决方案
  7. 为什么很多技术都觉得前端很简单?为什么?为什么?
  8. 自然语言处理 4.语义分析
  9. vue的万年历(日历)组件
  10. linux系统安装红蜘蛛,在linux Deepin深度系统安装多媒体电子教室Veyon
  11. 常用网络端口对照表以及端口说明
  12. rapidminer decision tree(决策树)手册
  13. 2022年前端自学全套路线总结(黑马版)
  14. header html 高度,CSS经典基础布局,自适应高度。header,content,footer.
  15. firefox主页被360篡改_IE浏览器主页被劫持,如何解决主页被篡改问题?
  16. Inception-V3论文翻译——中英文对照
  17. 单向一对多和双向一对多
  18. 加快C++代码的编译速度方法
  19. 一个 Spring Boot 面试题
  20. SEO之了解搜索引擎

热门文章

  1. 关于压缩工具 7z(7-zip) 如何设置压缩算法(选项 -m 的解读)
  2. Matplotlib常用库方法
  3. 驾校约车html网站源码,html5首汽约车微信感恩活动页面模板
  4. matlab 返回变量类型的命令,MATLAB主要命令汇总
  5. python使用elasticsearch_python中使用ElasticSearch(二)
  6. LeetCode 234 回文链表
  7. 弱口令扫描工具mysql ftp_基于端口的弱口令检测工具--iscan
  8. oracle 递归计算,SQL(Oracle)中的递归计算
  9. css 竖行进度图_前端学习--汇集了大量 CSS 的使用和学习的示例代码
  10. 机箱硬盘指示灯不亮_安钛克DF600 FLUX机箱:FLUX平台第一款机箱,为全民电竞热“降温”...