Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android registerForActivityResult可在dosen';t重新刻录全尺寸照片_Android_Kotlin_Camera - Fatal编程技术网

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)