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

  • 调用系统拍照
    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>
...
<provider
android: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.data
if (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] // 解析出数字格式的id
val selection = MediaStore.Images.Media._ID + "=" + id
imagePath = 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.data
val 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"), )

Android调用系统拍照裁剪和选图功能的更多相关文章

  1. Android上传图片之调用系统拍照和从相冊选择图片

    Android上传图片之调用系统拍照和从相冊选择图片 本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布 前言: 万丈高楼平底起,万事起于微末.不知不觉距离上篇博文已近四个月,2015 ...

  2. Android调用系统相册和拍照的Demo

    最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...

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

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

  4. Android 实例解说加入本地图片和调用系统拍照图片

    在项目的开发过程我们离不开图片.而有时候须要调用本地的图片,有时候须要调用拍照图片.同一时候实现拍照的方法有两种,一种是调用系统拍照功能.还有一种是自己定义拍照功能. 而本博文眼下仅仅解说第一种方法, ...

  5. 摄像头(3)调用系统拍照activity来拍照

    import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager ...

  6. 摄像头(2)调用系统拍照activity来录像

    import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager ...

  7. Android调用系统相机、自己定义相机、处理大图片

    Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...

  8. Android调用系统相机、自定义相机、处理大图片

    Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...

  9. Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

    原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...

随机推荐

  1. Redis学习篇(十)之排序

    SORT 按照键值从小到大或者从大到小的顺序进行排序 对数字进行排序 语法:SORT key [DESC] 默认情况下,是升序排序,可以指定DESC进行降序排序 对字母进行排序 语法:SORT key ...

  2. POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数

    http://poj.org/problem?id=3904   题意:给一些数,求在这些数中找出四个数互质的方案数.   莫比乌斯反演的式子有两种形式http://blog.csdn.net/out ...

  3. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  4. ACM -- 算法小结(七)Phone list解题报告

          HDOJ -- Phone list解题报告 问题描述:给出一些电话号码,如果有共同前缀则输出NO,如果没有则输出YES. 解题关键:将电话号码进行字符串排序,相邻的电话号码进行比较 Sa ...

  5. Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 分块

    D. Turtles Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/103/problem/D ...

  6. 如何判断c语言的变量类型

    变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...

  7. iOS开发系列--音频播放、录音、

    音频 在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音频,对于这些音频 ...

  8. HAproxy + keepalived 实现双机热备

    一.HAProxy简介: HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点, ...

  9. IOS上传图片方法类

    IOS上传图片方法类   iPhone开发中遇到上传图片问题,找到多资料,最终封装了一个类,请大家指点,代码如下 // // RequestPostUploadHelper.h // demodes ...

  10. MYSQL GDB SHELL

    http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201141165216974/