{"id":8952,"date":"2020-08-19T10:00:33","date_gmt":"2020-08-19T01:00:33","guid":{"rendered":"https:\/\/www.gigas-jp.com\/appnews\/?p=8952"},"modified":"2020-08-18T22:06:04","modified_gmt":"2020-08-18T13:06:04","slug":"android%e3%81%a7qrcode%e3%82%92%e4%bd%9c%e6%88%90%e3%81%97%e3%82%88%e3%81%86","status":"publish","type":"post","link":"https:\/\/www.gigas-jp.com\/appnews\/archives\/8952","title":{"rendered":"Android\u3067QRCode\u3092\u4f5c\u6210\u3057\u3088\u3046"},"content":{"rendered":"\n<p>Android\u7528\u306e\u30d0\u30fc\u30b3\u30fc\u30c9\u30b9\u30ad\u30e3\u30ca\u30fc\u30e9\u30a4\u30d6\u30e9\u30ea\u306e<br><a href=\"https:\/\/github.com\/journeyapps\/zxing-android-embedded\">journeyapps.com\u306ezxing-android-embedded<\/a><br>\u3092\u4f7f\u7528\u3057\u3066\u6587\u5b57\u5217\u304b\u3089QR\u30b3\u30fc\u30c9\u3092\u4f5c\u6210\u3059\u308b\u30a2\u30d7\u30ea\u306e\u3054\u7d39\u4ecb\u3067\u3059\u3002<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>\u521d\u3081\u306bgit\u306ereadme\u3092\u53c2\u8003\u306b\u30e9\u30a4\u30d6\u30e9\u30ea\u3092Android\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u7d44\u307f\u8fbc\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3067\u3059\u3002\u8a00\u8a9e\u306fKotlin\u3067\u3059\u3002<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MainActivity : AppCompatActivity() {\n\n    \/\/ QR\u30b3\u30fc\u30c9\u5316\u3059\u308b\u6587\u5b57\u5217\n    private var textData = \"\"\n    \/\/ \u753b\u50cf\u306e\u30b5\u30a4\u30ba\n    private var size = 512\n\n    private val PNG_OUTPUT_REQUEST_CODE = 1\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        \/\/ ACTION_SEND\u3067\u6e21\u3055\u308c\u305f\u30c7\u30fc\u30bf\u304b\u3089QRCode\u3092\u4f5c\u6210\u3059\u308b\n        val intent = intent\n        val action = intent.action\n        if (Intent.ACTION_SEND == action) {\n            val extras = intent.extras\n            if (extras != null) {\n                val txt = extras.getString(Intent.EXTRA_TEXT)\n                if (!txt.isNullOrEmpty()) {\n                    textData = txt\n                    editText.setText(txt)\n                    generateQRCode()\n                }\n            }\n        }\n\n        \/\/ editText\u306b\u5165\u529b\u3055\u308c\u3066\u3044\u308b\u30c6\u30ad\u30b9\u30c8\u304b\u3089QRCode\u3092\u4f5c\u6210\u3059\u308b\n        generateButton.setOnClickListener {\n            textData = editText.text.toString()\n            generateQRCode()\n        }\n\n        \/\/ imageView\u306b\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u753b\u50cf\u3092\u51fa\u529b\u3059\u308b\n        saveButton.setOnClickListener {\n            doOutPutFile(\"image\/png\", \"\", PNG_OUTPUT_REQUEST_CODE)\n        }\n    }\n\n    \/\/ \u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u5229\u7528\u3057\u3066QRCode\u306ebitmap\u3092\u4f5c\u6210\u3057\u3001imageView\u306b\u8868\u793a\u3059\u308b\n    private fun generateQRCode()\n    {\n        try{\n            val barcodeEncoder = BarcodeEncoder()\n            \/\/\n            val bitmap = barcodeEncoder.encodeBitmap(textData, BarcodeFormat.QR_CODE, size, size)\n            imageView.setImageBitmap(bitmap)\n        }catch(e : Exception)\n        {\n\n        }\n    }\n\n    \/\/ ACTION_CREATE_DOCUMENT\u30a4\u30f3\u30c6\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u51fa\u529b\u30e1\u30bd\u30c3\u30c9\n    private fun doOutPutFile(mimeType: String, fileName: String, requestCode : Int) {\n        \/\/ \u30b9\u30c8\u30ec\u30fc\u30b8\u30a2\u30af\u30bb\u30b9\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u3063\u305f \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u4f5c\u6210\u7528\u306e\u30a4\u30f3\u30c6\u30f3\u30c8\n        val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)\n        \/\/ mimeType\u306e\u8a2d\u5b9a\n        intent.type = mimeType\n        \/\/ \u4fdd\u5b58\u5148\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u8a2d\u5b9a\n        intent.putExtra(Intent.EXTRA_TITLE, fileName)\n\n        startActivityForResult(intent, requestCode)\n    }\n\n    \/\/ startActivityForResult\u306e\u7d50\u679c\u3092\u53d7\u3051\u53d6\u308b\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n\n        \/\/ PNG\u7528\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3000\u304b\u3064\u3000\u7d50\u679c\u304c\u6210\u529f\u3067\u3042\u308c\u3070PNG\u306e\u66f8\u304d\u8fbc\u307f\u3092\u884c\u3046\n        if(requestCode == PNG_OUTPUT_REQUEST_CODE &amp;&amp; resultCode == Activity.RESULT_OK)\n        {\n            \/\/ \u30c7\u30fc\u30bf\u306enull\u30c1\u30a7\u30c3\u30af\n            if(data?.data != null)\n            {\n                val uri = data.data\n\n                try{\n                    \/\/ data\u304b\u3089\u53d6\u5f97\u3057\u305furi\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u3078\u306eOutputStream\u3092\u958b\u304f\n                    val outputStream = contentResolver.openOutputStream(uri!!)\n\n                    val outPutBitmap = Bitmap.createBitmap(\n                        imageView.width,\n                        imageView.height,\n                        Bitmap.Config.ARGB_8888\n                    )\n                    val outPutCanvas = Canvas(outPutBitmap)\n\n                    \/\/ QR\u30b3\u30fc\u30c9\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308bimageView\u304b\u3089\u51fa\u529b\u7528Canvas\u306b\u63cf\u304d\u8fbc\u3080\n                    imageView.draw(outPutCanvas)\n\n                    \/\/ PNG\u5f62\u5f0f\u3067\u51fa\u529b\n                    outPutBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)\n                }catch (e : Exception)\n                {\n                    \/\/ \u30a8\u30e9\u30fc\u304c\u8d77\u304d\u305f\u3089\n                    \/\/ Uri\u304c\u6307\u3057\u793a\u3059\u5148\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3059\u308b\u3002\n                    DocumentsContract.deleteDocument(contentResolver, uri!!)\n\n                }\n\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3063\u3066QRCode\u3092\u4f5c\u6210\u3057\u3066\u3044\u308b\u306e\u306f<br>generateQRCode\u3000\u95a2\u6570\u3067\u3059\u3002<br>BarcodeEncoder\u306e\u30e1\u30bd\u30c3\u30c9encodeBitmap()\u306b<br>\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3001\u30d5\u30a9\u30fc\u30de\u30c3\u30c8(\u4eca\u56de\u306fQRCode)\u3001\u753b\u50cf\u306e\u5e45\u3068\u9ad8\u3055<br>\u3092\u5f15\u6570\u306b\u6e21\u3059\u3060\u3051\u3067QRCode\u306eBitmap\u3092\u8fd4\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306eBitmap\u3092ImageView\u306b\u8868\u793a\u3057\u305f\u308a\u3001<br>\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u51fa\u529b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"576\" height=\"1024\" src=\"\/appnews\/wp-content\/uploads\/sites\/4\/2020\/08\/Screenshot_20200818-174506-576x1024.jpg\" alt=\"\" class=\"wp-image-8955\" srcset=\"https:\/\/www.gigas-jp.com\/appnews\/wp-content\/uploads\/sites\/4\/2020\/08\/Screenshot_20200818-174506-576x1024.jpg 576w, https:\/\/www.gigas-jp.com\/appnews\/wp-content\/uploads\/sites\/4\/2020\/08\/Screenshot_20200818-174506.jpg 1080w\" sizes=\"(max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<p>onCreate\u3067\u30a4\u30f3\u30c6\u30f3\u30c8\u304b\u3089\u60c5\u5831\u3092\u53d7\u3051\u3066\u3044\u308b\u7b87\u6240\u304c\u3042\u308a\u307e\u3059\u304c\u3001<br>\u3053\u3053\u3067\u306f\u3001\u6697\u9ed9\u7684Intent\u3000&#8221;android.intent.action.SEND&#8221; <br>\u3067\u60c5\u5831\u3092\u53d7\u3051\u53d6\u308a\u3001\u305d\u306e\u60c5\u5831\u3092QRCode\u3068\u3057\u3066\u51fa\u529b\u3057\u3066\u3044\u307e\u3059\u3002<br>\u3053\u3046\u3059\u308b\u3053\u3068\u3067\u3001\u4f8b\u3048\u3070\u30d6\u30e9\u30a6\u30b6\u30a2\u30d7\u30ea\u304b\u3089URL\u3092\u9078\u629e\u3057\u300c\u5171\u6709\u300d\u304b\u3089<br>\u3053\u306e\u30a2\u30d7\u30ea\u3092\u9078\u629e\u3059\u308c\u3070\u305d\u306eURL\u3092QRCode\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"576\" height=\"1024\" src=\"\/appnews\/wp-content\/uploads\/sites\/4\/2020\/08\/Screenshot_20200818-174522-576x1024.jpg\" alt=\"\" class=\"wp-image-8954\" srcset=\"https:\/\/www.gigas-jp.com\/appnews\/wp-content\/uploads\/sites\/4\/2020\/08\/Screenshot_20200818-174522-576x1024.jpg 576w, https:\/\/www.gigas-jp.com\/appnews\/wp-content\/uploads\/sites\/4\/2020\/08\/Screenshot_20200818-174522.jpg 1080w\" sizes=\"(max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<p>\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u7c21\u5358\u306bQRCode\u5316\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u306d\u3002<\/p>\n\n\n\n<p>\u6c34\u66dc\u62c5\u5f53:Tanaka<\/p>\n<div class='wp_social_bookmarking_light'>\n            <div class=\"wsbl_google_plus_one\"><g:plusone size=\"medium\" annotation=\"none\" href=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/8952\" ><\/g:plusone><\/div>\n            <div class=\"wsbl_hatena_button\"><a href=\"\/\/b.hatena.ne.jp\/entry\/https:\/\/www.gigas-jp.com\/appnews\/archives\/8952\" class=\"hatena-bookmark-button\" data-hatena-bookmark-title=\"Android\u3067QRCode\u3092\u4f5c\u6210\u3057\u3088\u3046\" data-hatena-bookmark-layout=\"standard\" title=\"\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0\"> <img src=\"\/\/b.hatena.ne.jp\/images\/entry-button\/button-only@2x.png\" alt=\"\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0\" width=\"20\" height=\"20\" style=\"border: none;\" \/><\/a><script type=\"text\/javascript\" src=\"\/\/b.hatena.ne.jp\/js\/bookmark_button.js\" charset=\"utf-8\" async=\"async\"><\/script><\/div>\n            <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/8952\" data-text=\"Android\u3067QRCode\u3092\u4f5c\u6210\u3057\u3088\u3046\" data-via=\"GIGASJAPAN_APPS\" data-lang=\"ja\">Tweet<\/a><\/div>\n            <div class=\"wsbl_facebook_like\"><div id=\"fb-root\"><\/div><fb:like href=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/8952\" layout=\"button_count\" action=\"like\" width=\"100\" share=\"false\" show_faces=\"false\" ><\/fb:like><\/div>\n            <div class=\"wsbl_facebook_send\"><div id=\"fb-root\"><\/div><fb:send href=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/8952\" colorscheme=\"light\" ><\/fb:send><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>Android\u7528\u306e\u30d0\u30fc\u30b3\u30fc\u30c9\u30b9\u30ad\u30e3\u30ca\u30fc\u30e9\u30a4\u30d6\u30e9\u30ea\u306ejourneyapps.com\u306ezxing-android-embedded\u3092\u4f7f\u7528\u3057\u3066\u6587\u5b57\u5217\u304b\u3089QR\u30b3\u30fc\u30c9\u3092\u4f5c\u6210\u3059\u308b\u30a2\u30d7\u30ea\u306e\u3054\u7d39\u4ecb\u3067\u3059\u3002<\/p>\n","protected":false},"author":17,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[119,12],"tags":[],"acf":[],"_links":{"self":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts\/8952"}],"collection":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/comments?post=8952"}],"version-history":[{"count":8,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts\/8952\/revisions"}],"predecessor-version":[{"id":8968,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts\/8952\/revisions\/8968"}],"wp:attachment":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/media?parent=8952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/categories?post=8952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/tags?post=8952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}