Android: kuidas Kotlini abil fotot teha

Selle platvormi esimese artikli jaoks tahan selgitada, kuidas saate Androidi fotoaparaati kasutades kaamerarakendust pildistada ja saadud pildi oma rakendusse saada. Kõike seda kasutades programmeerimiskeelena Kotlin.

Esmalt peame Android Studio-is looma uue projekti. Selle näite jaoks kasutan Android Studio 2.3.3.

Kui oleme uue projekti loonud, peame projekti paika panema, et saaksime Kotliniga koostööd alustada. Seda saate teha Kotlini saidi juhendit järgides:

Selles projektis kasutan mõnda raamatukogu, et lihtsustada mõnda toimingut, näiteks köitmise kuvamine, piltide kuvamine ja loataotlused:

  • Vaate köitmiseks kasutasin Butterknife: http://jakewharton.github.io/butterknife/
  • Loataotluse jaoks lisasin Dexteri: https://github.com/Karumi/Dexter
  • Piltide kuvamiseks kasutasin Freskot: http://frescolib.org/

Järgmine samm on Android-manifestis täpsustada õigused, mida meie rakendus nõuab. Sel juhul vajame android.permission.WRITE_EXTERNAL_STORAGE.

Loome meie põhitegevuse paigutuse





    

    

Ekraan näeb välja selline:

Põhitegevus

Failis MainActivity.kt seame klõpsu kuulaja nupule Ujuv toimingunupp, et saaksime kaamerarakenduse käivitada, kui kasutaja seda koputab.

alistada lõbus onCreate (savedInstanceState: Bundle?) {
    super.onCreate (savedInstanceState)
    setContentView (R.layout.activity_main)
    ButterKnife.bind (see)
    fabCapturePhoto? .setOnClickListener {validePermissions ()}
}

ValidePermission () meetod hoolitseb rakenduse poolt nõutavate kirjutusõiguste kontrollimise ja taotlemise eest. Kui luba antakse, käivitab see kaamerarakenduse kavatsuse kaudu:

privaatne lõbus validatePermissions () {
    Dexter.Aktiivsusega (see)
         .withPermission (Manifest.permission.WRITE_EXTERNAL_STORAGE)
         .withListener (objekt: PermissionListener {
                alistada lõbus saidilPermissionGranted (
                  vastus: PermissionGrantedResponse?) {
                    käivituskaamera ()
                }

                alistada lõbus saidilPermissionRationaleShouldBeShown (
                   luba: PermissionRequest ?,
                   märk: PermissionToken?) {
                      AlertDialog.Builder (see @ MainActivity)
                            .setTitle (
                       R.string.storage_permission_rationale_title)
                            .setMessage (
                       R.string.storage_permition_rationale_message)
                            .setNegativeButton (
                       android.R.string.cancel,
                                    {dialoog, _ ->
                                    dialog.dismiss ()
                                    token? .cancelPermissionRequest ()
                                    })
                            .setPositiveButton (android.R.string.ok,
                                    {dialoog, _ ->
                                  dialog.dismiss ()
                                  token?. ContinuePermissionRequest ()
                                    })
                            .setOnDismissListener ({
                                 token? .cancelPermissionRequest ()})
                            .show ()
                }

                alistada lõbus saidilPermissionDenied (
                    vastus: PermissionDeniedResponse?) {
                       Snackbar.make (mainContainer !!,
                         R.string.storage_permission_denied_message,
                         Snackbar.LENGTH_LONG)
                       .show ()
                }
            })
            .Kontrollima()
}

StartCamera () meetod loob tee, mille me kavatseme ületada, ja kutsub seejärel üles kaamerarakendust. Samuti peame hilisemaks kasutamiseks salvestama liikmesmuutujasse loodud tee.

privaatne lõbus kaamera () {
    val väärtused = ContentValues ​​(1)
    value.put (MediaStore.Images.Media.MIME_TYPE, "image / jpg")
    val fileUri = contentResolver
            sisestus (MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    väärtused)
    val intent = Intent (MediaStore.ACTION_IMAGE_CAPTURE)
    if (intent.resolveActivity (packageManager)! = null) {
        mCurrentPhotoPath = fileUri.toString ()
        intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri)
        intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION
                või kavatsus.FLAG_GRANT_WRITE_URI_PERMISSION)
        startActivityForResult (kavatsus, TAKE_PHOTO_REQUEST)
    }
}

Kui foto on jäädvustatud, peame rakendama onActivityResult (), et saaksime äsja jäädvustatud fotot töödelda ja kuvada:

alistada lõbus onActivityResult (requestCode: Int, resultCode: Int,
                              andmed: kavatsus?) {
    if (resultCode == Tegevus.RESULT_OK
           && requestCode == TAKE_PHOTO_REQUEST) {
        protsessCapturedPhoto ()
    } veel {
        super.onActivityResult (requestCode, resultCode, data)
    }
}

Kuna algne foto on liiga suur, võib see meie rakenduses kuvamise korral põhjustada mälu lõppemise tõrke. Fresco pakub lihtsat viisi pildi suuruse muutmiseks enne selle kuvamist.

privaatne lõbus protsessCapturedPhoto () {
    val kursor = contentResolver.query (Uri.parse (mCurrentPhotoPath),
            Massiiv (1) {android.provider.MediaStore.Images.ImageColumns.DATA}
            null, null, null)
    cursor.moveToFirst ()
    val photoPath = cursor.getString (0)
    cursor.close ()
    val fail = fail (photoPath)
    val uri = Uri.failist (fail)

    val kõrgus = ressursid.getDimensionPixelSize (R.dimen.photo_height)
    val laius = ressursid.getDimensionPixelSize (R.dimen.photo_width)

    val request = ImageRequestBuilder.newBuilderWithSource (uri)
            .setResizeOptions (ResizeOptions (laius, kõrgus))
            .build ()
    vali kontroller = Fresco.newDraweeControllerBuilder ()
            .setOldController (imgvPhoto? .controller)
            .setImageRequest (taotlus)
            .build ()
    imgvPhoto? .kontroller = kontroller
}

Nii see on, nüüd saame teha fotosid ja kuvada neid oma rakenduses väga lihtsal viisil.

Näidisprojekti lähtekoodi leiate siit: https://github.com/bionicwan/capturephoto