Jedną z funkcjonalności mojej aplikacji jest możliwość dodawania zdjęc do dokumentów. Samo robienie zdjęć jest dosyć proste.

Na początku musimy ustalić miejsce gdzie zdjęcie zostanie zapisane. Robię to w poniższy sposób:

private def getOutputMediaFile: File = {
  val mediaStorageDir: File = new File(Environment.getExternalStorageDirectory, ".temp")
  if (!mediaStorageDir.exists) {
    if (!mediaStorageDir.mkdirs) {
      Log.e(".temp", "failed to create directory")
      return null
    }
  }
  fileId = System.currentTimeMillis.toString
  new File(mediaStorageDir, File.separator + fileId + ".jpg")
}

Na początku tworzę folder „.temp”, do którego zostanie zapisane zrobione zdjęcie. Następnie tworzymy obiekt File, wskazujący dokladnie na plik, do którego ma nastąpić zapis.

Następnym krokiem jest stworzenie obiektu Uri, który będzie wskazywał na wcześniej stworzony plik:

private def getOutputMediaFileUri: Uri = {
  Uri.fromFile(getOutputMediaFile)
}

Wywołanie samej akcji odpowiedzialnej za robienie zdjęcia wygląda następująco:

def takePhotoOnClickAction(view: View): Unit = {
  val intent: Intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)

  val tempUri: Uri = getOutputMediaFileUri
  intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri)

  tempFile = new File(tempUri.getPath)

  startActivityForResult(intent, takePhotoRequestCode)
}

gdzie

takePhotoRequestCode

jest stałą definiującą kod tej akcji, a

tempFile

jest polem klasy i będzie przechowywać ścieżkę do zrobionego zdjęcia.

 

Po zrobieniu zdjęcia i zatwierdzeniu go wywoływana jest poniższa metoda:

protected override def onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
  if (requestCode == takePhotoRequestCode && resultCode == RESULT_OK) {
    // tempFile points to the taken photo
  }
}

Po sprawdzeniu czy requestCode jest zgodny z kodem naszej akcji oraz operacja jest zakończona sukcesem to wtedy możemy zająć się przetwarzaniem wykonanego zdjęcia.