Android: Πώς να τραβήξετε μια φωτογραφία χρησιμοποιώντας το Kotlin

Για το πρώτο μου άρθρο σε αυτήν την πλατφόρμα θέλω να εξηγήσω πώς μπορείτε να τραβήξετε μια φωτογραφία στο Android χρησιμοποιώντας την εφαρμογή φωτογραφικής μηχανής και να αποκτήσετε την προκύπτουσα εικόνα στην αίτησή σας. Όλα αυτά χρησιμοποιώντας Kotlin ως γλώσσα προγραμματισμού.

Πρώτα πρέπει να δημιουργήσουμε ένα νέο έργο στο Android Studio. Για αυτό το παράδειγμα, χρησιμοποιώ το Android Studio 2.3.3.

Μόλις δημιουργήσουμε το νέο έργο, πρέπει να ορίσουμε το έργο έτσι ώστε να μπορέσουμε να αρχίσουμε να εργαζόμαστε με τον Kotlin. Μπορείτε να το κάνετε ακολουθώντας τον οδηγό στην τοποθεσία Kotlin:

Υπάρχουν μερικές βιβλιοθήκες που χρησιμοποιώ σε αυτό το έργο για να απλοποιήσω ορισμένα βήματα, όπως τη σύνδεση δεσμών, την εμφάνιση εικόνων και αιτήσεων άδειας:

  • Για τη δεσμευτική άποψη χρησιμοποίησα Butterknife: http://jakewharton.github.io/butterknife/
  • Για αίτημα άδειας συμπεριέλαβα τον Dexter: https://github.com/Karumi/Dexter
  • Για την προβολή εικόνων χρησιμοποίησα το Fresco: http://frescolib.org/

Το επόμενο βήμα είναι να καθορίσετε στο Android Manifest τα δικαιώματα που θα χρειαστεί η εφαρμογή μας. Σε αυτή την περίπτωση θα χρειαστούμε το android.permission.WRITE_EXTERNAL_STORAGE.

Ας δημιουργήσουμε τη διάταξη της κύριας δραστηριότητας μας





    

    

Η οθόνη θα έχει την εξής μορφή:

Κύρια δραστηριότητα

Στο αρχείο MainActivity.kt, πρόκειται να ορίσουμε έναν ακροατή κλικ για το κουμπί Floatting Action, ώστε να μπορέσουμε να ξεκινήσουμε την εφαρμογή κάμερας όταν ο χρήστης βυθιστεί σε αυτό.

αντικατάσταση διασκέδασης onCreate (savedInstanceState: Bundle?) {
    super.onCreate (savedInstanceState)
    setContentView (R.layout.activity_main)
    ButterKnife.bind (αυτό)
    fabCapturePhoto? .setOnClickListener {validatePermissions ()}
}}

Η μέθοδος validatePermission () φροντίζει να επαληθεύει και να ζητά τα δικαιώματα εγγραφής που απαιτεί η εφαρμογή. Αν δοθεί η άδεια, θα ξεκινήσει η εφαρμογή κάμερας μέσω μιας πρόθεσης:

ιδιωτική διασκέδαση validatePermissions () {
    Dexter.withActivity (αυτό)
         .withPermission (Manifest.permission.WRITE_EXTERNAL_STORAGE)
         .withListener (αντικείμενο: PermissionListener {
                αντικαταστήσει τη διασκέδαση onPermissionGranted (
                  απάντηση: PermissionGrantedResponse;) {
                    launchCamera ()
                }}

                αντικατάσταση διασκέδασης onPermissionRationaleShouldBeShown (
                   άδεια: PermissionRequest ?,
                   token: PermissionToken;) {
                      AlertDialog.Builder (αυτό το @ MainActivity)
                            .setTitle (
                       R.string.storage_permission_rationale_title)
                            .setMessage (
                       R.string.storage_permition_rationale_message)
                            .setNegativeButton (
                       android.R.string.cancel,
                                    {διάλογος, _ ->
                                    dialog.dismiss ()
                                    token? .cancelPermissionRequest ()
                                    })
                            .setPositiveButton (android.R.string.ok,
                                    {διάλογος, _ ->
                                  dialog.dismiss ()
                                  token? .continuePermissionRequest ()
                                    })
                            .setOnDismissListener ({
                                 token? .cancelPermissionRequest ()})
                            .προβολή()
                }}

                αντικαταστήσει τη διασκέδαση onPermissionDenied (
                    απάντηση: PermissionDeniedResponse;) {
                       Snackbar.make (mainContainer !!,
                         R.string.storage_permission_denied_message,
                         Snackbar.LENGTH_LONG)
                       .προβολή()
                }}
            })
            .έλεγχος()
}}

Η μέθοδος launchCamera () θα δημιουργήσει μια διαδρομή την οποία πρόκειται να περάσουμε στην πρόθεσή μας και στη συνέχεια να καλέσουμε την εφαρμογή κάμερας. Επίσης, πρέπει να αποθηκεύσουμε τη διαδρομή που δημιουργήσαμε σε μια μεταβλητή μέλους για μεταγενέστερη χρήση.

ιδιωτική διασκέδαση launchCamera () {
    τιμές val = Ποσότητες περιεχομένου (1)
    values.put (MediaStore.Images.Media.MIME_TYPE, "image / jpg")
    val fileUri = contentResolver
            .insert (MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    αξίες)
    πρόθεση val = πρόθεση (MediaStore.ACTION_IMAGE_CAPTURE)
    αν (intent.resolveActivity (packageManager)! = null) {
        mCurrentPhotoPath = fileUri.toString ()
        intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri)
        intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION
                ή Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
        startActivityForResult (intent, TAKE_PHOTO_REQUEST)
    }}
}}

Αφού καταγράψουμε τη φωτογραφία, πρέπει να εφαρμόσουμε την onActivityResult () ώστε να επεξεργαστούμε και να προβάλλουμε τη φωτογραφία που μόλις καταγράψαμε:

αντικατάσταση διασκέδασης onActivityResult (requestCode: Int, resultCode: Int,
                              δεδομένα: Πρόθεση;) {
    if (resultCode == Activity.RESULT_OK
           && requestCode == TAKE_PHOTO_REQUEST) {
        processCapturedPhoto ()
    } else {
        super.onActivityResult (requestCode, resultCode, δεδομένα)
    }}
}}

Δεδομένου ότι η αρχική φωτογραφία είναι πολύ μεγάλη, μπορεί να οδηγήσει σε σφάλμα εκτός λειτουργίας όταν προσπαθούμε να την εμφανίσετε στην εφαρμογή μας. Η τοιχογραφία προσφέρει έναν απλό τρόπο αλλαγής μεγέθους της εικόνας πριν την εμφανίσει.

ιδιωτική διαδικασία διασκέδασηςCapturedPhoto () {
    κύριος δρομέας = contentResolver.query (Uri.parse (mCurrentPhotoPath),
            Array (1) {android.provider.MediaStore.Images.ImageColumns.DATA},
            null, null, null)
    cursor.moveToFirst ()
    val φωτογραφίαPath = cursor.getString (0)
    cursor.close ()
    αρχείο val = Αρχείο (photoPath)
    val uri = Uri.fromFile (αρχείο)

    ύψος κύματος = resources.getDimensionPixelSize (R.dimen.photo_height)
    ύψος width = resources.getDimensionPixelSize (R.dimen.photo_width)

    αίτηση request = ImageRequestBuilder.newBuilderWithSource (uri)
            .setResizeOptions (Αλλαγή των επιλογών (πλάτος, ύψος))
            .χτίζω()
    val ελεγκτής = Fresco.newDraweeControllerBuilder ()
            .setOldController (imgvPhoto? .ελεγκτής)
            .setImageRequest (αίτημα)
            .χτίζω()
    imgvPhoto? .controller = ελεγκτής
}}

Αυτό είναι, τώρα μπορούμε να τραβήξουμε φωτογραφίες και να τις παρουσιάσουμε μέσα στην εφαρμογή μας με πολύ απλό τρόπο.

Μπορείτε να βρείτε τον πηγαίο κώδικα για το δείγμα έργου εδώ: https://github.com/bionicwan/capturephoto