August 13, 2021

Get Image from gallery or Camera in android

By lj007

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
                }
            }
        }
    }