$30 off During Our Annual Pro Sale. View Details »

Camera Xライブラリの魅力と最新機能を紐解く

Dai
October 05, 2022

Camera Xライブラリの魅力と最新機能を紐解く

DroidKaigi2022で発表したスライドです

Dai

October 05, 2022
Tweet

Other Decks in Programming

Transcript

  1. $BNFSB9ϥΠϒϥϦͷ 
 ັྗͱ࠷৽ػೳΛඥղ͘ Dai Miyamoto (@dairoid7774) 1

  2. ࣗݾ঺հ • ٶຊେ • 5XJUUFS!EBJSPJE • (JUIVC%BJ • גࣜձࣾϚωʔϑΥϫʔυ •

    "OESPJEΤϯδχΞ • ϚωʔϑΥϫʔυϏδωεΧϯύχʔݸਓࣄۀओຊ෦ϓϩμΫτ։ൃ෦ • ΤϯδχΞϦϯάઓུࣨεϚʔτσόΠεΤΩεύʔτάϧʔϓ ݉຿ 2
  3. "HFOEB 3 ຊηογϣϯͷΰʔϧ $BNFSB9ͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷղઆ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  4. "HFOEB 4 ຊηογϣϯͷΰʔϧ $BNFSB9ͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷղઆ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  5. ຊηογϣϯͷΰʔϧ • $BNFSB9ϥΠϒϥϦͷ֓ཁʹ͍ͭͯཧղͰ͖Δ • جຊతͳΧϝϥػೳͷ࣮૷ํ๏΍ࡉ͔͍UJQTͳͲΛ஌Δ͜ͱ͕Ͱ͖Δ • WɺWͰ௥Ճ͞Εͨ৽ػೳ౳ʹ͍ͭͯ஌Δ͜ͱ͕Ͱ͖Δ 5 $BNFSB9ϥΠϒϥϦͷັྗΛ఻͑ɺ 


    ΧϝϥػೳΛੜ͔ͨ͠৽ͨͳΞΠσΞΛੜΈग़͖͔͚ͬ͢Λ࡞Δ
  6. "HFOEB 6 ຊηογϣϯͷΰʔϧ $BNFSB9ϥΠϒϥϦͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷղઆ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  7. Χϝϥػೳͷ࣮૷ʹ࢖ΘΕ͖ͯͨ"1*ɾϥΠϒϥϦ 7 Android 4.4Ҏલ Android 5.0Ҏ߱ 2014೥ 2019೥ Camera API

    2 
 ϦϦʔε Camera Xൃද v1.0.0 Stable 
 ϦϦʔε 2021೥ 2022೥6݄ v1.1.0 Stable 
 ϦϦʔε 2022೥8݄ v1.2.0 Beta 
 ϦϦʔε Camera API 1 Intentܦ༝
  8. Χϝϥػೳͷ࣮૷ʹ࢖ΘΕ͖ͯͨ"1*ɾϥΠϒϥϦ 8 Android 4.4Ҏલ Android 5.0Ҏ߱ 2014೥ 2019೥ Camera API

    2 
 ϦϦʔε Camera Xൃද v1.0.0 Stable 
 ϦϦʔε 2021೥ 2022೥6݄ v1.1.0 Stable 
 ϦϦʔε 2022೥8݄ v1.2.0 Beta 
 ϦϦʔε Camera API 1 Intentܦ༝
  9. Χϝϥػೳͷ࣮૷ʹ࢖ΘΕ͖ͯͨ"1*ɾϥΠϒϥϦ 9 Android 4.4Ҏલ Android 5.0Ҏ߱ 2014೥ 2019೥ Camera API

    2 
 ϦϦʔε Camera Xൃද v1.0.0 Stable 
 ϦϦʔε 2021೥ 2022೥6݄ v1.1.0 Stable 
 ϦϦʔε 2022೥8݄ v1.2.0 Beta 
 ϦϦʔε Camera API 1 Intentܦ༝ Deprecated !
  10. Χϝϥػೳͷ࣮૷ʹ࢖ΘΕ͖ͯͨ"1*ɾϥΠϒϥϦ 10 Android 4.4Ҏલ Android 5.0Ҏ߱ 2014೥ 2019೥ Camera API

    2 
 ϦϦʔε Camera Xൃද v1.0.0 Stable 
 ϦϦʔε 2021೥ 2022೥6݄ v1.1.0 Stable 
 ϦϦʔε 2022೥8݄ v1.2.0 Beta 
 ϦϦʔε Camera API 1 Intentܦ༝
  11. Χϝϥػೳͷ࣮૷ʹ࢖ΘΕ͖ͯͨ"1*ɾϥΠϒϥϦ 11 Android 4.4Ҏલ Android 5.0Ҏ߱ 2014೥ 2019೥ Camera API

    2 
 ϦϦʔε Camera Xൃද v1.0.0 Stable 
 ϦϦʔε 2021೥ 2022೥6݄ v1.1.0 Stable 
 ϦϦʔε 2022೥8݄ v1.2.0 Beta 
 ϦϦʔε Camera API 1 Intentܦ༝
  12. $BNFSB9ͱ͸ʁ • ΧϝϥΞϓϦΛ༰қʹ࣮૷Ͱ͖Δ+FUQBDLϥΠϒϥϦ • "OESPJE "1*-FWFM Ҏ߱Λαϙʔτ • $BNFSB"1*Λར༻͢ΔΑΓ΋গͳ͍ίʔυྔͰ࣮૷͕Մೳ •

    ଟ͘ͷσόΠεͰ҆ఆͨ͠ಈ࡞Λอূ͢ΔΑ͏ʹ࠷దԽ͕ଓ͚ΒΕ͍ͯΔ 12
  13. "HFOEB 13 ຊηογϣϯͷΰʔϧ $BNFSB9ͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷղઆ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  14. $BNFSB9ͷ6TF$BTF w 1SFWJFX ΧϝϥϓϨϏϡʔ  w *NBHF$BQUVSF ࣸਅࡱӨ  w

    *NBHF"OBMZTJT ը૾ղੳ 14 v1.0.0
  15. $BNFSB9ͷ6TF$BTF w 1SFWJFX ΧϝϥϓϨϏϡʔ  w 1SFWJFX7JFXΛ࢖ͬͯΧϝϥͷө૾Λදࣔ w *NBHF$BQUVSF ࣸਅࡱӨ

     w *NBHF"OBMZTJT ը૾ղੳ 15 v1.0.0
  16. <androidx.camera.view.PreviewView android:id=“@+id/preview_view” android:layout_width=“match_parent" android:layout_height=“match_parent" …/> 16

  17. private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(context) cameraProviderFuture.addListener({ val

    cameraProvider = cameraProviderFuture.get() … }, ContextCompat.getMainExecutor(context)) } 17 $BNFSB1SPWJEFSΛऔಘ͢Δ
  18. val preview = Preview.Builder() .setTargetAspectRatio(…) / .setTargetResolution(…) .setTargetRotation(…) .build() .also

    { it.setSurfaceProvider( binding.previewView.surfaceProvider ) } 18 1SFWJFX6TF$BTFΛ࢖ͬͯετϦʔϛϯάઃఆΛߦ͏
  19. try { cameraProvider.unbindAll() cameraProvider.bindToLifecycle( this as LifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, preview )

    } 19 -JGFDZDMFʹ1SFWJFX6TF$BTFΛCJOE͢Δ
  20. 20

  21. $BNFSB9ͷ6TF$BTF w 1SFWJFX ΧϝϥϓϨϏϡʔ  w *NBHF$BQUVSF ࣸਅࡱӨ  w

    ࡱӨͯ͠ࢦఆͨ͠৔ॴʹอଘ w *NBHF"OBMZTJT ը૾ղੳ 21 v1.0.0
  22. imageCapture = ImageCapture.Builder().build() try { cameraProvider.unbindAll() cameraProvider.bindToLifecycle( this as LifecycleOwner,

    CameraSelector.DEFAULT_BACK_CAMERA, preview, imageCapture ) } 22 -JGFDZDMFʹ*NBHF$BQUVSF6TF$BTFΛCJOE
  23. private fun takePicture() { val photoFile = File(…) val outputFileOptions

    = ImageCapture.OutputFileOptions.Builder(photoFile) .build() } 23 ࣸਅͷอଘઌͷઃఆ w 'JMF w .FEJB4UPSF w 0VUQVU4USFBN
  24. imageCapture.takePicture( outputFileOptions, ContextCompat.getMainExecutor(context), object : ImageCapture.OnImageSavedCallback { override fun onImageSaved(

    outputFileResults: ImageCapture.OutputFileResults) { outputFileResults.savedUri … } override fun onError(exception: ImageCaptureException) { … } } ) 24 ࣸਅͷࡱӨॲཧ ࢦఆͨ͠อଘઌʹอଘ͢Δ৔߹
  25. imageCapture.takePicture( ContextCompat.getMainExecutor(context), object : ImageCapture.OnImageCapturedCallback() { override fun onCaptureSuccess(image: ImageProxy)

    { … } override fun onError(exception: ImageCaptureException) { … } } ) 25 ࣸਅͷࡱӨॲཧ ը૾όοϑΝΛऔಘ
  26. $BNFSB9Ͱ࣮ݱͰ͖Δิॿػೳ • ζʔϜ 
 DBNFSB$POUSPMTFU-JOFBS;PPN GMPBU TFU;PPN3BUJP GMPBU  •

    τʔν ϑϥογϡ 
 DBNFSB$POUSPMFOBCMF5PSDI CPPMFBO  • λοϓϑΥʔΧε 
 DBNFSB$POUSPMTUBSU'PDVT"OE.FUFSJOH 'PDVT.FUFSJOH"DUJPO  • ࿐ग़ิਖ਼ 
 DBNFSB$POUSPMTFU&YQPTVSF$PNQFOTBUJPO*OEFY JOU 26
  27. $BNFSB9ͷ6TF$BTF w 1SFWJFX ΧϝϥϓϨϏϡʔ  w *NBHF$BQUVSF ࣸਅࡱӨ  w

    *NBHF"OBMZTJT ը૾ղੳ  w Χϝϥͷ͔ΒऔಘͰ͖Δը૾όοϑΝΛ࢖ͬͯɺ 
 ը૾ॲཧ΍ػցֶशͷ࣮ߦ͕Ͱ͖Δ 27 v1.0.0
  28. imageAnalysis = ImageAnalysis.Builder() .build() .also { it.setAnalyzer( Executors.newSingleThreadExecutor(), ImageAnalysis.Analyzer {

    image: ImageProxy -> // ը૾ॲཧͳͲ image.close() } ) } 28 *NBHF"OBMZTJT6TF$BTFͰը૾෼ੳΛߦ͏
  29. ΧϝϥͰऔಘͨ͠ը૾ͷ׆༻ྫ w ը૾ॲཧ w #JUNBQʹม׵ͯ͠Ճ޻ w 0QFO$7 w ػցֶश w

    5FOTPS'MPX-JUF w 'JSFCBTF.BDIJOF-FBSOJOH w .-,JU 29 https://github.com/android/camera-samples/blob/develop/ CameraXTfLite/screenshots/screenshot-1.jpg
  30. /FYU4UFQʜ w ʮ$BNFSB9º.-,JUͰύεϙʔτ0$3ػೳΛ࣮૷ʯ w %BZʙ w ൃදऀ:VUP"LBJLF͞Μ 30

  31. "HFOEB 31 ຊηογϣϯͷΰʔϧ $BNFSB9ͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷ঺հ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  32. WͰશͯͷόʔδϣϯ͕౷Ұ͞Εͨ 32 ϦϦʔε೔ camera-core camera- camera2 camera- lifecycle camera-video camera-view

    camera- extensions 2022/01/26 v1.1.0-beta01 2021/12/15 v1.1.0-alpha12 v1.0.0-alpha32 2021/10/13 v1.1.0-alpha10 v1.0.0-alpha30 2021/05/05 v1.0.0-stable v1.0.0-alpha24
  33. $BNFSB9ͷ6TF$BTF w 1SFWJFX ΧϝϥϓϨϏϡʔ  w *NBHF$BQUVSF ࣸਅࡱӨ  w

    *NBHF"OBMZTJT ը૾ղੳ  w 7JEFP$BQUVSF ಈըࡱӨ 33 v1.1.0
  34. val recorder = Recorder.Builder().build() videoCapture = VideoCapture.withOutput(recorder) try { cameraProvider.unbindAll()

    val camera = cameraProvider.bindToLifecycle( this as LifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, preview, videoCapture ) } 34 3FDPSEFSͱ7JEFP$BQUVSFΛ࡞੒ͯ͠-JGFDZDMFʹCJOE
  35. 35 3FDPSEFSͷಈըղ૾౓ͷઃఆ w 4% Q ɺ)% Q ɺ')% Q ɺ6)%

    Q  Recorder.Builder() .setQualitySelector(QualitySelector.from(Quality.UHD)) w ΧϝϥσόΠεʹΑͬͯରԠ͍ͯ͠Δղ૾౓͕ҟͳΔ 2VBMJUZ4FMFDUPSHFU4VQQPSUFE2VBMJUJFT DBNFSBDBNFSB*OGP  w ղ૾౓Λࢦఆ͠ͳ͍৔߹ɺ')%͔ΒॱʹରԠ͍ͯ͠Δղ૾౓Λ୳͠ઃఆ͞ΕΔ
  36. 36 ಈըͷอଘઌͷઃఆ private fun startRecording() { val movieFile = File(…)

    val outputFileOptions = androidx.camera.video.FileOutputOptions .Builder(movieFile) .build() } w 'JMF w .FEJB4UPSF w 1BSDFM'JMF%FTDSJQUPS "OESPJEҎ্
  37. 37 ࿥ըͷ։࢝ recording = videoCapture.output .prepareRecording(context, outputFileOptions) //࿥Ի͢Δ৔߹͸android.permission.RECORD_AUDIO͕ඞཁ .withAudioEnabled() .start(

    ContextCompat.getMainExecutor(context), captureListener ) recording.pause() recording.resume() recording.stop() / recording.close()
  38. 38 ࿥ըঢ়ଶͷϋϯυϦϯά private val captureListener = Consumer<VideoRecordEvent> { event ->

    when (event) { is VideoRecordEvent.Start -> {} is VideoRecordEvent.Pause -> {} is VideoRecordEvent.Resume -> {} is VideoRecordEvent.Finalize -> { event.outputResults.outputUri event.error } } }
  39. 39

  40. 6TF$BTFͷ૊Έ߹Θͤ 40 LEVEL Ͱ͖Δ͜ͱ LEGACY ԼҐޓ׵Ϟʔυ Preview + Image Capture

    + Image Analysisɺ 
 Preview + Video Captureͷซ༻Λαϙʔτ LIMITED Preview + Video Capture + Image Captureͷซ༻Λαϙʔτ FULL Camera 2Ͱɺ 
 ߴ଎࿈ࣸػೳɺϚχϡΞϧηϯαʔίϯτϩʔϧͳͲ͕αϙʔτ͞ΕΔ LEVEL_3 Preview + Video Capture + Image Analysisͷซ༻Λαϙʔτ EXTERNAL USB઀ଓ͞Εͨ֎෦ΧϝϥΛද͢
  41. ΧϝϥσόΠεͷϨϕϧͷௐ΂ํ $BNFSBؔ࿈ͷΧϝϥ৘ใΛऔಘ͢Δ$BNFSB$BNFSB*OGPΛհͯ͠ 
 */'0@4611035&%@)"3%8"3&@-&7&-Λऔಘ͢Δ 41 val camera = provider.bindToLifecycle(this, cameraSelector)

    val level = Camera2CameraInfo.from(camera.cameraInfo) .getCameraCharacteristic( CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL ) val isHardwareLevelLimited = level == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
  42. $BNFSBFYUFOTJPOT͕TUBCMFϦϦʔε w ϕϯμʔ͕ಠࣗʹ౥ࡌ͍ͯ͠Δ֦ுػೳΛ૊ΈࠐΊΔ w "VUPपғͷ෩ܠʹ߹Θͤͯࣗಈతʹ࢓্͕ΓΛௐ੔ w ϘέϙʔτϨʔτػೳ w إࣸਅՃ޻إͷഽͷ৭ɺܗঢ়ͳͲΛՃ޻ w

    )%3ࣗಈ࿐ग़ઃఆΛࡱӨ w ໷ؒϞʔυ҉͍৔ॴͰͷࣸਅࡱӨΛ࠷దԽ 42 v1.1.0
  43. &YUFOTJPOTͷαϙʔτঢ়گͷ֬ೝ w &YUFOTJPO.BOBHFSJT&YUFOTJPO"WBJMBCMFͰಛఆͷϞʔυ͕ར༻Մೳ͔֬ೝ w $BNFSB9Ͱ͸αϙʔτ͞Ε͍ͯͳ͍͕ɺ$BNFSBͰ͸αϙʔτ͞Ε͍ͯΔ 
 ৔߹΋͋Δ w 04ͷγεςϜΞοϓσʔτͰରԠ͞ΕΔ͜ͱ΋͋Δ 43

  44. DBNFSBWJFX͕TUBCMFϦϦʔε w -JGFDZDMF$BNFSB$POUSPMMFS w ͜ΕͭͰ$BNFSB9ͷओཁͳػೳΛ΄΅શͯఏڙ͢ΔߴϨϕϧ"1* w BMQIB·Ͱ͸$BNFSB7JFXͱ͍͏໊લͩͬͨ 44 v1.1.0

  45. -JGFDZDMF$BNFSB$POUSPMMFSͰΑΓ؆୯ʹ࣮૷ 45 val cameraController = LifecycleCameraController(context) binding.previewView.controller = cameraController //

    σϑΥϧτͰ͸ImageCaputreͱImageAnalysisɺ
 // ϐϯνΠϯɾΞ΢τͷζʔϜػೳͱλοϓ&ϑΥʔΧε͕ࣗಈͰ༗ޮʹͳΔ cameraController.bindToLifecycle(this as LifecycleOwner) cameraController .setEnabledUseCases(CameraController.VIDEO_CAPTURE) cameraController.takePicture(…) cameraController.enableTorch(true)
  46. 1SPDFTT$BNFSB1SPWJEFSWT-JGFDZDMF$BNFSB$POUSPMMFS w -JGFDZDMF$BNFSB$POUSPMMFSΛ࢖͏৔߹͸6TF$BTFΛࣗ෼Ͱ࡞੒͢Δඞཁ͕ 
 ͳ͘ͳΔଞɺτʔνͳͲิॿػೳ΋શͯઃఆͰ͖Δ w 7JEFP$BQUVSF͸&YQFSJNFOUBMͰɺ࿥ըͷҰ࣌ఀࢭɾ࠶։ػೳ͕ແ͍ w 6TF$BTFͷ#VJMEFSͰ͔͠࢖͑ͳ͍ઃఆ౳͕ͳ͚Ε͹ɺ 


    -JGFDZDMF$BNFSB$POUSPMMFSΛ࢖ͬͨ΄͏͕࣮૷ָ͕ͳ͜ͱ͕ଟ͍͔΋ 46
  47. $BNFSB4UBUFͰΧϝϥͷঢ়ଶΛߪಡ͢Δ w $BNFSB*OGPDBNFSB4UBUF͔ΒɺΧϝϥͷঢ়ଶΛߪಡ͢Δ͜ͱ͕Ͱ͖Δ w 6*ͷग़͠෼͚΍Ϣʔβʔ΁ͷϑΟʔυόοΫʹ׆༻ 47 cameraInfo.cameraState.observe(this as LifecycleOwner) {

    when (it.type) {} when (it.error?.type) {} } v1.1.0
  48. Χϝϥͷঢ়ଶભҠ $BNFSB4UBUF5ZQF 48 Closed OPENING OPEN CLOSING PENDING_OPEN Bind UseCase

    Χϝϥͷىಈ੒ޭ Unbind UseCase Χϝϥऴྃ੒ޭ ΧϝϥىಈͷϦΫΤετ଴ͪ
  49. ΧϝϥͷΤϥʔঢ়ଶ $BNFSB4UBUF&SSPS5ZQF w 3&$07&3"#-& w $BNFSB9͕ΧϝϥσόΠεͷ࠶ىಈΛࢼΈΔ w ෮چͷࢼߦճ਺্ݶʹୡͨ͠৔߹ɺ1&/%*/(@01&/ঢ়ଶʹҠߦ͢Δ w ΞϓϦ಺Ͱ։͍͍ͯΔଞͷΧϝϥΛऴྃ͢Δ͔ɺ

    
 ଞͷΧϝϥΞϓϦΛऴྃ͢ΔΑ͏ʹϢʔβʔ΁ཁٻ͢Δͱྑ͍ w $3*5*$"- w $BNFSB9͕෮چෆՄೳͳΤϥʔ w $-04*/(ঢ়ଶʹҠߦ͢Δ 49
  50. Wͷ৽ػೳ w $BNFSBNMLJUWJTJPOϥΠϒϥϦ͕௥Ճ w .M,JU"OBMZ[FS͕௥Ճ͞Εɺ.-,JUͱͷ࿈ܞ͕؆୯ʹ౷߹Ͱ͖ΔΑ͏ʹͳͬͨ w ;FSP4IVUUFS-BH"1*͕$BNFSB9Ͱ࢖͑ΔΑ͏ʹͳͬͨ w $"1563&@.0%&@;&30@4)655&3@-"(Λઃఆ͢Δͱɺ 


    γϟολʔϘλϯΛԡ͔ͯ͠ΒࡱӨ͞ΕΔ·Ͱͷϥά͕ܰݮͰ͖Δ w อଘͨ͠ಈըͷ.FUB%BUBʹҐஔ৘ใΛ෇༩Ͱ͖ΔΑ͏ʹͳͬͨ w 0VUQVU0QUJPOTʹTFU-PDBUJPO͕௥Ճ 50 v1.2.0-beta
  51. "HFOEB 51 ຊηογϣϯͷΰʔϧ $BNFSB9ͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷ঺հ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  52. $BNFSB9ͩͱ௿ղ૾౓ͰࡱӨ͞Εͯ͠·͏ʂʁ Ұ෦ͷػछͰ$BNFSB9ͰࡱӨͨ͠ը૾ͷղ૾౓͕ɺϓϦΠϯετʔϧ͞Εͯ 
 ͍ΔΧϝϥΞϓϦ΍$BNFSBͰࡱӨͨ͠ը૾ΑΓ΋௿͘ͳͬͯ͠·ͬͨ 52 Camera XͰࡱӨͨ͠ը૾ ϓϦΠϯετʔϧͷΧϝϥΞϓϦͰࡱӨͨ͠ը૾

  53. ΧϝϥσόΠε͕αϙʔτ͍ͯ͠Δղ૾౓ͷऔಘ w ΧϝϥσόΠεͷϋʔυ΢ΣΞϨϕϧ΍ɺࢦఆͨ͠ΞεϖΫτൺɺ 
 ղ૾౓ʹΑͬͯɺ$BNFSB9͕αϙʔτ͢Δ࠷దͳղ૾౓Λࣗಈతʹܾఆ͢Δ w 4USFBN$POGJHVSBUJPO.BQHFU0VUQVU4J[FT ͰσόΠε͕αϙʔτ͢Δ 
 ղ૾౓ͷϦετΛऔಘͰ͖Δ

    53 val camera2Info = Camera2CameraInfo.from(cameraInfo) val config = camera2Info.getCameraCharacteristic( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP ) val supportResolutionSizes = config?.getOutputSizes(ImageFormat.JPEG)
  54. HFU0VUQVU4J[FT Y Y Y Y Y Y Y 54 HFU)JHI3FTPMVUJPO0VUQVU4J[FT

    Y Y Y Y Y
  55. HFU0VUQVU4J[FT WTHFU)JHI3FTPMVUJPO0VUQVU4J[FT w HFU)JHI3FTPMVUJPO0VUQVU4J[FT ͰಘΒΕΔղ૾౓͸ɺࡱӨॲཧͷࡍʹ 
 ͕͔͔࣌ؒΔ৔߹͕͋ΔͨΊɺHFU0VUQVU4J[FTͰऔಘͰ͖Δղ૾౓ͷΈ 
 αϙʔτ͍ͯ͠Δ w

    ͦΕΑΓ΋ߴ͍ղ૾౓Λࢦఆͯ͠΋ɺHFU0VUQVU4J[FT ͷղ૾౓͕ࣗಈతʹ 
 ઃఆ͞ΕΔ 55
  56. WͰٹࡁ͞Εͦ͏ʜ w IUUQTJTTVFUSBDLFSHPPHMFDPNJTTVFT w ৽͍͠"1*Λ։ൃதͱͷ͜ͱ w 5BSHFUFE5PBMQIB w $BNFSBʹஔ͖׵͑ͯରԠ͢Δ͜ͱʹͨ͠ 56

  57. "HFOEB 57 ຊηογϣϯͷΰʔϧ $BNFSB9ͷ֓ཁઆ໌ جຊతͳΧϝϥػೳͷ࣮૷ͷ঺հ WɺWͰ௥Ճ͞Εͨओͳ৽ػೳ౳ͷ঺հ W࣌఺Ͱ௚໘ͨ͠՝୊ʹ͍ͭͯ঺հ ·ͱΊ

  58. ·ͱΊ $BNFSB9ʹ͍ͭͯ w ѹ౗తʹগͳ͍ίʔυྔͰҰൠతͳΧϝϥػೳ͕࣮ݱՄೳ w ػցֶशͳͲΛ૊ΈࠐΜͰɺը૾ղੳΛߦ͏ͱԠ༻ͷ෯͕޿͕Δ w W͔Β͸ಈըࡱӨͷDBNFSBWJEFPͳͲ͕ͭTUBCMFʹͳͬͨ w DBNFSBWJFXͷ-JGFDZDMF$BNFSB$POUSPMMFSΛ࢖ͬͨ΄͏ָ͕͔΋

    w ΧϝϥσόΠεʹΑͬͯ࢖͑Δػೳ͕ݶΒΕΔ͜ͱ͕͋Δ 58
  59. ·ͱΊ Χϝϥػೳ࣮૷ʹ͓͚Δٕज़બఆ w ҰൠతͳΧϝϥػೳΛ࣮૷͢ΔͳΒɺ$BNFSB9ϥΠϒϥϦ͕͓͢͢Ί w ΑΓਂ͍ΧϝϥػೳΛ࣮ݱ͍ͨ͠৔߹͸ɺ$BNFSB"1*Λݕ౼ w ·ͩ$BNFSB"1*Λར༻͍ͯ͠Δ৔߹͸ҠߦΛݕ౼͠·͠ΐ͏ w *OUFOUͰΧϝϥΞϓϦΛىಈ͢Δͷ΋खஈͷҰ͕ͭͩɺΧελϚΠζੑ͸ແ͍

    59
  60. 3FGFSFODF w IUUQTEFWFMPQFSBOESPJEDPNKFUQBDLBOESPJEYSFMFBTFTDBNFSB w "OESPJE%FWFMPQFSTc$BNFSB93FMFBTF/PUF w IUUQTEFWFMPQFSBOESPJEDPNUSBJOJOHDBNFSBY w "OESPJE%FWFMPQFSTc$BNFSB9ͷ֓ཁ w

    IUUQTHJUIVCDPNBOESPJEDBNFSBTBNQMFT w $BNFSBɺ$BNFSB9Λ࢖ͬͨαϯϓϧίʔυू 60
  61. એ఻ 61 https://hrmos.co/pages/moneyforward/jobs/0004337

  62. 5IBOLZPV 
 GPSMJTUFOJOH Dai Miyamoto (@dairoid7774) 62