Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
CameraX使ってみた
Search
Takuji Nishibayashi
July 31, 2024
Technology
340
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
180
kotlinx.datetime 使ってみた
takuji31
0
1.2k
HiltのCustom Componentについて
takuji31
0
460
java.timeをAndroidで使う
takuji31
0
220
KSPを使ってコード生成
takuji31
0
510
Kotlin Symbol Processing API (KSP) を使って Kotlin ア プリケーションの開発を効率化する
takuji31
1
3.3k
kotlinx.serialization
takuji31
0
720
kanmoba-returns-02.pdf
takuji31
0
320
AndroidXとKotlin Coroutines
takuji31
0
460
Other Decks in Technology
See All in Technology
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
410
新米を「売り越さない」、Aurora DSQLで作る在庫ゼロ死守の限定ドロップEC
yama3133
0
160
AIエージェントの監視、思考を見るか行動を見るか / Monitoring AI Agents: Thoughts or Actions
yusukeshimizu
1
110
AIがGISを代替する日:〜すべてをAIが創る時代に、私たちがFOSS4Gに関わる意味〜
lehupa
1
210
試験勉強はGrokBotでやれ
maigo999
0
110
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
1
780
Devin プロモコードの受け取りと適用(2026.10.27)
kinopeee
1
850
AI Agent 時代のデータ基盤: ClickHouse で実現する 超高速分析とコスト削減の両立
jozono
0
130
リアクションエンジニア ― 小さなリアクションから、話しかけやすい組織をつくる ―
ryuguyana
1
120
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
210
AIコーディングはじめました
miso
0
150
SLOを阻む不安
sraku2159
0
220
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
590
The Pragmatic Product Professional
lauravandoore
37
7.5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
60k
The agentic SEO stack - context over prompts
schlessera
0
1k
The Language of Interfaces
destraynor
162
27k
My Coaching Mixtape
mlcsv
0
380
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
390
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
Building Applications with DynamoDB
mza
96
7.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
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