{"id":8395,"date":"2019-07-27T00:03:38","date_gmt":"2019-07-26T15:03:38","guid":{"rendered":"https:\/\/www.gesource.jp\/weblog\/?p=8395"},"modified":"2019-07-27T00:03:38","modified_gmt":"2019-07-26T15:03:38","slug":"android%e3%81%a7zxing%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6qr%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e8%aa%ad%e3%81%bf%e5%8f%96%e3%82%8b","status":"publish","type":"post","link":"https:\/\/www.gesource.jp\/weblog\/?p=8395","title":{"rendered":"Android\u3067ZXing\u3092\u4f7f\u3063\u3066QR\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308b"},"content":{"rendered":"<p><a href=\"https:\/\/github.com\/journeyapps\/zxing-android-embedded\" title=\"ZXing Android Embedded\">ZXing Android Embedded<\/a>\u3092\u4f7f\u3063\u3066\u3001QR\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308b\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3002<\/p>\n<h2>\u8aad\u307f\u53d6\u3063\u305fQR\u30b3\u30fc\u30c9\u3092\u65b9\u6cd5<\/h2>\n<h3>\u8a2d\u5b9a<\/h3>\n<p>build.gradle\u306b\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<pre><code>repositories {\n    jcenter()\n}\n\ndependencies {\n    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'\n    implementation 'com.android.support:appcompat-v7:25.3.1'   \/\/ Minimum 23+ is required\n}\n\nandroid {\n    buildToolsVersion '27.0.3' \/\/ Older versions may give compile errors\n}\n<\/code><\/pre>\n<p>AndroidManifest.xml\u3092\u7de8\u96c6\u3057\u3001\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u6709\u52b9\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre><code>&lt;application android:hardwareAccelerated=\"true\" ... &gt;\n<\/code><\/pre>\n<h3>QR\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308b\u753b\u9762\u3092\u958b\u304f<\/h3>\n<p>activity_main.xml\u306bButton\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br \/>\n\u30dc\u30bf\u30f3\u3092\u62bc\u3057\u305f\u3089scanBarcode()\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<pre><code>&lt;Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"@string\/scan_barcode\"\n    android:onClick=\"scanBarcode\"\/&gt;\n<\/code><\/pre>\n<p>\u30dc\u30bf\u30f3\u304c\u62bc\u3055\u308c\u305f\u3068\u304d\u3001QR\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308bActivity\u3092\u547c\u3073\u51fa\u3057\u307e\u3059\u3002<\/p>\n<pre><code>public void scanBarcode(View view) {\n    new IntentIntegrator(this).initiateScan();\n}\n<\/code><\/pre>\n<p>\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001QR\u30b3\u30fc\u30c9\u8aad\u307f\u8fbc\u307f\u753b\u9762\u306e\u7d30\u304b\u3044\u8a2d\u5b9a\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code>public void scanBarcode(View view) {\n    new IntentIntegrator(this)\n            \/\/ \u8aad\u307f\u53d6\u3063\u305f\u3068\u304d\u306b\u30d3\u30fc\u30d7\u97f3\u3092\u9cf4\u3089\u3055\u306a\u3044\n            .setBeepEnabled(false)\n            \/\/ \u753b\u9762\u306e\u5411\u304d\u3092\u56fa\u5b9a\u3057\u306a\u3044\n            .setOrientationLocked(true)\n            \/\/ \u8aad\u307f\u53d6\u308b\u30d0\u30fc\u30b3\u30fc\u30c9\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3092\u6307\u5b9a\u3059\u308b\n            .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)\n            \/\/ \u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u8a2d\u5b9a\u3059\u308b\n            .setCaptureActivity(CustomScannerActivity.class)\n            .initiateScan();\n}\n<\/code><\/pre>\n<h3>\u8aad\u307f\u53d6\u3063\u305fQR\u30b3\u30fc\u30c9\u3092\u53d7\u3051\u53d6\u308b<\/h3>\n<p>\u8aad\u307f\u53d6\u3063\u305f\u30b3\u30fc\u30c9\u3092\u53d7\u3051\u53d6\u308a\u307e\u3059\u3002<\/p>\n<pre><code>\/\/ Get the results:\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);\n    if(result != null) {\n        if(result.getContents() == null) {\n            Toast.makeText(this, \"Cancelled\", Toast.LENGTH_LONG).show();\n        } else {\n            Toast.makeText(this, \"Scanned: \" + result.getContents(), Toast.LENGTH_LONG).show();\n        }\n    } else {\n        super.onActivityResult(requestCode, resultCode, data);\n    }\n}\n<\/code><\/pre>\n<h2>QR\u30b3\u30fc\u30c9\u8aad\u307f\u8fbc\u307f\u753b\u9762\u3092\u81ea\u4f5c\u3059\u308b<\/h2>\n<p>QR\u30b3\u30fc\u30c9\u8aad\u307f\u8fbc\u307f\u753b\u9762\u3092\u81ea\u4f5c\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<h3>\u753b\u9762\u30c7\u30b6\u30a4\u30f3<\/h3>\n<p>\u30d7\u30ec\u30d3\u30e5\u30fc\u3092\u8868\u793a\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8com.journeyapps.barcodescanner.DecoratedBarcodeView\u3092\u914d\u7f6e\u3057\u307e\u3059\u3002<\/p>\n<p>\u4f8b)activity_main.xml<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n        xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n        xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".MainActivity\"&gt;\n\n    &lt;com.journeyapps.barcodescanner.DecoratedBarcodeView\n            android:id=\"@+id\/barcodeView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:zxing_scanner_layout=\"@layout\/custom_barcode_scanner\"\n    \/&gt;\n\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;\n<\/code><\/pre>\n<p>DecoratedBarcodeView\u5185\u90e8\u306e\u30c7\u30b6\u30a4\u30f3\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u5834\u5408\u306fapp:zxing_scanner_layout\u306b\u30ec\u30a4\u30a2\u30a6\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>\u4f8b)custom_barcode_scanner.xml<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;merge xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;\n\n    &lt;com.journeyapps.barcodescanner.BarcodeView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:id=\"@+id\/zxing_barcode_surface\"\/&gt;\n\n    &lt;com.journeyapps.barcodescanner.ViewfinderView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:id=\"@+id\/zxing_viewfinder_view\"\/&gt;\n\n    &lt;TextView android:id=\"@+id\/zxing_status_view\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|center_horizontal\"\n            android:background=\"@color\/zxing_transparent\"\n            android:text=\"\u3053\u306e\u30c6\u30ad\u30b9\u30c8\u306fbarcodeView.setStatusText()\u3067\u8a2d\u5b9a\u3067\u304d\u307e\u3059\"\n            android:textColor=\"@color\/zxing_status_text\"\/&gt;\n&lt;\/merge&gt;\n<\/code><\/pre>\n<h3>\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/h3>\n<p>DecoratedBarcodeView\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>\u8aad\u307f\u8fbc\u3080\u30b3\u30fc\u30c9\u306e\u5f62\u5f0f\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<pre><code>val formats = listOf(BarcodeFormat.QR_CODE)\nbarcodeView.barcodeView.decoderFactory = DefaultDecoderFactory(formats)\n<\/code><\/pre>\n<p>\u305d\u306e\u4ed6\u306e\u8a2d\u5b9a\u306fbarcodeView.cameraSettings\u3067\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code>    barcodeView.barcodeView.cameraSettings = CameraSettings()\n<\/code><\/pre>\n<p>\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u8fbc\u3093\u3060\u3068\u304d\u306b\u5b9f\u884c\u3059\u308b\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<pre><code>barcodeView.decodeContinuous(callback)\n<\/code><\/pre>\n<p>\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u8fbc\u3093\u3060\u3068\u304d\u306e\u51e6\u7406\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre><code>val callback = object : BarcodeCallback {\n    override fun barcodeResult(result: BarcodeResult?) {\n        if (result?.text == null || result.text == lastText) {\n            return\n        }\n        lastText = result.text\n        barcodeView.setStatusText(result.text)\n    }\n    override fun possibleResultPoints(resultPoints: MutableList&lt;ResultPoint&gt;?) {\n    }\n}\n<\/code><\/pre>\n<p>\u4f8b)MainActivity.kt<\/p>\n<pre><code>class MainActivity : AppCompatActivity() {\n    private var lastText: String = \"\"\n\n    private val callback = object : BarcodeCallback {\n        override fun barcodeResult(result: BarcodeResult?) {\n            if (result?.text == null || result.text == lastText) {\n                return\n            }\n            lastText = result.text\n            barcodeView.setStatusText(result.text)\n        }\n        override fun possibleResultPoints(resultPoints: MutableList&lt;ResultPoint&gt;?) {\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        val formats = listOf(BarcodeFormat.QR_CODE)\n        barcodeView.barcodeView.decoderFactory = DefaultDecoderFactory(formats)\n        barcodeView.decodeContinuous(callback)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        barcodeView.resume()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        barcodeView.pause()\n    }\n}\n<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/github.com\/gesource\/QRCodeReader-for-Android\">\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>ZXing Android Embedded\u3092\u4f7f\u3063\u3066\u3001QR\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308b\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3002 \u8aad\u307f\u53d6\u3063\u305fQR\u30b3\u30fc\u30c9\u3092\u65b9\u6cd5 \u8a2d\u5b9a build.gradle\u306b\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002 repositories { j &#8230;<\/p>\n<p><a href=\"https:\/\/www.gesource.jp\/weblog\/?p=8395\" class=\"more-link\">Continue reading &lsquo;Android\u3067ZXing\u3092\u4f7f\u3063\u3066QR\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308b&rsquo; &raquo;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[24],"tags":[106],"class_list":["post-8395","post","type-post","status-publish","format-standard","hentry","category-programming","tag-android"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=\/wp\/v2\/posts\/8395","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8395"}],"version-history":[{"count":0,"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=\/wp\/v2\/posts\/8395\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8395"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8395"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gesource.jp\/weblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}