打开相机
注意:调用系统相机是不需要权限的
首先定义相机返回的Uri
//用于保存拍照图片的uri
private var mCameraUri: Uri? = null
创建相机返回的Uri:
/**
* 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法
*/
private fun createImageUri(): Uri? {
val status: String = Environment.getExternalStorageState()
// 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储
return if (status == Environment.MEDIA_MOUNTED) {
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ContentValues())
} else {
contentResolver.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, ContentValues())
}
}
对老版本先创建文件:
/**
* 创建保存图片的文件
*/
@Throws(IOException::class)
private fun createImageFile(): File? {
val imageName: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
val storageDir: File? = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES)
if (!storageDir?.exists()!!) {
storageDir.mkdir()
}
val tempFile = File(storageDir, imageName)
return if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) {
null
} else tempFile
}
发起相机请求
/**
* 调起相机拍照
*/
fun openCamera(){
val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
// 判断是否有相机
if (captureIntent.resolveActivity(requireActivity().packageManager) != null) {
var photoFile: File? = null
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 适配android 10
mCameraUri = createImageUri()
} else {
try {
//photoFile = File(getJpgPathEndWithSeparator() + "${System.currentTimeMillis()}.jpg")
photoFile = createImageFile()
} catch (e: IOException) {
e.printStackTrace()
}
if (photoFile != null) {
mCameraUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.fileProvider", photoFile)
} else {
Uri.fromFile(photoFile)
}
}
}
if (mCameraUri != null) {
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraUri)
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
startActivityForResult(captureIntent, 110)
}
}
}
接受回调:
override fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 110) {
if (resultCode == RESULT_OK) {
if (isAndroidQ) {
// Android 10 使用图片uri加载
bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(mCameraUri!!))
} else {
// 使用图片路径加载
bitmap = BitmapFactory.decodeFile(mCameraImagePath)
}
//这里使用了第三方库进行裁剪,如果不想要可以不用
crop_imageview.setImageToCrop(bitmap)
crop_imageview.setAutoScanEnable(false)
} else {
Toast.makeText(this, "取消", Toast.LENGTH_LONG).show()
}
}
}
萌新求个Star