Android: Котлинмен қалай суретке түсіру керек

Осы платформадағы алғашқы мақалада камерада қосымшаны Android-де суретке түсіруге және алынған кескінді қолданбаңызға қалай біріктіруге болатындығын түсіндіргім келеді. Мұның бәрі Котлинмен бағдарламалау тілі ретінде.

Алдымен Android Studio-да жаңа жоба жасау керек. Бұл мысалда мен Android Studio 2.3.3 қолданамын.

Жаңа жобаны жасағаннан кейін біз Котлинмен жұмыс жасай алатындай етіп жобаны анықтап алуымыз керек. Ол үшін Котлин веб-сайтындағы нұсқауларды орындаңыз:

Бұл жобада кейбір кітапханалар бірнеше қадамдарды жеңілдету үшін қолданылады, мысалы Байланыстыруды, суреттерді көрсетуді және рұқсат сұрауды қарау:

  • Мен Butterknife-ті көріністі байланыстыру үшін қолдандым: http://jakewharton.github.io/butterknife/
  • Мен Декстерді рұқсат сұрауына қостым: https://github.com/Karumi/Dexter
  • Мен Фресканы суреттерді көрсету үшін қолдандым: http://frescolib.org/

Келесі қадам - ​​біздің Android манифестімізде бағдарламаға қажетті рұқсаттарды анықтау. Бұл жағдайда бізге android.permission.WRITE_EXTERNAL_STORAGE қажет.

Негізгі іс-әрекетіміздің схемасын құрайық





    

    

Экран келесідей:

Негізгі қызметі

MainActivity.kt файлында қолданушыны тапқан кезде камераны қосуға болатындай етіп, өзгермелі әрекет батырмасына клик тыңдаушысын қоямыз.

Көңіл көтеру OnCreate (үнемделгенInstanceState: Жинақ?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) ButterKnife.bind fabCapturePhoto? .setOnClickListener {validatePermissions ()}}

ValidatePermission () әдісі қолданбаға қажетті жазуға рұқсатты тексереді және сұрайды. Егер рұқсат берілсе, камера бағдарламасы ниет арқылы іске қосылады:

жеке көңілді validatePermissions () {Dexter.withActivity (бұл) .withPermission (Manifest.permission.WRITE_EXTERNAL_STORAGE) .withListener (нысан: PermissionListener {көңілді жазудыPermissionGranted үстінен жазады (жауап: PermissionGrantedResponse?) {launchCamera () , Токен: PermissionToken?) {AlertDialog.Builder (бұл @ MainActivity) .setTitle (R.string.storage_permission_rationale_title) .setMessage (R.string.storage_permition_rationale_message) .setNegativeButton (android.Relstr. диалог.dismiss () таңбасы? .cancelPermissionRequest ()}) .setPositiveButton (android.R.string.ok, {диалог, _ -> диалог.dismiss () Token? .continuePermissionRequest ()}) .setOnDismissListener ({Token? .cancelPermissionRequest ()}). ()} көңілді жазудыPermissionDenied үстінен жазыңыз (жауап: PermissionDeniedResponse?) {Snackbar.make (mainContainer !!, R.string.storage_permission_denied_message, Snackbar.LENGTH_LONG) .Show ()}}) .Show ()}})

LaunchCamera () әдісі біздің мақсатымызға өтіп, содан кейін камера қосымшасын шақыратын жол жасайды. Біз сондай-ақ кейінірек пайдалану үшін мүше айнымалысында жасаған жолды сақтауымыз керек.

жеке көңілді іске қосуCamera () {вал мәндері = ContentValues ​​(1) value.put (MediaStore.Images.Media.MIME_TYPE, «image / jpg») val fileUri = contentResolver .insert (MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Мәндер) val intent = Ниет (MediaStore.ACTION_IMAGE_CAPTURE) егер (intent.resolveActivity (packManager)! = Бос) {mCurrentPhotoPath = fileUri.toString () intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri) intent.REREREREREREREREREVEREREREREFREEVEREREREREREREFREEVEREREREREREFREVE) .FLAG_GRANT_WRITE_URI_PERMISSION) startActivityForResult (ниет, TAKE_PHOTO_REQUEST)}}

Біз суретке түсіргеннен кейін, біз түсірген суретті өңдей және көрсете алу үшін onActivityResult () бағдарламасын енгізуіміз керек:

OnActivityResult бағдарламасындағы көңілді қайта анықтаңыз (сұрау коды: Int, нәтиже коды: Int, Деректер: ниет?) {
егер (resultCode == Әрекет.RESULT_OK && requestCode == TAKE_PHOTO_REQUEST) {processCapturedPhoto ()} else {super.onActivityResult (requestCode, resultCode, data)}}

Түпнұсқа фотосурет тым үлкен болғандықтан, оны біздің бағдарламада көрсетуге тырысқанда жадта қате пайда болуы мүмкін. Фреско суретті көрсетпес бұрын оның өлшемін өзгертудің оңай әдісін ұсынады.

жеке көңілді процессCapturedPhoto () {val курсоры = contentResolver.query (Uri.parse (mCurrentPhotoPath), массив (1) {android.provider.MediaStore.Images.ImageColumns.DATA}, бос, бос, нөл) курсор.moveToFirst () photoPath = cursor.getString (0) cursor.close () val файл = файл (photoPath) val uri = Uri.fromFile (файл) val height = resources.getDimensionPixelSize (R.dimen.photo_height) val ені = resources.getDimensionPixelSize (R) .dimen.photo_width) сұраныс = ImageRequestBuilder.newBuilderWithSource (uri) .setResizeOptions (ResizeOptions (ені, биіктігі)) .build () val контроллері = Fresco.newDraweeControllerBuilder () .setOldController (immg) құрастыру () imgvФото? .controller = контроллер}

Енді біз суретке түсіріп, оларды бағдарламада оңай көрсете аламыз.

Үлгі жобаның бастапқы кодын мына жерден табуға болады: https://github.com/bionicwan/capturephoto