在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Jetpack Compose中解鎖CameraX的強大功能

谷歌開發者 ? 來源:Android 開發者 ? 2025-02-25 11:50 ? 次閱讀

作者 / Google 開發者關系工程師 Jolanda Verhoef

本文是 "相機與媒體 Spotlight Week" 系列的內容之一。此系列中,我們會提供文章、視頻、示例代碼等資源,以幫助您提升應用中的媒體體驗。

我們了解到您喜歡 CameraX 和 Jetpack Compose 庫提供的強大功能,但希望使用更符合語言習慣的 Compose API 來構建相機界面。今年,我們的工程團隊開發了兩個新的 Compose 工件,即低層級 viewfinder-compose 和高層級 camera-compose。兩者現在均已推出 alpha 版本 。

在本系列文章中,我們不僅將為您介紹如何將 camera-compose API 集成到應用中,還將向您展示與 Compose 集成所帶來的一些令人愉悅的界面體驗。所有令人贊嘆的 Compose 功能 (例如自適應 API 和動畫支持) 均已與相機預覽無縫集成。

完成所有這些操作后,我們的最終應用將如下所示:

此外,應用可以順暢地在桌面模式之間切換:

到本文 (該系列第一篇文章) 的末尾,您將構建一個功能齊全的相機取景器,并將在后續系列文章中對其進行擴展。歡迎您跟隨我們一起編寫代碼,在實踐中更好地學習。

添加庫依賴項

假設您已經在應用中設置了 Compose。如果您想繼續,只需在 Android Studio 中新建一個應用即可。我們通常使用最新的 Canary 版本,因為這個版本會提供最新的 Compose 模板。
向您的 libs.versions.toml 中添加以下內容:

[versions]
..
camerax = "1.5.0-alpha03"
accompanist = "0.36.0" # or whatever matches with your Compose version


[libraries]
..
# Contains the basic camera functionality such as SurfaceRequest
androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }
# Contains the CameraXViewfinder composable
androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }
# Allows us to bind the camera preview to our UI lifecycle
androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }
# The specific camera implementation that renders the preview
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }
# The helper library to grant the camera permission
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
然后,將這些添加到您的模塊 build.gradle.kts 依賴項塊中:
dependencies {
  ..
  implementation(libs.androidx.camera.core)
  implementation(libs.androidx.camera.compose)
  implementation(libs.androidx.camera.lifecycle)
  implementation(libs.androidx.camera.camera2)
  implementation(libs.accompanist.permissions)
}
?
為了授予相機權限,我們添加了所有依賴項,然后實際顯示相機預覽。接下來,讓我們看看如何授予正確的權限。

授予相機權限

通過使用 Accompanist 權限庫,我們可以輕松地授予正確的相機權限。首先,我們需要設置 AndroidManifest.xml:


    
    


    ..


Accompanist 權限庫

https://google.github.io/accompanist/permissions/

現在,我們只需按照庫的說明授予正確的權限:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            MyApplicationTheme {
                CameraPreviewScreen()
            }
        }
    }
}


@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun CameraPreviewScreen(modifier: Modifier = Modifier) {
    val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
    if (cameraPermissionState.status.isGranted) {
        CameraPreviewContent(modifier)
    } else {
        Column(
            modifier = modifier.fillMaxSize().wrapContentSize().widthIn(max = 480.dp),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            val textToShow = if (cameraPermissionState.status.shouldShowRationale) {
                // If the user has denied the permission but the rationale can be shown,
                // then gently explain why the app requires this permission
                "Whoops! Looks like we need your camera to work our magic!" +
                    "Don't worry, we just wanna see your pretty face (and maybe some cats).  " +
                    "Grant us permission and let's get this party started!"
            } else {
                // If it's the first time the user lands on this feature, or the user
                // doesn't want to be asked again for this permission, explain that the
                // permission is required
                "Hi there! We need your camera to work our magic! 
" +
                    "Grant us permission and let's get this party started! uD83CuDF89"
            }
            Text(textToShow, textAlign = TextAlign.Center)
            Spacer(Modifier.height(16.dp))
            Button(onClick = { cameraPermissionState.launchPermissionRequest() }) {
                Text("Unleash the Camera!")
            }
        }
    }
}


@Composable
private fun CameraPreviewContent(modifier: Modifier = Modifier) {
    // TODO: Implement
}
這樣,我們就得到了一個良好的界面,用戶可以在顯示相機預覽之前授予相機權限:

創建 ViewModel

將業務邏輯與界面分開是一種很好的實踐。為此,我們可以為屏幕創建視圖模型來實現這一點。這個視圖模型設置了 CameraX Preview 用例。請注意,CameraX 中的用例代表了可以使用該庫實現的各種工作流程的配置,即預覽、捕獲、錄制和分析。視圖模型還將界面綁定到相機提供程序:

class CameraPreviewViewModel : ViewModel() {
    // Used to set up a link between the Camera and your UI.
    private val _surfaceRequest = MutableStateFlow(null)
    val surfaceRequest: StateFlow = _surfaceRequest


    private val cameraPreviewUseCase = Preview.Builder().build().apply {
        setSurfaceProvider { newSurfaceRequest ->
            _surfaceRequest.update { newSurfaceRequest }
        }
    }


    suspend fun bindToCamera(appContext: Context, lifecycleOwner: LifecycleOwner) {
        val processCameraProvider = ProcessCameraProvider.awaitInstance(appContext)
        processCameraProvider.bindToLifecycle(
            lifecycleOwner, DEFAULT_FRONT_CAMERA, cameraPreviewUseCase
        )


        // Cancellation signals we're done with the camera
        try { awaitCancellation() } finally { processCameraProvider.unbindAll() }
    }
}

此處會執行大量操作。代碼定義了一個 CameraPreviewViewModel 類,負責管理相機預覽。此類使用 CameraX Preview 構建器來配置預覽與界面的綁定方式。bindToCamera 函數用于初始化相機,并將其綁定到指定的 LifecycleOwner,以確保相機至少在生命周期處于 "啟動" 狀態時運行,并啟動預覽流。
相機作為相機庫的內部組件,需要渲染到界面提供的 surface。因此,庫需要有一種方法來請求 surface。這正是 SurfaceRequest 的用途。因此,每當相機表示需要 surface 時,就會觸發 surfaceRequest。然后將該請求轉發給界面,以便將 surface 傳遞給請求對象。

最后,我們需要等待界面與相機完成綁定,并確保釋放相機資源以避免資源泄漏。

實現相機預覽界面

現在我們有了一個視圖模型,可以實現 CameraPreviewContent 可組合項。該項從視圖模型中讀取 surface 請求,在可組合項位于組合樹中時綁定到相機,并從庫中調用 CameraXViewfinder。

@Composable
fun CameraPreviewContent(
    viewModel: CameraPreviewViewModel,
    modifier: Modifier = Modifier,
    lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
) {
    val surfaceRequest by viewModel.surfaceRequest.collectAsStateWithLifecycle()
    val context = LocalContext.current
    LaunchedEffect(lifecycleOwner) { 
        viewModel.bindToCamera(context.applicationContext, lifecycleOwner) 
    }


    surfaceRequest?.let { request ->
        CameraXViewfinder(
            surfaceRequest = request,
            modifier = modifier
        )
    }
}


如上部分所述,surfaceRequest 允許相機庫在需要渲染時請求一個 surface。在這段代碼中,我們收集這些 surfaceRequest 實例,并將它們轉發給屬于 camera-compose 組件的 CameraXViewfinder。

結果

就這樣,我們構建了一個功能齊全的全屏取景器。了解完整代碼片段,請訪問相關文檔:


https://gist.github.com/JolandaVerhoef/74d4696b804736c698450bd34b5c9ff8

本文中的代碼段包含以下許可證:

// Copyright 2024 Google LLC. SPDX-License-Identifier: Apache-2.0

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Google
    +關注

    關注

    5

    文章

    1778

    瀏覽量

    58430
  • 相機
    +關注

    關注

    4

    文章

    1410

    瀏覽量

    54337
  • API
    API
    +關注

    關注

    2

    文章

    1545

    瀏覽量

    63195

原文標題:在 Jetpack Compose 中解鎖 CameraX 的強大功能

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    compose的使用技巧是什么?

    compose的使用技巧是什么?
    發表于 11-15 07:27

    深入了解CameraX 1.1版本的視頻拍攝功能

      CameraX 是一個 Jetpack 支持庫,旨在幫助您簡化相機應用的開發工作。它提供一致且易用的 API 接口,適用于大多數 Android 設備,并可向后兼容至 Android 5.0 (API 級別 21)。我們將在本文中介紹
    的頭像 發表于 01-25 12:01 ?3444次閱讀

    詳解Jetpack Compose 1.1版本的新功能

    我們一如既往地搭建產品路線圖,現在已經發布了 Jetpack Compose 的 1.1 版本,這是 Android 的現代原生界面工具包。此版本新增了一些功能,比如經過優化的焦點處理、觸摸目標值
    的頭像 發表于 03-11 10:14 ?1546次閱讀

    Jetpack Compose基礎知識科普

    Jetpack Compose 是用于構建原生 Android 界面的新工具包。它可簡化并加快 Android 上的界面開發,使用更少的代碼、強大的工具和直觀的 Kotlin API,快速讓應用生動
    的頭像 發表于 04-02 13:38 ?3162次閱讀

    Compose社區的反響

    我們很高興地看到這些團隊大規模和復雜的生產環境仔細地評估并使用了 Compose,所帶來的結果也不僅是讓界面開發更清晰有趣,也帶來了更多工程上的收益。這只是其中幾個案例,因為 Play 商店排名前 1,000 的應用中有超過
    的頭像 發表于 05-18 10:15 ?1160次閱讀

    Jetpack Compose 更新一覽 | 2022 Android 開發者峰會

    作者 /?Android 開發者關系工程師 Jolanda Verhoef 去年我們發布了 Jetpack Compose ,此后一直進行優化。我們已添加了新的功能并創造出
    的頭像 發表于 11-23 17:55 ?1345次閱讀

    Google計劃用Jetpack Compose來重建Android系統的設置應用

    上周,Google 發布了 Android 14 的首個開發者預覽版,除了那些最新的功能以外,Google 似乎還正在默默醞釀一個新的計劃 —— 用更現代的 Jetpack Compose 來逐步
    的頭像 發表于 02-18 11:16 ?1788次閱讀

    Compose for Wear OS 1.1 推出穩定版: 了解新功能

    為 Wear OS 構建出色的響應式應用。 ? Compose for Wear OS?1.1 版本 https://developer.android.google.cn/jetpack
    的頭像 發表于 02-22 01:30 ?1111次閱讀

    Kotlin聲明式UI框架Compose Multiplatform支持iOS

    JetBrains ?KotlinConf’23 大會上宣布,Compose Multiplatform 已支持 iOS,目前處于 alpha 階段。至此,Compose
    的頭像 發表于 04-24 09:12 ?1464次閱讀
    Kotlin聲明式UI框架<b class='flag-5'>Compose</b> Multiplatform支持iOS

    I/O 看未來 | Jetpack功能一覽

    應用構建特色功能。Google Play 上的大多數應用都使用 Jetpack 進行開發,事實上, 排行榜前 1,000 的應用,超過 90% 的應用都使用了
    的頭像 發表于 06-01 01:20 ?488次閱讀
    <b class='flag-5'>在</b> I/O 看未來 | <b class='flag-5'>Jetpack</b> 新<b class='flag-5'>功能</b>一覽

    Jetpack WindowManager 1.1 穩定版

    變化。許多新款設備都已進入市場,大量新用例也已解鎖Jetpack WindowManager 庫在幫助您優化您的 Android 應用上發揮重要作用,使其能夠適用于不同的設備類型。并且此版本還包含多項
    的頭像 發表于 10-18 19:10 ?548次閱讀
    <b class='flag-5'>Jetpack</b> WindowManager 1.1 穩定版

    Jetpack Compose和設備類型的三大重要更新

    2024 年 Google I/O 大會上我們分享了大量更新和公告,幫助開發者提升工作效率。了解 2024 年 Google I/O 大會上有關 Jetpack Compose 和設備類型的三大重要更新。
    的頭像 發表于 08-09 17:07 ?835次閱讀

    NVIDIA JetPack 6.0版本的關鍵功能

    NVIDIA JetPack SDK 支持 NVIDIA Jetson 模塊,為構建端到端加速 AI 應用提供全面的解決方案。JetPack 6 通過微服務和一系列新功能,擴展了 Jetson 平臺的靈活性和可擴展性,是 202
    的頭像 發表于 09-09 10:18 ?748次閱讀
    NVIDIA <b class='flag-5'>JetPack</b> 6.0版本的關鍵<b class='flag-5'>功能</b>

    解析NVIDIA JetPack 6.1的新功能

    NVIDIA JetPack一直不斷發展,通過提供量身定制的先進軟件滿足邊緣 AI 和機器人開發者日益增長的需求。每次發布的 JetPack 新版本都會升級性能、加入新功能與優化現有
    的頭像 發表于 11-28 10:41 ?685次閱讀
    解析NVIDIA <b class='flag-5'>JetPack</b> 6.1的新<b class='flag-5'>功能</b>

    詳解Jetpack Compose布局流程

    我們與 Android 經典視圖系統的生命周期 (Measure,Layout,Drawing) 做一個對比: 組合是 Compose 的特有階段,是其能夠通過函數調用實現聲明式 UI 的核心,想要深入理解 Compose 第一課就是理解這個過程。
    的頭像 發表于 02-05 13:38 ?402次閱讀
    詳解<b class='flag-5'>Jetpack</b> <b class='flag-5'>Compose</b>布局流程
    主站蜘蛛池模板: 欧美福利网 | 欧美激情αv一区二区三区 欧美激情第一欧美在线 | 教官的好爽好深h片段 | 片黄免费 | 午夜免费福利在线 | 欧美人与性另类 | 黄色三级在线观看 | 欧美一级特黄aaaaaaa在线观看 | 国产片在线观看狂喷潮bt天堂 | 久青草视频在线播放 | 亚洲成在人线久久综合 | 国产真实灌醉美女疯狂弄 | 日本乱妇 | 日本一本在线视频 | 久久久久久亚洲精品 | 成人伊人青草久久综合网 | 国产高清在线观看 | 黄色在线视频免费看 | 四虎影视网址 | 久久精品看片 | 视频在线观看网站 | 伊人小婷婷色香综合缴缴情 | 综合色视频 | 久久狠色噜噜狠狠狠狠97 | 国产乱人视频在线看 | 4399一级成人毛片 | 性久久久久 | 日本一级成人毛片免费观看 | 美女网站色在线观看 | 一级视频在线免费观看 | ww欧洲ww在线视频看 | 一级a毛片免费 | 天天影视欧美综合在线观看 | 又粗又大又猛又爽免费视频 | 午夜国产福利 | 手机看片免费福利 | 亚洲综合色网 | 五月婷婷激情综合 | 欧美成人一区二区三区在线电影 | 欧美天天搞| 一级毛片真人免费播放视频 |