Преобразовать растровое изображение в URI внутри фрагмента в kotlin - PullRequest
0 голосов
/ 28 февраля 2020

Я сохранил растровое изображение из захвата камеры в переменную photo. Теперь я хочу преобразовать его в URI, чтобы я мог сохранить его в файле и затем сохранить на своем сервере.

Вот как я храню растровое изображение:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK && data !=null) {
            if (requestCode == REQUEST_IMAGE_CAPTURE){
                val imageView = view!!.findViewById<ImageView>(R.id.display_image)

                //FOR CAMERA CAPTURE
                                 photo = data.getExtras().get("data") as Bitmap
//                getImageUriFromBitmap(context,photo!!)

                 filePath = getImageFilePath(data)
                val outputFileUri1 =getImageUriFromBitmap(activity!!,photo!!)
                intermediate = activity!!.contentResolver.getType(outputFileUri)

                if (filePath != null) {

                        mBitmap = BitmapFactory.decodeFile(filePath)
                        imageView.setImageBitmap(mBitmap)

                }
                                imageView.setImageBitmap(photo)

//                 finalPath = photo.toString()

//                finalPath = getImageUri(context,photo)

//                Log.d("getting camera path",finalPath)
//                val scaled = Bitmap.createScaledBitmap(photo,500,500,true)
//                val photo = Bitmap.createScaledBitmap(data.getExtras().get("data") as Bitmap,50,50,true)

//                var cameraconverted = getImageUri(getActivity()!!.getApplicationContext(),photo!!)
//                 finalPathOfCamera = getPathFromURI(cameraconverted)
//
//                Log.d("finalPathOfCamera",finalPathOfCamera)


            } else if(requestCode== IMAGE_PICK_CODE) {

                val imageView = view!!.findViewById<ImageView>(R.id.display_image)

                // Get image URI From intent FOR UPLOADING

                                 imageUri = data.data

                intermediate = activity!!.contentResolver.getType(imageUri!!)

                filePath = getImageFilePath(data)
                if (filePath != null) {

                    mBitmap = BitmapFactory.decodeFile(filePath)
                    imageView.setImageBitmap(mBitmap)

                    cursor!!.close()
                }

                makeComplaint_button!!.backgroundTintList = activity!!.getColorStateList( R.color.color_selector)
                makeComplaint_button!!.isEnabled = true
//                // do something with the image URI
//                imageView.setImageURI(imageUri)

//                var finalPathOfUpload = imageUri!!.path
//                 finalPathOfUpload = getPathFromURI(imageUri!!)



//                 finalPath = imageUri.toString()

//                Log.d("getting upload path",finalPath)
//                Log.d("getfinalPathOfUpload",finalPathOfUpload)




            }
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

Сейчас я использую это: photo = data.getExtras (). Get ("data" ) в качестве растрового изображения, чтобы сохранить мое изображение и отобразить его с помощью этого: imageView.setImageBitmap (фото) Это работает нормально.

Но я хочу использовать эту функцию: filePath = getImageFilePath (data), чтобы получить URI и сохранить его как URI в ouputFileUri, а затем как файл в filePath.

Это как работает getImageFilePath:

   fun getImageFilePath(data: Intent): String {
        return getImageFromFilePath(data)
    }

    private fun getImageFromFilePath(data: Intent?): String {
        val isCamera = data == null || data.data == null

        return if (isCamera)
            getCaptureImageOutputUri()!!.getPath()
//            getCaptureImageOutputUri()!!.getAbsolutePath()
        else
            getPathFromURI(data!!.data)

    }

    private fun getCaptureImageOutputUri(): Uri? {
        val getImage = activity!!.getExternalFilesDir("")
        if (getImage != null) {
            outputFileUri = Uri.fromFile(File(getImage.path, "profile.png"))
//            outputFileUri= getImageUriFromBitmap(activity!!,photo!!)
        }
        return outputFileUri
    }

Но outputFileUri всегда возвращается null. Может ли кто-нибудь помочь мне с этим, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2020
// Get the image from drawable resource as drawable object
// Get the bitmap from drawable object

// Initializing a new file
// The bellow line return a directory in internal storage
var file: File = Environment.getExternalStoragePublicDirectory("yourFolderName")

if (!file.exists()) {
    // Create a file to save the image
    file.mkdirs()
}

file = File(file, "yourPicName")
try {
    // Get the file output stream
    val stream: OutputStream = FileOutputStream(file)

    stream.use {
        // Compress bitmap
        this.compress(Bitmap.CompressFormat.JPEG, 100, it)

        // Flush the stream
        it.flush()

        // Close stream
        it.close()

        val uri:Uri = file.toUri()

        // OR

        val uri2:Uri = Uri.fromFile(file)
    }
} catch (e: IOException) { // Catch the exception
    e.printStackTrace()
}
0 голосов
/ 29 февраля 2020

вы можете найти инструменты от https://github.com/Blankj/AndroidUtilCode/tree/master/lib/utilcode.

0 голосов
/ 28 февраля 2020

во время увольнения вы можете передать дополнительно как MediaStore.EXTRA_OUTPUT в качестве местоположения вашего файла, а позже вы получите Uri в результате активности как Uri. Ссылка:

И если вам нужен Uri из файла, вы можете использовать FileProvider для получения его Uri.

 Uri uri = FileProvider.getUriForFile(context, "com.package.name.fileprovider", file);
...