Android registerForActivityResult可在dosen';t重新刻录全尺寸照片
我启动此代码以从移动相机获取照片:Android registerForActivityResult可在dosen';t重新刻录全尺寸照片,android,kotlin,camera,Android,Kotlin,Camera,我启动此代码以从移动相机获取照片: private val getContent = registerForActivityResult(ActivityResultContracts.TakePicturePreview()) { result -> getUserLocation(result) } 但它返回的是照片缩略图,而不是全尺寸照片,我尝试使用:ActivityResultContracts.TakePicture(),但它不返回位图。使用
private val getContent =
registerForActivityResult(ActivityResultContracts.TakePicturePreview()) { result ->
getUserLocation(result)
}
但它返回的是照片缩略图,而不是全尺寸照片,我尝试使用:ActivityResultContracts.TakePicture(),但它不返回位图。使用
URI
获取完整位图。我已经创建了一个实例变量private lateinit var currentImageUri:Uri
,然后单击按钮将其传递给捕获意图
takePhontBtn.setOnClickListener {
val photoURI: Uri? = context?.let {
createImageFile().let { it1 ->
FileProvider.getUriForFile(
it,
requireContext().applicationContext.packageName.toString() + ".provider",
it1
)
}
}
photoURI?.let {
currentImageUri = it
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.putExtra(MediaStore.EXTRA_OUTPUT, it)
startForResultToLoadImage.launch(intent)
}
}
创建临时文件以保存捕获的图像:
@Throws(IOException::class)
private fun createImageFile(): File {
// Create an image file name
// val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
val storageDir: File? = requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"JPEG_TEMP_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
}
}
然后从currentImageUri
获取bitmap
。比如:
private val startForResultToLoadImage = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
try {
val selectedImage: Uri? = result.data?.data
if (selectedImage != null){
// From Gallery
}else{
// From Camera
val bitmap = BitmapFactory.decodeStream(context?.contentResolver?.openInputStream(currentImageUri))
}
} catch (error: Exception) {
Log.d("TAG==>>", "Error : ${error.localizedMessage}")
}
}
}
只需创建自定义合同即可方便地获取图像:
class CustomTakePicture : ActivityResultContract<Uri, Bitmap?>() {
@CallSuper
override fun createIntent(context: Context, input: Uri?): Intent {
return Intent(MediaStore.ACTION_IMAGE_CAPTURE)
.putExtra(MediaStore.EXTRA_OUTPUT, input)
}
override fun getSynchronousResult(context: Context, input: Uri?): SynchronousResult<Bitmap?>? {
return null
}
override fun parseResult(resultCode: Int, intent: Intent?): Bitmap? {
return if (intent == null || resultCode != Activity.RESULT_OK)
null
else
intent.getParcelableExtra("data")
}
}
使用随机uri:
fun getRandomFilepath(
context: Context,
extension: String,
directory: String = Environment.DIRECTORY_PICTURES
): String {
return "${context.getExternalFilesDir(directory)?.absolutePath}/${System.currentTimeMillis()}.$extension"
}
fun getRandomUri(
context: Context,
extension: String,
directory: String = Environment.DIRECTORY_PICTURES
): Uri {
return getUriFromPath(context, getRandomFilepath(context, extension, directory))
}
fun getUriFromPath(context: Context, path: String): Uri {
return FileProvider.getUriForFile(
context,
"${BuildConfig.APPLICATION_ID}.fileprovider",
File(path)
)
}
运行:
fun getRandomFilepath(
context: Context,
extension: String,
directory: String = Environment.DIRECTORY_PICTURES
): String {
return "${context.getExternalFilesDir(directory)?.absolutePath}/${System.currentTimeMillis()}.$extension"
}
fun getRandomUri(
context: Context,
extension: String,
directory: String = Environment.DIRECTORY_PICTURES
): Uri {
return getUriFromPath(context, getRandomFilepath(context, extension, directory))
}
fun getUriFromPath(context: Context, path: String): Uri {
return FileProvider.getUriForFile(
context,
"${BuildConfig.APPLICATION_ID}.fileprovider",
File(path)
)
}
val uri = getRandomUri(context, ".jpg")
getContent.launch(uri)