17.1 相机
获取权限,请求权限
viewBinding.takePhoto.setOnClickListener {
val cameraPermission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
// 请求相机权限
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.CAMERA),
1
)
} else {
takePhoto()
}
}
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
权限处理
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
takePhoto()
} else {
Toast.makeText(this, "Have not camera permission", Toast.LENGTH_SHORT).show()
}
}
}
}
设置回调 registerForActivityResult
private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val data: Intent? = it.data
// val imageBitmap = data?.extras?.get("data") as Bitmap
// viewBinding.imageView.setImageBitmap(imageBitmap)
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))
viewBinding.imageView.setImageBitmap(rotateIfRequired(bitmap))
}
}
打开相机
fun takePhoto() {
// 创建File对象用于存储拍照后的图片
outputImage = File(externalCacheDir, "output_image.jpg")
if (outputImage.exists()) {
outputImage.delete()
}
outputImage.createNewFile()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
imageUri = FileProvider.getUriForFile(this, "com.example.cameraalbumtest.fileprovider", outputImage)
} else {
imageUri = Uri.fromFile(outputImage)
}
// 启动相机程序
val intent = Intent("android.media.action.IMAGE_CAPTURE")
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
resultLauncher.launch(intent)
}
图片旋转相关
private fun rotateIfRequired(bitmap: Bitmap): Bitmap {
val exif = ExifInterface(outputImage.path)
val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL)
return when (orientation) {
ExifInterface.ORIENTATION_ROTATE_90 -> rotateBitmap(bitmap, 90)
ExifInterface.ORIENTATION_ROTATE_180 -> rotateBitmap(bitmap, 180)
ExifInterface.ORIENTATION_ROTATE_270 -> rotateBitmap(bitmap, 270)
else -> bitmap
}
}
private fun rotateBitmap(bitmap: Bitmap, degree: Int): Bitmap {
val matrix = Matrix()
matrix.postRotate(degree.toFloat())
val rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height,
matrix, true)
bitmap.recycle() // 将不再需要的Bitmap对象回收
return rotatedBitmap
}
17.2 相册
获取权限,请求权限
viewBinding.fromAlbum.setOnClickListener {
val albumPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
if (albumPermission != PackageManager.PERMISSION_GRANTED) {
// 请求相册权限
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
2
)
} else {
openAlbum()
}
}
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
权限处理
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
// ...
2 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openAlbum()
} else {
Toast.makeText(this, "Have not album permission", Toast.LENGTH_SHORT).show()
}
}
}
}
设置回调 registerForActivityResult
private val albumResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val data: Intent? = it.data
data?.data?.let {
// 将选择的图片展示
val bitmap = getBitmapFromUri(it)
if (bitmap != null) {
viewBinding.imageView.setImageBitmap(bitmap)
}
}
}
}
fun getBitmapFromUri(uri: Uri) = contentResolver.openFileDescriptor(uri, "r")?.use {
BitmapFactory.decodeFileDescriptor(it.fileDescriptor)
}
打开相机
fun openAlbum() {
// 打开文件选择器
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
// 指定只显示图片
intent.type = "image/*"
albumResultLauncher.launch(intent)
}