{"id":1638,"date":"2023-03-25T21:38:40","date_gmt":"2023-03-25T13:38:40","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1638"},"modified":"2023-04-23T22:00:25","modified_gmt":"2023-04-23T14:00:25","slug":"android-jetpack-architecture-components-getting-started-with-camerax","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/25\/android-jetpack-architecture-components-getting-started-with-camerax\/","title":{"rendered":"Android Jetpack\u67b6\u6784\u7ec4\u4ef6\uff08\u4e09\uff09CameraX\u4f7f\u7528\u5165\u95e8"},"content":{"rendered":"<p>Android\u4e2d\u4f7f\u7528\u76f8\u673a\u4ece\u6765\u5c31\u4e0d\u662f\u4e00\u4ef6\u5bb9\u6613\u7684\u4e8b\u3002Camera1\u8981\u81ea\u5df1\u7ba1\u7406Camera\u76f8\u673a\u5b9e\u4f8b\uff0c\u8981\u5904\u7406<code>SufraceView<\/code>\u76f8\u5173\u7684\u4e00\u5806\u4e1c\u897f\uff0c\u8fd8\u6709\u9884\u89c8\u5c3a\u5bf8\u8ddf\u753b\u9762\u5c3a\u5bf8\u7684\u9009\u62e9\uff0c\u9875\u9762\u751f\u547d\u5468\u671f\u5207\u6362\u7b49\u7b49\u95ee\u9898<\/p>\n<p>\u540e\u6765\u63a8\u51fa\u4e86<code>Camera2<\/code>\uff0c\u4ece<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/googlearchive\/android-Camera2Basic\" title=\"\u5b98\u65b9Demo\">\u5b98\u65b9Demo<\/a> \u5c31\u4e0a\u5343\u884c\u4ee3\u7801\u6765\u770b\uff0cCamera2\u5e76\u4e0d\u89e3\u51b3\u7528\u8d77\u6765\u590d\u6742\u7684\u95ee\u9898\uff0c\u5b83\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u8c03\u7528\u63a5\u53e3\uff0c\u53ef\u5b9a\u5236\u6027\u66f4\u597d\uff0c\u7ed3\u679c\u5c31\u662f\u5bf9\u666e\u901a\u5f00\u53d1\u8005\u6765\u8bf4\u66f4\u52a0\u96be\u7528<\/p>\n<p><!-- more --><\/p>\n<p>\u7ec8\u4e8eGoogle\u4e5f\u610f\u8bc6\u5230\u8fd9\u4e2a\u95ee\u9898\uff0c\u63a8\u51fa\u4e86\u6700\u7ec8\u7248<code>CameraX<\/code>\u3002<code>CameraX<\/code>\u5b9e\u9645\u4e0a\u8fd8\u662f\u7528\u7684<code>Camera2<\/code>\uff0c\u4f46\u5b83\u5bf9\u8c03\u7528API\u8fdb\u884c\u4e86\u5f88\u597d\u7684\u5c01\u88c5\uff0c\u4f7f\u7528\u8d77\u6765\u975e\u5e38\u65b9\u4fbf\u3002\u5b98\u65b9\u6559\u7a0b\u4e5f\u5f88\u8be6\u7ec6\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/codelabs.developers.google.com\/codelabs\/camerax-getting-started\/#0\">https:\/\/codelabs.developers.google.com\/codelabs\/camerax-getting-started\/#0<\/a><\/p>\n<p>\u53c2\u8003\uff1a<br \/>\n<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/developer.android.google.cn\/training\/camerax\">https:\/\/developer.android.google.cn\/training\/camerax<\/a><br \/>\n<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/codelabs.developers.google.com\/codelabs\/camerax-getting-started\/#0\">https:\/\/codelabs.developers.google.com\/codelabs\/camerax-getting-started\/#0<\/a><\/p>\n<blockquote>\n<p>\u6ce8\u610f\uff1a<code>CameraX<\/code>\u8ddf<code>Camera2<\/code>\u4e00\u6837\u6700\u4f4e\u652f\u6301API 21\uff0c\u4e5f\u5c31\u662f5.0\u53ca\u4ee5\u4e0a<\/p>\n<\/blockquote>\n<h2>\u5bfc\u5165\u4f9d\u8d56<\/h2>\n<p>\u5728app\u7684<code>build.gradle<\/code>\u4e2d\u52a0\u5165<\/p>\n<pre><code class=\"language-java\">dependencies {\n    implementation &#039;androidx.appcompat:appcompat:1.1.0&#039;\n    implementation &#039;androidx.constraintlayout:constraintlayout:1.1.3&#039;\n\n    \/\/ Use the most recent version of CameraX, currently that is alpha04\n    def camerax_core_version = &quot;1.0.0-beta03&quot;\n    def camerax_version = &quot;1.0.0-alpha10&quot;\n    implementation &quot;androidx.camera:camera-core:${camerax_core_version}&quot;\n    implementation &quot;androidx.camera:camera-camera2:${camerax_core_version}&quot;\n    \/\/ If you want to use the CameraX View class\n    implementation &quot;androidx.camera:camera-view:${camerax_version}&quot;\n    \/\/ If you want to use the CameraX Extensions library\n    implementation &quot;androidx.camera:camera-extensions:${camerax_version}&quot;\n    \/\/ If you want to use the CameraX Lifecycle library\n    implementation &quot;androidx.camera:camera-lifecycle:${camerax_version}&quot;\n}<\/code><\/pre>\n<p>CameraX\u9700\u8981\u4e00\u4e9bJava 8\u7684\u65b9\u6cd5\uff0capp\u7684<code>build.gradle<\/code>\u7684buildTypes\u4e4b\u540e\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<pre><code class=\"language-java\">compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n}<\/code><\/pre>\n<h2>\u5e03\u5c40\u6587\u4ef6\u548c\u6743\u9650<\/h2>\n<p>\u653e\u4e00\u4e2a<code>PreviewView<\/code>\u5373\u53ef<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    &gt;\n\n    &lt;androidx.camera.view.PreviewView\n        android:id=&quot;@+id\/preview_view&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;match_parent&quot;\n        app:layout_constraintTop_toTopOf=&quot;parent&quot;\n        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;\n        app:layout_constraintStart_toStartOf=&quot;parent&quot;\n        app:layout_constraintEnd_toEndOf=&quot;parent&quot;\n        \/&gt;\n\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/code><\/pre>\n<p>\u6743\u5728<code>AndroidManifest.xml<\/code>\u4e2d\u52a0\u5165\u76f8\u673a\u6743\u9650<\/p>\n<pre><code class=\"language-xml\">&lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; \/&gt;<\/code><\/pre>\n<p>\u5e76\u52a0\u5165\u52a8\u6001\u7533\u8bf7\u6743\u9650\u4ee3\u7801\uff0c\u6b64\u5904\u7701\u7565<\/p>\n<h2>\u542f\u52a8\u76f8\u673a<\/h2>\n<pre><code class=\"language-java\">private void startCamera() {\n    executor = ContextCompat.getMainExecutor(this);\n    cameraProviderFuture = ProcessCameraProvider.getInstance(this);\n    cameraProviderFuture.addListener(() -&gt; {\n        try {\n            ProcessCameraProvider cameraProvider = cameraProviderFuture.get();\n            bindPreview(cameraProvider);\n        } catch (ExecutionException | InterruptedException e) {\n            \/\/ No errors need to be handled for this Future.\n            \/\/ This should never be reached.\n            e.printStackTrace();\n        }\n    }, executor);\n}\n\nprivate void bindPreview(ProcessCameraProvider cameraProvider) {\n    Preview preview = new Preview.Builder()\n            .setTargetAspectRatio(AspectRatio.RATIO_16_9)\n            .setTargetRotation(mBinding.previewView.getDisplay().getRotation())\n            .build();\n\n    \/\/preview.setSurfaceProvider(mBinding.previewView.getPreviewSurfaceProvider());\n\n    \/\/ \u76f8\u673a\u9009\u62e9\u5668\n    CameraSelector cameraSelector = new CameraSelector.Builder()\n            .requireLensFacing(CameraSelector.LENS_FACING_BACK)\n            .build();\n\n    \/\/ \u6784\u5efa\u56fe\u50cf\u6355\u83b7\u7528\u4f8b\n    ImageCapture imageCapture = new ImageCapture.Builder()\n            .setFlashMode(ImageCapture.FLASH_MODE_AUTO)\n            .setTargetAspectRatio(AspectRatio.RATIO_4_3)\n            .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)\n            .build();\n\n    \/\/ \u56fe\u50cf\u5206\u6790\n    ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()\n            \/\/ \u5206\u8fa8\u7387\n            .setTargetResolution(new Size(1280, 720))\n            \/\/ \u975e\u963b\u585e\u6a21\u5f0f\n            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)\n            .build();\n\n\/\/    Camera camera = cameraProvider.bindToLifecycle(this,\n\/\/            cameraSelector, imageCapture, imageAnalysis, preview);\n    Camera camera = cameraProvider.bindToLifecycle(this,\n            CameraSelector.DEFAULT_BACK_CAMERA, preview);\n\n    CameraInfo cameraInfo = camera.getCameraInfo();\n\n    preview.setSurfaceProvider(mBinding.previewView.createSurfaceProvider(cameraInfo));\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Android\u4e2d\u4f7f\u7528\u76f8\u673a\u4ece\u6765\u5c31\u4e0d\u662f\u4e00\u4ef6\u5bb9\u6613\u7684\u4e8b\u3002Camera1\u8981\u81ea\u5df1\u7ba1\u7406Camera\u76f8\u673a\u5b9e\u4f8b\uff0c\u8981\u5904\u7406Sufra [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[311],"tags":[411,410],"class_list":["post-1638","post","type-post","status-publish","format-standard","hentry","category-android-advance","tag-camerax","tag-jetpack"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1638"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1638\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}