Как сохранить фото с камеры в произвольном месте? - PullRequest
0 голосов
/ 14 июля 2020

В настоящее время я использую следующий код здесь :

val cameraRequestCode = 1
val cameraPermissionCode = 1
var imageUri : Uri? = null

@RequiresApi(api = Build.VERSION_CODES.M)
override fun onActivityResult(
    requestCode: Int,
    resultCode: Int,
    data: Intent?
) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == cameraRequestCode) {
        if (resultCode == Activity.RESULT_OK) {
            var stream: FileOutputStream? = null
            try {
                val photo: Bitmap =
                    MediaStore.Images.Media.getBitmap(contentResolver, imageUri)
                val saveFilePath: String = getRealPathFromURI(imageUri)
                stream = FileOutputStream(saveFilePath)
                photo.compress(Bitmap.CompressFormat.JPEG, 25, stream)
            } catch (e: IOException) {
                e.printStackTrace()
                Toast.makeText(
                    applicationContext,
                    "Can't save image !",
                    Toast.LENGTH_SHORT
                ).show()
            } finally {
                try {
                    if (stream != null) {
                        stream.close()
                        Toast.makeText(
                            applicationContext,
                            "Image saved successfully !",
                            Toast.LENGTH_SHORT
                        ).show()
                    } else {
                        Toast.makeText(
                            applicationContext,
                            "Can't save image, try again !",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                } catch (e: IOException) {
                    e.printStackTrace()
                }
            }

            farmersPixImageView.setImageURI(imageUri)
        } else if (resultCode == Activity.RESULT_CANCELED) {
            Toast.makeText(applicationContext, "Cancelled", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(applicationContext, "Can't capture image !", Toast.LENGTH_SHORT)
                .show()
        }
    }
}

private fun getRealPathFromURI(contentUri: Uri?): String {
    val proj = arrayOf(MediaStore.Images.Media.DATA)
    val cursor: Cursor = managedQuery(contentUri, proj, null, null, null)
    val column_index: Int = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
    cursor.moveToFirst()
    return cursor.getString(column_index)
}

@RequiresApi(Build.VERSION_CODES.M)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_add)

    farmersPixImageView.setOnClickListener {
        //if system os is Marshmallow or Above, we need to request runtime permission
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_DENIED ||
                checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_DENIED
            ) {
                //permission was not enabled
                val permission = arrayOf(
                    Manifest.permission.CAMERA,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                )
                //show popup to request permission
                requestPermissions(permission, cameraPermissionCode)
            } else {
                val values = ContentValues()

                values.put(
                    MediaStore.Images.Media.TITLE,
                    "${relativeFileName}_${System.currentTimeMillis()}"
                )
                values.put(
                    MediaStore.Images.Media.DISPLAY_NAME,
                    "${relativeFileName}_${getDate(
                        System.currentTimeMillis(),
                        "MM/dd/yyyy hh:mm:ss.SSS"
                    )}"
                )
                values.put(MediaStore.Images.Media.DESCRIPTION, "My Photos")
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")

                imageUri = contentResolver.insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    values
                )
                val cameraIntent =
                    Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
                startActivityForResult(cameraIntent, cameraRequestCode)
            }
        }
    }
}

Я использую это, потому что мне не удалось получить образец из официальной документации для работы .

Раньше я использовал:

    values.put(MediaStore.Images.Media.RELATIVE_PATH, relativeLocation)

, но он доступен только на Android Q и далее.

Я также не знаю, как использовать imageUri для сохранения в другое место, потому что он использует contentResolver:

imageUri = contentResolver.insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                values
            )

Как сохранить фотографию в произвольном месте, используя приведенный выше код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...