{"id":1413,"date":"2021-07-22T15:37:38","date_gmt":"2021-07-22T07:37:38","guid":{"rendered":"https:\/\/badgameshow.com\/fly\/?p=1413"},"modified":"2021-07-23T10:56:56","modified_gmt":"2021-07-23T02:56:56","slug":"android-qr-code%e6%8e%83%e6%8f%8f%e5%99%a8-%e5%90%84%e7%a8%ae%e6%a2%9d%e7%a2%bc%e9%83%bd%e8%83%bd%e6%8e%83","status":"publish","type":"post","link":"https:\/\/badgameshow.com\/fly\/android-qr-code%e6%8e%83%e6%8f%8f%e5%99%a8-%e5%90%84%e7%a8%ae%e6%a2%9d%e7%a2%bc%e9%83%bd%e8%83%bd%e6%8e%83\/","title":{"rendered":"Android QR Code \u6383\u63cf \u5404\u7a2e\u689d\u78bc\u90fd\u80fd\u6383"},"content":{"rendered":"<h1>Android QR Code \u6383\u63cf \u5404\u7a2e\u689d\u78bc\u90fd\u80fd\u6383<\/h1>\n<h5>\u900f\u904eGoogle Vision\u5957\u4ef6\u5feb\u901f\u88fd\u4f5c\u5c6c\u65bc\u81ea\u5df1\u7684QR Code \u6383\u63cf\uff0c\u9032\u884cQR Code \u6383\u63cf\u5404\u7a2e\u689d\u78bc\u90fd\u80fd\u6383\uff0cAndroid QR Code\u5229\u7528\u76f8\u6a5f\u529f\u80fd\u30fb\u900f\u904eMobile Vision API \u89e3\u6790QR Code\uff0c\u5404\u7a2e\u689d\u78bc\u90fd\u80fd\u6383\u3002<\/h5>\n<hr \/>\n<h4>\u6587\u7ae0\u76ee\u9304<\/h4>\n<ol>\n<li><a href=\"#a\">\u5c0e\u5165Google Vision<\/a><\/li>\n<li><a href=\"#b\">\u8072\u660e\u76f8\u6a5f\u6b0a\u9650<\/a><\/li>\n<li><a href=\"#c\">\u5e03\u5c40&#038;\u65b9\u6cd5\u4ecb\u7d39<\/a><\/li>\n<li><a href=\"#d\">\u7a0b\u5f0f\u78bc\u7bc4\u4f8b<\/a><\/li>\n<li><a href=\"#e\">\u6548\u679c\u5c55\u793a<\/a><\/li>\n<li><a href=\"#f\">Github<\/a><\/li>\n<\/ol>\n<hr \/>\n<p><a id=\"a\"><\/a><\/p>\n<h4>1.\u5c0e\u5165Google Vision<\/h4>\n<pre><code class=\"language-Gradle line-numbers\">dependencies {\n     implementation 'com.google.android.gms:play-services-vision:20.1.3'\n}\n<\/code><\/pre>\n<p><a id=\"b\"><\/a><\/p>\n<h4>2.\u8072\u660e\u76f8\u6a5f\u6b0a\u9650<\/h4>\n<pre><code class=\"language-XML line-numbers\">&lt;uses-permission android:name=\"android.permission.CAMERA\"\/&gt;\n<\/code><\/pre>\n<p><a id=\"c\"><\/a><\/p>\n<h4>3.\u5e03\u5c40&amp;\u65b9\u6cd5\u4ecb\u7d39<\/h4>\n<h5>\u5e03\u5c40<\/h5>\n<pre><code class=\"language-XML line-numbers\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\"&gt;\n\n    &lt;SurfaceView\n        android:id=\"@+id\/scanner\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id\/guideline2\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\n\n    &lt;TextView\n        android:id=\"@+id\/result\"\n        android:textSize=\"30sp\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textColor=\"@color\/black\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/scanner\" \/&gt;\n\n    &lt;androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id\/guideline2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintGuide_percent=\"0.5\" \/&gt;\n\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;\n<\/code><\/pre>\n<h5>\u65b9\u6cd5\u4ecb\u7d39<\/h5>\n<h6>\u5075\u6e2cBarcode\u6a23\u5f0f<\/h6>\n<pre><code class=\"language-Kotlin line-numbers\">BarcodeDetector.Builder(this@MainActivity)\n        .setBarcodeFormats(Barcode.ALL_FORMATS)\n        .build()\n<\/code><\/pre>\n<h6>\u5275\u5efaCamera<\/h6>\n<pre><code class=\"language-Kotlin line-numbers\">\/\/\u50b3\u5165Barcode\u6a23\u5f0f\nCameraSource.Builder(this@MainActivity, barcodeDetector)\n        \/\/\u81ea\u52d5\u5c0d\u7126\n        .setAutoFocusEnabled(true)\n        \/\/\u9810\u89bd\u5bec\u9ad8\n        .setRequestedPreviewSize(measuredWidth, measuredHeight)\n        .build()\n<\/code><\/pre>\n<h6>\u7d81\u5b9aCamer<\/h6>\n<pre><code class=\"language-Kotlin line-numbers\">holder.addCallback(object : SurfaceHolder.Callback {\n    override fun surfaceCreated(holder: SurfaceHolder) {\n        cameraSource.start(holder)\n    }\n\n    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {\n\n    }\n\n    override fun surfaceDestroyed(holder: SurfaceHolder) {\n        cameraSource.stop()\n    }\n})\n<\/code><\/pre>\n<h6>\u6383\u63cf\u5b8c\u6210\u8cc7\u6599\u56de\u50b3<\/h6>\n<pre><code class=\"language-Kotlin line-numbers\">barcodeDetector.setProcessor(object : Detector.Processor&lt;Barcode&gt; {\n    override fun release() {\n\n    }\n\n    override fun receiveDetections(detections: Detector.Detections&lt;Barcode&gt;) {\n        result = findViewById(R.id.result)\n        \/\/\u7372\u53d6\u8cc7\u6599\n        val barcode = detections.detectedItems\n        if (barcode.size() &gt; 0) {\n            runOnUiThread {\n                result.text = barcode.valueAt(0).displayValue\n            }\n        }\n    }\n})\n<\/code><\/pre>\n<p><a id=\"d\"><\/a><\/p>\n<h4>4.\u7a0b\u5f0f\u78bc\u7bc4\u4f8b<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">import android.Manifest\nimport android.annotation.SuppressLint\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.SurfaceHolder\nimport android.view.SurfaceView\nimport android.view.ViewTreeObserver.OnGlobalLayoutListener\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.ActivityCompat\nimport com.google.android.gms.vision.CameraSource\nimport com.google.android.gms.vision.Detector\nimport com.google.android.gms.vision.barcode.Barcode\nimport com.google.android.gms.vision.barcode.BarcodeDetector\n\nprivate const val REQUEST_CAMERA: Int = 40\n\n@SuppressLint(\"MissingPermission\")\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var scanner: SurfaceView\n    private lateinit var result: TextView\n    private lateinit var cameraSource: CameraSource\n    private lateinit var barcodeDetector: BarcodeDetector\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        \/\/\u79fb\u9664ActionBar\n        supportActionBar?.hide()\n\n        \/\/\u5148\u7372\u53d6\u76f8\u6a5f\u6b0a\u9650\n        if (ActivityCompat.checkSelfPermission(\n                this,\n                Manifest.permission.CAMERA\n            ) != PackageManager.PERMISSION_GRANTED\n        ) {\n            ActivityCompat.requestPermissions(\n                this,\n                arrayOf(Manifest.permission.CAMERA),\n                REQUEST_CAMERA\n            )\n        } else {\n            \/\/\u521d\u59cb\u5316\u6383\u63cf\u5668\n            initScanner()\n            \/\/\u5075\u6e2c\u5f8c\u56de\u50b3\n            resultCallback()\n        }\n    }\n\n    private fun resultCallback() {\n        barcodeDetector.setProcessor(object : Detector.Processor&lt;Barcode&gt; {\n            override fun release() {\n\n            }\n\n            override fun receiveDetections(detections: Detector.Detections&lt;Barcode&gt;) {\n                result = findViewById(R.id.result)\n                \/\/\u6216\u53d6\u8cc7\u6599\n                val barcode = detections.detectedItems\n                if (barcode.size() &gt; 0) {\n                    runOnUiThread {\n                        result.text = barcode.valueAt(0).displayValue\n                    }\n                }\n            }\n        })\n    }\n\n    private fun initScanner() {\n        scanner = findViewById(R.id.scanner)\n        scanner.apply {\n            \/\/\u5275\u5efaBarcode\u5075\u6e2c\n            barcodeDetector = BarcodeDetector.Builder(this@MainActivity)\n                .setBarcodeFormats(Barcode.ALL_FORMATS)\n                .build()\n\n            \/\/\u7372\u53d6\u5bec\u9ad8\u5f8c\u5275\u5efaCamera\n            viewTreeObserver.addOnGlobalLayoutListener(object : OnGlobalLayoutListener {\n                override fun onGlobalLayout() {\n                    viewTreeObserver.removeOnGlobalLayoutListener(this)\n                    cameraSource = CameraSource.Builder(this@MainActivity, barcodeDetector)\n                        .setAutoFocusEnabled(true)\n                        .setRequestedPreviewSize(measuredWidth, measuredHeight)\n                        .build()\n                }\n            })\n\n            \/\/camera\u7d81\u5b9asurfaceView\n            holder.addCallback(object : SurfaceHolder.Callback {\n                override fun surfaceCreated(holder: SurfaceHolder) {\n                    cameraSource.start(holder)\n                }\n\n                override fun surfaceChanged(\n                    holder: SurfaceHolder,\n                    format: Int,\n                    width: Int,\n                    height: Int\n                ) {\n\n                }\n\n                override fun surfaceDestroyed(holder: SurfaceHolder) {\n                    cameraSource.stop()\n                }\n            })\n        }\n    }\n\n    override fun onRequestPermissionsResult(\n        requestCode: Int,\n        permissions: Array&lt;out String&gt;,\n        grantResults: IntArray\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (REQUEST_CAMERA == requestCode &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            setContentView(R.layout.activity_main)\n            \/\/\u521d\u59cb\u5316\u6383\u63cf\u5668\n            initScanner()\n            \/\/\u5075\u6e2c\u5f8c\u56de\u50b3\n            resultCallback()\n        }\n    }\n}\n<\/code><\/pre>\n<p><a id=\"e\"><\/a><\/p>\n<h4>5.\u6548\u679c\u5c55\u793a<\/h4>\n<p><a href=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2021\/07\/1626937439782.gif\"><img decoding=\"async\" src=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2021\/07\/1626937439782.gif\" width=\"50%\"\/><\/a><\/p>\n<p><a id=\"f\"><\/a><\/p>\n<h4>6.Github<\/h4>\n<p><a href=\"https:\/\/github.com\/MuHongWeiWei\/QRCodeScannerDemo\" target=\"_blank\" rel=\"noopener\">Github<\/a><\/p>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Android QR Code \u6383\u63cf \u5404\u7a2e\u689d\u78bc\u90fd\u80fd\u6383 \u900f\u904eGoogle Vision\u5957\u4ef6\u5feb\u901f\u88fd\u4f5c\u5c6c\u65bc\u81ea\u5df1\u7684QR &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[5],"tags":[13,15,194],"class_list":["post-1413","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-kotlin","tag-qr-code"],"_links":{"self":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/comments?post=1413"}],"version-history":[{"count":3,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1413\/revisions"}],"predecessor-version":[{"id":1435,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1413\/revisions\/1435"}],"wp:attachment":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/media?parent=1413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/categories?post=1413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/tags?post=1413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}