Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CameraX使ってみた
Search
Takuji Nishibayashi
July 31, 2024
Technology
310
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CameraX使ってみた
Takuji Nishibayashi
July 31, 2024
More Decks by Takuji Nishibayashi
See All by Takuji Nishibayashi
compose-hot-reload を試そうとした話
takuji31
0
160
kotlinx.datetime 使ってみた
takuji31
0
1.1k
HiltのCustom Componentについて
takuji31
0
380
java.timeをAndroidで使う
takuji31
0
200
KSPを使ってコード生成
takuji31
0
480
Kotlin Symbol Processing API (KSP) を使って Kotlin ア プリケーションの開発を効率化する
takuji31
1
3.2k
kotlinx.serialization
takuji31
0
700
kanmoba-returns-02.pdf
takuji31
0
290
AndroidXとKotlin Coroutines
takuji31
0
440
Other Decks in Technology
See All in Technology
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
170
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
810
Amazon EVS で VCF 9.0 / 9.1 のサポート開始まとめ
mtoyoda
0
250
依頼文化をやめる日 EM視点で語るPlatform EngineeringとInclusive SRE / Discussing Platform Engineering and Inclusive SRE from an EM's Perspective
shin1988
3
2.2k
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
390
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
270
AWS Summit Japan 2026の振り返りと2027へ向けて / AWS Summit Japan 2026 Recap and Prospects for 2027
kaminashi
1
200
背中から、背中へ /paying forward to community
naitosatoshi
0
220
SRE Lounge Hiroshimaへの招待
grimoh
0
230
Why is RC4 still being used?
tamaiyutaro
0
290
知見・人・API・DB・予算 ─ ナイナイ尽くしだった人事データ整備 with dbt、5年間の学び
ken6377
1
150
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.1k
Ruling the World: When Life Gets Gamed
codingconduct
0
270
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
240
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
670
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
410
Accessibility Awareness
sabderemane
1
150
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
380
Transcript
CameraX を使ってみた 関西モバイルアプリ研究会 A #4 @takuji31
自己紹介 西林 拓志 (にしばやし たくじ ) Twitter/GitHub takuji31 Sansan 株式会社
技術本部 Mobile Application グループ Eight Android テックリード Android (2009〜 ) Kotlin (2014〜 ) 1
スマートフォンのカメラ使ってますか? 2
今年で世界初のカメラ付き携帯電話が発売されて 25(!)年 3
スマートフォンにも当たり前のようにカメラがついてます ね 4
アプリ開発者ならスマートフォンのカメラで遊びたいはず 5
CameraX 6
Jetpack の一つでカメラを扱うライブラリー 7
幅広いデバイスをサポート 8
拡張機能(ボケ、 HDR、夜間モード等)に対応 9
API 21 から使える 10
セットアップ 11
libs.versions.toml [versions] camerax = "1.4.0-beta02" [libraries] androidx-camera-camera2 = { module
= "androidx.camera:camera-camera2", version.ref = "camerax" } androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "camerax" } androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" } androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" } 12
build.gradle.kts dependencies { implementation(libs.androidx.camera.camera2) implementation(libs.androidx.camera.lifecycle) implementation(libs.androidx.camera.view) implementation(libs.androidx.camera.extensions) } 13
使い方 14
使い方 val controller = LifecycleCameraController(this) controller.bindToLifecycle(this) controller.cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA setContent
{ AndroidView( factory = { context -> PreviewView(context).apply { layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) setController(controller) } }, onRelease = { controller.unbind() } ) } 15
16
カメラ切り替え 17
カメラ切り替え val cameraSelector = if (controller.cameraSelector == CameraSelector.DEFAULT_BACK_CAMERA) { CameraSelector.DEFAULT_FRONT_CAMERA
} else { CameraSelector.DEFAULT_BACK_CAMERA } controller.cameraSelector = cameraSelector 18
撮影 19
撮影 val values = ContentValues().apply { put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") } val
imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values) controller.takePicture( ImageCapture .OutputFileOptions .Builder( contentResolver.openOutputStream(imageUri!!)!! ).build(), ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback { override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) { Toast.makeText(this, "Image captured", Toast.LENGTH_SHORT).show() } override fun onError(exception: ImageCaptureException) { Toast.makeText(this, "Image capture failed", Toast.LENGTH_SHORT).show() } }) 20
拡張機能 21
ボケ、 HDR、夜間モード等デフォルト以外の機能 22
拡張機能 val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA val mainExecutor = ContextCompat.getMainExecutor(this) val
cameraProviderFuture = ProcessCameraProvider.getInstance(this) val imageCapture = ImageCapture.Builder().build() val preview = CameraXPreview.Builder().build() 23
拡張機能 cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() val extensionsManagerFuture = ExtensionsManager.getInstanceAsync(this@MainActivity,
cameraProvider) //... }, mainExecutor) 24
拡張機能 extensionsManagerFuture.addListener({ val extensionsManager = extensionsManagerFuture.get() if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.NIGHT)) {
val newSelector = extensionsManager.getExtensionEnabledCameraSelector( cameraSelector, ExtensionMode.NIGHT ) preview.surfaceProvider = findViewById<PreviewView>(R.id.previewView).surfaceProvider cameraProvider.bindToLifecycle(this, newSelector, imageCapture, preview) } }, mainExecutor) 25
Pixel 8 Pro で試してみた 26
BOKEH 27
HDR 28
NIGHT 29
他にも MLKit と統合して QR コードスキャナーを作った りできるっぽい 30
https://github.com/android/camera-samples 31
Thank you 32