Select Image from device

IntentChooser to get image from gallery

We need to create chooser intent to select image from device.

    private fun openPickerNow() {
        val getIntent = Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        getIntent.type = "image/*"

        startActivityForResult(Intent.createChooser(getIntent, "Select Image"), PICK_IMAGE)
    }

Get image from camera

  
  var photoFile: File? = null //Global variable
  
  override fun openCamera() {

        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
            // Ensure that there's a camera activity to handle the intent
            takePictureIntent.resolveActivity(packageManager)?.also {
                // Create the File where the photo should go
                photoFile = try { AppUtils.createImageFile(baseContext)
                } catch (ex: IOException) {
                    // Error occurred while creating the File
                    null
                }
                // Continue only if the File was successfully created
                photoFile?.also {
                    val photoURI: Uri = FileProvider.getUriForFile(this, "$packageName.fileprovider", it)
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                    startActivityForResult(takePictureIntent, CAPTURE_IMAGE)
                }
            }
        }
    }
  
  

utils methods to create temp image file, get real path from uri

  
  @Throws(IOException::class)
    fun createImageFile(context: Context): File {
        // Create an image file name
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
            "JPEG_${timeStamp}_", /* prefix */
            ".jpg", /* suffix */
            storageDir /* directory */
        ).apply {
            // Save a file: path for use with ACTION_VIEW intents
            return File(absolutePath)
        }
    }

    fun getRealPathFromUri(contentUri: Uri, context: Context): String? {
        var cursor: Cursor? = null
        return try {
            val proj = arrayOf(MediaStore.Images.Media.DATA)
            cursor = context.contentResolver.query(contentUri, proj, null, null, null)
            assert(cursor != null)
            val column_index: Int = cursor!!.getColumnIndexOrThrow(proj[0])
            cursor.moveToFirst()
            cursor.getString(column_index)
        } finally {
            if (cursor != null) {
                cursor.close()
            }
        }
    }
  
  

handle result when image selected from camera or gallery

  
  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode){
            PICK_IMAGE -> {
                if (data == null || data.data == null) {
                    Snackbar.make(
                        cdlSnack,
                        getString(R.string.image_not_selected),
                        Snackbar.LENGTH_SHORT
                    ).show()
                    return
                }

                val path = AppUtils.getRealPathFromUri(data.data!!, baseContext) ?: return
                val file = File(path)
                //We can upload file now
            }

            CAPTURE_IMAGE -> {
                if (photoFile != null){
                    //Here we can upload file
                }
            }
        }
    }