Android studio 使用registerForActivityResult访问相机和图库。当点击图库后,不选择图片直接返回到选择界面,选择相机,此时还是显示图库界面,应该怎样解决?求指导。
具体错误如图所示:
相关代码如下:
private val takePicture = registerForActivityResult(
ActivityResultContracts.TakePicture()
) { success ->
if (success) {
imagePath = outputImage.absolutePath
//将照片显示出来
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))
}
} else {
finish()
}
}
//使用GetContent()文件选择器 是无法直接打开相册 需要用户自行选择打开
private val selectPhoto = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri == null) {
finish()
return@registerForActivityResult
}
val filePathColumns = arrayOf(MediaStore.Images.Media.DATA)
val cursor =
uri?.let { contentResolver.query(it, filePathColumns, null, null, null) }
cursor!!.moveToFirst()
val columnIndex = cursor.getColumnIndex(filePathColumns[0])
//获取图片路径
val imagePath = cursor.getString(columnIndex)
cursor.close()
//显示图片
picture.setImageURI(uri)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.camera)
service =ServiceCreator.create() //对ApiService进行实例化
intent1 = Intent(this, MainActivity::class.java)
//根据intent传递数据中的标记值判断进行拍照还是从图库中选择照片
takePhotoOrSelectionPicture()
}
private fun takePhotoOrSelectionPicture() {
val intent: Intent = intent
try {
if (intent.extras != null) {
if (intent.extras!!.getInt("flag") == 1) {
openAlbums()}
}else {
startPhoto()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
//拍照
private fun startPhoto() {
//创建一个File对象,用于存储拍照后的图片
outputImage = File(externalCacheDir, "output_image.jpg")
//对照片的更换设置
try {
//如果上一次的照片存在,就删除
if (outputImage.exists()) {
outputImage.delete()
}
//就创建一个新的文件
outputImage.createNewFile()
} catch (e: Exception) {
e.printStackTrace()
}
//将File对象转换成Uri对象
imageUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(this, "com.demo2.android.fileprovider", outputImage)
} else {
Uri.fromFile(outputImage)
}
takePicture.launch(imageUri)
}
//图库
private fun openAlbums() {
selectPhoto.launch("image/*")
}