
CameraX 使用的類 ProcessCameraProvider查看源碼
PreviewImageAnalysisImageCaptureVideoCapture這幾個類都繼承UseCase,
他們都屬于用例,如需使用他們需要bindToLifecycle()函數在生命周期里面進行綁定
一個單例,可用于將相機的生命周期綁定到應用程序進程中的任何生命周期所有者。一個進程中只能存在一個進程相機提供程序,并且可以使用getInstance(Context)檢索它。重量級資源,例如打開和正在運行的相機設備,將限定為提供給bindToLifecycle的生命周期(生命周期所有者、相機選擇器、用例…)。其他輕量級資源(如靜態(tài)相機特征)可以在使用getInstance(Contex)首次檢索此提供程序時檢索和緩存,并將在進程的生存期內持續(xù)存在。這是應用程序要使用的標準提供程序。
這是應用程序要使用的標準提供程序。
相機選擇器 cameraSelector用于選擇相機或返回一組篩選的相機。DEFAULT_BACK_CAMERA 選擇默認后置攝像頭的靜態(tài)。DEFAULT_FRONT_CAMERA 選擇默認前置攝像頭的靜態(tài)。LENS_FACING_BACK = 1 設備上的攝像頭,其方向與設備屏幕相反。LENS_FACING_FRONT = 0 設備上的攝像頭與設備屏幕朝向同一方向。
使用相機需要聲明權限
uses-feature參考:Android開發(fā)-API指南-
如需將圖片保存到文件中,除非所用設備搭載 Android 10 或更高版本,否則應用還需要 WRITE_EXTERNAL_STORAGE 權限。
// 請求相機權限
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.CAMERA),
0x1001)// 監(jiān)聽權限
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
grantResults: IntArray
) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 0x1001){if (permissions.contains(
Manifest.permission.CAMERA) && grantResults.get(0) == 0){startCamera()
}
}
} 添加依賴將以下內容添加到app目錄下的 build.gradle 文件中:
dependencies {// CameraX core library using the camera2 implementation
def camerax_version = "1.3.0-alpha02"
implementation("androidx.camera:camera-camera2:${camerax_version}")
// If you want to additionally use the CameraX Lifecycle library
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
// If you want to additionally use the CameraX VideoCapture library
implementation("androidx.camera:camera-video:${camerax_version}")
// If you want to additionally use the CameraX View class
implementation("androidx.camera:camera-view:${camerax_version}")
}布局編寫activity_main
生命周期CameraX 沒有在onResume()和onPause()中放置具體的啟動和停止方法調用,而是使用cameraProvider.bindToLifecycle()指定要與相機關聯的生命周期。之后,該生命周期會告知 CameraX 何時配置相機拍攝會話并確保相機狀態(tài)隨生命周期的轉換相應地變化。
private lateinit var cameraProviderFuture : ListenableFuturecameraProviderFuture = ProcessCameraProvider.getInstance(this) 檢查 CameraProvider 可用性請求CameraProvider后,請驗證它能否在視圖創(chuàng)建后成功初始化。以下代碼展示了如何執(zhí)行此操作:
cameraProviderFuture.addListener(Runnable {val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))預覽// 預覽
val preview = Preview.Builder().build()
// 使用以下代碼將用例綁定到Android生命周期
val camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
// PreviewView創(chuàng)建一個表面提供程序,并且是推薦的提供程序
camera = preview.setSurfaceProvider(previewView.getSurfaceProvider())bindToLifecycle()會返回一個Camera對象。
bindToLifecycle()函數
查看bindToLifecycle()函數源碼可以得知
public Camera bindToLifecycle(LifecycleOwner lifecycleOwner,
CameraSelector cameraSelector,
UseCase... useCases)lifecycleOwner:生命周期所有者,用于控制用例的生命周期轉換。cameraSelector:相機選擇器,用于確定用于一組用例的相機。useCases:要綁定到生命周期的用例。
Preview[ 預覽 ],Image analysis[ 圖片分析 ],Image capture[ 圖片拍攝 ],Video capture[ 視頻拍攝 ]
查看源碼可知他們父類都是
UseCase,因此要使用哪個用例需要綁定到生命周期
預覽完整代碼
private fun startCamera(){// 將相機的生命周期綁定到應用程序進程中 "getInstance"一個進程中只能存在一個進程相機提供程序,可以使用 進行檢索。
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
bindPreview(cameraProviderFuture)
}
// 用于將相機的生命周期綁定到生命周期所有者
private fun bindPreview(cameraProviderFuture: ListenableFuture){cameraProviderFuture.addListener(Runnable {val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// 創(chuàng)建預覽 Preview
val preview = Preview.Builder()
.build()
.also {it.setSurfaceProvider(previewView.surfaceProvider)
}
// 選擇后置攝像頭作為默認值
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {// 在重新綁定之前取消綁定用例Unbind use cases before rebinding
cameraProvider.unbindAll()
// 將用例綁定到相機 Bind use cases to camera
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview)
} catch(exc: Exception) {Log.e(TAG, "Use case binding failed", exc)
}
},
// 返回一個將在與此上下文關聯的主線程上運行排隊任務
ContextCompat.getMainExecutor(this)
)
} 參考資料:
CameraX 入門指南
CameraX 概覽
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
文章標題:AndroidCameraX學習記錄(一)kotlin-創(chuàng)新互聯
網站URL:http://www.chinadenli.net/article26/djdhjg.html
成都網站建設公司_創(chuàng)新互聯,為您提供Google、標簽優(yōu)化、網站制作、網站排名、微信公眾號、網站內鏈
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯