Android: Conas grianghraf a thógáil le Kotlin

I mo chéad alt ar an ardán seo, ba mhaith liom a mhíniú conas is féidir leat an aip ceamara a úsáid chun grianghraf a thógáil in Android agus an íomhá mar thoradh air a chomhtháthú i d’iarratas. Gach seo le Kotlin mar theanga cláir.

Ar dtús ní mór dúinn tionscadal nua a chruthú i Android Studio. Sa sampla seo tá Android Studio 2.3.3 á úsáid agam.

A luaithe a chruthaímid an tionscadal nua, ní mór dúinn an tionscadal a shainiú ionas gur féidir linn oibriú le Kotlin. Chun seo a dhéanamh, lean na treoracha ar shuíomh Gréasáin Kotlin:

Úsáidtear roinnt leabharlanna sa tionscadal seo chun roinnt céimeanna a shimpliú, i.e. B. Féach ceangailteach, íomhánna a thaispeáint agus ceadanna a iarraidh:

  • D'úsáid mé Butterknife chun an dearcadh a cheangal: http://jakewharton.github.io/butterknife/
  • Chuir mé Dexter leis an iarratas ar chead: https://github.com/Karumi/Dexter
  • D'úsáid mé Fresco chun na pictiúir a thaispeáint: http://frescolib.org/

Is é an chéad chéim eile na ceadanna a theastaíonn dár n-aip a shonrú inár bhfógra Android. Sa chás seo ní mór dúinn an android.permission.WRITE_EXTERNAL_STORAGE.

Cruthaímid an leagan amach dár bpríomhghníomhaíocht





    

    

Breathnaíonn an scáileán mar seo:

Príomhghníomhaíocht

Sa chomhad MainActivity.kt, chuireamar éisteoir cliceáil ar an gcnaipe gníomhaíochta ar snámh ionas gur féidir linn an aip ceamara a thosú nuair a sconna an t-úsáideoir air.

Sáraíonn an spraoi arCreate (savedInstanceState: Beart?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) ButterKnife.bind fabCapturePhoto? .setOnClickListener {validatePermissions ()}}

Déanann an modh validatePermission () na ceadanna scríbhneoireachta a theastaíonn don aip a sheiceáil agus a iarraidh. Má deonaíodh an t-údarú, tosaítear an aip ceamara le hintinn:

spraoi príobháideach validatePermissions () {Dexter.withActivity (seo) .withPermission (Manifest.permission.WRITE_EXTERNAL_STORAGE) .withListener (réad: PermissionListener {ró-scríobh spraoi arPermissionGranted (freagra: PermissionGrantedResponse?) {launchCamera () , Token: PermissionToken?) {AlertDialog.Builder (seo @ MainActivity) .setTitle (R.string.storage_permission_rationale_title) .setMessage (R.string.storage_permition_rationale_message) .setNegativeButton (android.R.string.cancel ,. dialóg.dismiss () comhartha? .cancelPermissionRequest ()}) .setPositiveButton (android.R.string.ok, {dialog, _ -> dialog.dismiss () Token? .continuePermissionRequest ()}) .setOnDismissListener ({Token? .cancelPermissionRequest ()}). ()} an spraoi a fhorscríobh arPermissionDenied (freagra: PermissionDeniedResponse?) {Snackbar.make (mainContainer !!, R.string.storage_permission_denied_message, Snackbar.LENGTH_LONG) .Show ()}}) .Check ()}

Cruthaíonn an modh launchCamera () cosán a chuirimid ar aghaidh chuig ár n-intinn agus a ghlaoimid an aip ceamara ansin. Ní mór dúinn freisin an cosán a chruthaigh muid in athróg ball a shábháil le húsáid níos déanaí.

spraoi príobháideach launchCamera () {val values ​​= ContentValues ​​(1) values.put (MediaStore.Images.Media.MIME_TYPE, "image / jpg") val fileUri = contentResolver .insert (MediaStore.Images.Media.EXTERNAL_CONTENT_URI, luachanna) val = hintinn intinn (MediaStore.ACTION_IMAGE_CAPTURE) más rud é (intent.resolveActivity (bainisteoir pacáiste)! = null) {mCurrentPhotoPath = fileUri.toString () intent.putExtra (MediaStore.EXTRA_OUTPUT, fileURI) intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION nó intinn .FLAG_GRANT_WRITE_URI_PERMISSION) startActivityForResult (rún, TAKE_PHOTO_REQUEST)}}

Nuair a bheidh an grianghraf tógtha againn, caithfimid onActivityResult () a chur i bhfeidhm ionas gur féidir linn an grianghraf a thógamar a phróiseáil agus a thaispeáint:

Sáraigh an spraoi arActivityResult (requestCode: Int, resultCode: Int, Data: Intinn?) {
más rud é (resultCode == Activity.RESULT_OK && requestCode == TAKE_PHOTO_REQUEST) {processCapturedPhoto ()} eile {super.onActivityResult (requestCode, resultCode, data)}}

Ó tharla go bhfuil an grianghraf bunaidh ró-mhór, d’fhéadfadh go dtarlódh earráid chuimhne nuair a dhéanann tú iarracht é a thaispeáint inár n-aip. Cuireann Fresco bealach éasca ar fáil chun an íomhá a athrú sula dtaispeánfaimid í.

próiseas spraoi príobháideachCapturedPhoto () {val cursor = contentResolver.query (Uri.parse (mCurrentPhotoPath), Array (1) {android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null) cursor.moveToFirst () val photoPath = cursor.getString (0) cursor.close () val file = comhad (photoPath) val uri = Uri.fromFile (comhad) val height = resources.getDimensionPixelSize (R.dimen.photo_height) val width = resources.getDimensionPixelSize (R .dimen.photo_width) val request = ImageRequestBuilder.newBuilderWithSource (uri) .setResizeOptions (ResizeOptions (Leithead, Airde)) .build () val rialaitheoir = Fresco.newDraweeControllerBuilder () .setOldController (imgvP. thógáil () imgvPhoto? .controller = rialaitheoir}

Anois is féidir linn grianghraif a thógáil agus iad a thaispeáint go héasca inár n-aip.

Is féidir cód foinse an tionscadail shamplach a fháil anseo: https://github.com/bionicwan/capturephoto