Android: як зрабіць фота з Котліна

У сваёй першай артыкуле на гэтай платформе я хацеў бы растлумачыць, як вы можаце выкарыстоўваць прыкладанне камеры, каб зрабіць фота ў Android і інтэграваць атрыманае малюнак у сваё прыкладанне. Усё гэта з Kotlin як мова праграмавання.

Для пачатку нам трэба стварыць новы праект у Android Studio. У гэтым прыкладзе я выкарыстоўваю Android Studio 2.3.3.

Як толькі мы стварылі новы праект, мы павінны вызначыць яго, каб мы маглі працаваць з Котлінам. Для гэтага вынікайце інструкцыям на сайце Котліна:

Некаторыя бібліятэкі выкарыстоўваюцца ў гэтым праекце для спрашчэння некаторых этапаў, напрыклад. B. Праглядзіце прывязку, адлюстраванне малюнкаў і запыт дазволаў:

  • Я выкарыстаў нож для прывязкі гледжання: http://jakewharton.github.io/butterknife/
  • Я дадаў Dexter у запыт на дазвол: https://github.com/Karumi/Dexter
  • Я выкарыстаў Fresco для адлюстравання малюнкаў: http://frescolib.org/

Наступны крок - вызначыць дазволы, неабходныя для нашага прыкладання ў маніфесце Android. У гэтым выпадку нам патрэбны android.permission.WRITE_EXTERNAL_STORAGE.

Давайце створым макет для нашай асноўнай дзейнасці





    

    

Экран выглядае так:

Асноўная дзейнасць

У файле MainActivity.kt мы ставім праслухоўвальнік клікаў на плывучую кнопку дзеянняў, каб мы маглі запусціць прыкладанне камеры, калі карыстальнік націсне на яго.

Весела пераадолець onCreate (saveInstanceState: Bundle?) {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?) {запускCamera () , Токен: PermissionToken?) {AlertDialog.Builder (гэта @ MainActivity) .setTitle (R.string.storage_permission_rationale_title) .setMessage (R.string.storage_permition_rationale_message) .setNegativeButton (android.R.string.cancel, token dialog.dismiss ()? .cancelPermissionRequest ()}) .setPositiveButton (android.R.string.ok, {dialog, _ -> dialog.dismiss () токен? .continuePermissionRequest ()}) .setOnDismissListener ({Token? .cancelPermissionRequest ()}). Show ()} перазапісаць весела onPermissionDenied (адказ: PermissionDeniedResponse?) {Snackbar.make (mainContainer !!, R.string.storage_permission_denied_message, Snackbar.LENGTH_LONG). Show ()}}) .Check ()}

Метад launchCamera () стварае шлях, які мы пераходзім да нашага намеру, а потым выклікае дадатак камеры. Нам таксама трэба захаваць шлях, які мы стварылі ў зменнай члене для наступнага выкарыстання.

private fun startCamera () {val values ​​= ContentValues ​​(1) values.put (MediaStore.Images.Media.MIME_TYPE, "image / jpg") val fileUri = contentResolver .insert (MediaStore.Images.Media.EXTERNAL_CONTENT_URI, значэння) = Вэл намер намер (MediaStore.ACTION_IMAGE_CAPTURE), калі (intent.resolveActivity (менеджэр пакетаў)! = 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 (намер, TAKE_PHOTO_REQUEST)}}

Пасля таго як мы зрабілі фотаздымак, нам трэба рэалізаваць onActivityResult (), каб мы маглі апрацаваць і адлюстраваць толькі што зробленае намі фота:

Перазначыць задавальненне onActivityResult (requestCode: Int, resultCode: Int, Дадзеныя: Намер?) {
if (resultCode == Activity.RESULT_OK && requestCode == TAKE_PHOTO_REQUEST) {processCapptedPhoto ()} else {super.onActivityResult (requestCode, resultCode, дадзеныя)}}

Паколькі арыгінальная фатаграфія занадта вялікая, пры спробе адлюстраваць яе ў нашым дадатку можа паўстаць памылка памяці. Фрэска прапануе просты спосаб змяніць памер малюнка, перш чым мы яго адлюструем.

private fun processCapptedPhoto () {val cursor = contentResolver.query (Uri.parse (mCurrentPhotoPath), масіў (1) {android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null) cursor.moveToFirst () val photoPath = cursor.getString (0) cursor.close () val file = файл (photoPath) val uri = Uri.fromFile (файл) вышыня val = resource.getDimensionPixelSize (R.dimen.photo_height) val width = resources.getDimensionPixelSize (R .dimen.photo_width) val запыт = ImageRequestBuilder.newBuilderWithSource (uri) .setResizeOptions (ResizeOptions (шырыня, вышыня)). build () imgvPhoto? .controller = кантролер}

Цяпер мы можам рабіць фотаздымкі і лёгка паказваць іх у нашым дадатку.

Зыходны код для ўзору праекта можна знайсці тут: https://github.com/bionicwan/capturephoto