{"id":94,"date":"2013-03-22T18:21:42","date_gmt":"2013-03-22T17:21:42","guid":{"rendered":"http:\/\/michalu.eu\/wordpress\/?p=94"},"modified":"2014-02-20T17:27:18","modified_gmt":"2014-02-20T16:27:18","slug":"scanning-and-generating-barcodes-using-zxing-library-on-android","status":"publish","type":"post","link":"https:\/\/michalu.eu\/wordpress\/scanning-and-generating-barcodes-using-zxing-library-on-android\/","title":{"rendered":"Scanning and generating barcodes using ZXING library on Android"},"content":{"rendered":"<p><a href=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134 alignleft\" style=\"margin: 5px;\" alt=\"logo\" src=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/logo.png\" width=\"55\" height=\"55\" \/><\/a>The most popular all-in-one codes library for Android is <strong>zxing<\/strong>. Everyone used a Barcode scanner app based on this lib. But this library provides also ability to generate codes. In this example I show you how scan 1D code &#8211; Code 128. Code 128 is a very popular type of 1D code. After scanning, we obtain scanned information and&#8230; encode again to show on Android device for further scanning. Let&#8217;s go!<\/p>\n<p style=\"text-align: justify;\">What we need:<\/p>\n<ul>\n<li><span style=\"line-height: 13px;\">latest <a title=\"http:\/\/zxing.googlecode.com\/files\/ZXing-2.1.zip\" href=\"http:\/\/zxing.googlecode.com\/files\/ZXing-2.1.zip\" target=\"_blank\">ZXING <\/a>source code (2.1)<\/span><\/li>\n<li>Eclipse with ADT, Android SDK<!--more--><\/li>\n<\/ul>\n<p><span style=\"text-align: justify;\">After download source code, we import android project (android folder) as a Eclipse project into workspace.<\/span><\/p>\n<ol>\n<li><span style=\"text-align: justify;\">Mark this project as a library -&gt; Project Properties -&gt; Android -&gt; is Library (x).<\/span><\/li>\n<li><span style=\"text-align: justify;\">Add <\/span><strong style=\"text-align: justify;\">core.jar<\/strong><span style=\"text-align: justify;\"> from <\/span><em style=\"text-align: justify;\">core<\/em><span style=\"text-align: justify;\"><span> folder from downloaded sources. Now you should successfully run this project on your emulator or device. We back to this project later.\u00a0Basing on zxing sources is more convinient way to use this library instead of simple jar importing, because we can:<\/span><\/span>\n<ul style=\"text-align: justify;\">\n<li>disable &#8220;on-first-launch help&#8221;:<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">@Override\r\npublic void onCreate(Bundle icicle) {\r\nsuper.onCreate(icicle);\r\nWindow window = getWindow();\r\nwindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\r\nsetContentView(R.layout.capture);\r\nhasSurface = false;\r\nhistoryManager = new HistoryManager(this);\r\nhistoryManager.trimHistory();\r\ninactivityTimer = new InactivityTimer(this);\r\nbeepManager = new BeepManager(this);\r\nPreferenceManager.setDefaultValues(this, R.xml.preferences, false);\r\n\/\/ showHelpOnFirstLaunch();\r\n}\r\n<\/pre>\n<ol>\n<ul>\n<li>rename scan and encode intents:<\/li>\n<\/ul>\n<\/ol>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">public static final class Scan {\r\n \/**\r\n * Send this intent to open the Barcodes app in scanning mode, find a barcode, and return\r\n * the results.\r\n *\/\r\n public static final String ACTION = &amp;quot;eu.michalu.SCAN&amp;quot;;\r\n...\r\n\r\n<\/pre>\n<p>and Encode class<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">public static final class Encode {\r\n \/**\r\n * Send this intent to encode a piece of data as a QR code and display it full screen, so\r\n * that another person can scan the barcode from your screen.\r\n *\/\r\n public static final String ACTION = &amp;quot;eu.michalu.ENCODE&amp;quot;;\r\n...\r\n\r\n<\/pre>\n<ol>\n<ul>\n<li>disable zxing app menu to prevent app crashes. To do this, you should comment out onCreateOptionsMenu() method in CaptureActivity.java<\/li>\n<\/ul>\n<\/ol>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\/\/ @Override\r\n \/\/ public boolean onCreateOptionsMenu(Menu menu) {\r\n \/\/ MenuInflater menuInflater = getMenuInflater();\r\n \/\/ menuInflater.inflate(R.menu.capture, menu);\r\n \/\/ return super.onCreateOptionsMenu(menu);\r\n \/\/ }\r\n<\/pre>\n<ol>\n<li><span style=\"text-align: justify;\">We create other <\/span><strong style=\"text-align: justify;\">New Android Project<\/strong><span style=\"text-align: justify;\">. \u00a0We should link our earlier created library project to new application project. <strong>Click right mouse button on project and select Properties. Change tab to &#8216;Android&#8217; and add our zxing library project as library<\/strong>.<\/span><\/li>\n<li style=\"text-align: left;\"><span style=\"text-align: justify;\"><span style=\"text-align: justify;\"><span style=\"text-align: justify;\">We have to copy some codes from <strong>Android.manifest<\/strong> file from zxing sources. We need to copy Capture and Encode\u00a0activity declarations, uses permissions and uses features. Copy them and paste into your app manifest. But our package is different from zxing so we have to fixed activity&#8217;s \u00a0XML attributes name to be compatibile with our library project package (<strong>from\u00a0android:name=&#8221;com.google.zxing.client.android.CaptureActivity&#8221; instead of &#8220;.CaptureActivity&#8221;) and android:name=&#8221;com.google.zxing.client.android.encode.EncodeActivity&#8221; instead of &#8220;.encode.EncodeActivity&#8221;<\/strong>).\u00a0We also\u00a0have to delete or change EncodeActivity&#8217;s android:label in our manifest in new project.<\/span><\/span><\/span>\n<pre class=\"brush: xml; collapse: true; light: false; title: ; toolbar: true; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;manifest xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    package=&quot;eu.michalu.zxingexample&quot;\r\n    android:versionCode=&quot;1&quot;\r\n    android:versionName=&quot;1.0&quot; &gt;\r\n\r\n    &lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.VIBRATE&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.FLASHLIGHT&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.READ_CONTACTS&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.CHANGE_WIFI_STATE&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; \/&gt;\r\n\r\n    &lt;!-- Don't require camera, as this requires a rear camera. This allows it to work on the Nexus 7 --&gt;\r\n    &lt;uses-feature\r\n        android:name=&quot;android.hardware.camera&quot;\r\n        android:required=&quot;false&quot; \/&gt;\r\n    &lt;uses-feature\r\n        android:name=&quot;android.hardware.camera.front&quot;\r\n        android:required=&quot;false&quot; \/&gt;\r\n    &lt;uses-feature\r\n        android:name=&quot;android.hardware.camera.autofocus&quot;\r\n        android:required=&quot;false&quot; \/&gt;\r\n    &lt;uses-feature\r\n        android:name=&quot;android.hardware.camera.flash&quot;\r\n        android:required=&quot;false&quot; \/&gt;\r\n    &lt;uses-feature android:name=&quot;android.hardware.screen.landscape&quot; \/&gt;\r\n    &lt;uses-feature\r\n        android:name=&quot;android.hardware.wifi&quot;\r\n        android:required=&quot;false&quot; \/&gt;\r\n    &lt;uses-feature\r\n        android:name=&quot;android.hardware.touchscreen&quot;\r\n        android:required=&quot;false&quot; \/&gt;\r\n\r\n    &lt;!-- Donut-specific flags which allow us to run on any dpi screens. --&gt;\r\n    &lt;supports-screens\r\n        android:anyDensity=&quot;true&quot;\r\n        android:largeScreens=&quot;true&quot;\r\n        android:normalScreens=&quot;true&quot;\r\n        android:smallScreens=&quot;true&quot;\r\n        android:xlargeScreens=&quot;true&quot; \/&gt;\r\n\r\n    &lt;uses-sdk\r\n        android:minSdkVersion=&quot;8&quot;\r\n        android:targetSdkVersion=&quot;17&quot; \/&gt;\r\n\r\n    &lt;application\r\n        android:allowBackup=&quot;true&quot;\r\n        android:icon=&quot;@drawable\/ic_launcher&quot;\r\n        android:label=&quot;@string\/app_name&quot;\r\n        android:theme=&quot;@style\/AppTheme&quot; &gt;\r\n        &lt;activity\r\n            android:name=&quot;eu.michalu.zxingexample.MainActivity&quot;\r\n            android:label=&quot;@string\/app_name&quot; &gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.MAIN&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/activity&gt;\r\n        &lt;activity\r\n            android:name=&quot;com.google.zxing.client.android.CaptureActivity&quot;\r\n            android:clearTaskOnLaunch=&quot;true&quot;\r\n            android:configChanges=&quot;orientation|keyboardHidden&quot;\r\n            android:screenOrientation=&quot;landscape&quot;\r\n            android:stateNotNeeded=&quot;true&quot;\r\n            android:theme=&quot;@android:style\/Theme.NoTitleBar.Fullscreen&quot;\r\n            android:windowSoftInputMode=&quot;stateAlwaysHidden&quot; &gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;eu.michalu.SCAN&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n            &lt;!-- Allow web apps to launch Barcode Scanner by linking to http:\/\/zxing.appspot.com\/scan. --&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n                &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\r\n\r\n                &lt;data\r\n                    android:host=&quot;zxing.appspot.com&quot;\r\n                    android:path=&quot;\/scan&quot;\r\n                    android:scheme=&quot;http&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n            &lt;!-- We also support a Google Product Search URL. --&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n                &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\r\n\r\n                &lt;data\r\n                    android:host=&quot;www.google.com&quot;\r\n                    android:path=&quot;\/m\/products\/scan&quot;\r\n                    android:scheme=&quot;http&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n            &lt;!-- And the UK version. --&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n                &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\r\n\r\n                &lt;data\r\n                    android:host=&quot;www.google.co.uk&quot;\r\n                    android:path=&quot;\/m\/products\/scan&quot;\r\n                    android:scheme=&quot;http&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n            &lt;!-- Support zxing:\/\/scan\/?... like iPhone app --&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n                &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\r\n\r\n                &lt;data\r\n                    android:host=&quot;scan&quot;\r\n                    android:path=&quot;\/&quot;\r\n                    android:scheme=&quot;zxing&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/activity&gt;\r\n        &lt;activity\r\n            android:name=&quot;com.google.zxing.client.android.encode.EncodeActivity&quot;\r\n            android:stateNotNeeded=&quot;true&quot; &gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;eu.michalu.ENCODE&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n            &lt;!-- This allows us to handle the Share button in Contacts. --&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.SEND&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n\r\n                &lt;data android:mimeType=&quot;text\/x-vcard&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n            &lt;!-- This allows us to handle sharing any plain text . --&gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.SEND&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\r\n\r\n                &lt;data android:mimeType=&quot;text\/plain&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/activity&gt;\r\n    &lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;\r\n<\/pre>\n<\/li>\n<li><span style=\"text-align: justify;\">Now we have to put some code in our MainActivity. After create activity we would like to immidietely open an included barcode scanner with scan function. So we create an intent and specify some parameters as shown below:<\/span><\/li>\n<\/ol>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">package eu.michalu.zxingexample;\r\nimport android.app.Activity;\r\nimport android.content.Intent;\r\nimport android.os.Bundle;\r\nimport android.util.Log;\r\nimport android.view.Menu;\r\npublic class MainActivity extends Activity {\r\npublic static final int SCANNER_RESULT = 111;\r\n @Override\r\n protected void onCreate(Bundle savedInstanceState) {\r\n super.onCreate(savedInstanceState);\r\n setContentView(R.layout.activity_main);\r\n Intent intent = new Intent(&amp;quot;eu.michalu.SCAN&amp;quot;);\r\n intent.putExtra(&amp;quot;SCAN_MODE&amp;quot;, &amp;quot;ONE_D_MODE&amp;quot;);\r\n startActivityForResult(intent, SCANNER_RESULT);\r\n }\r\n<\/pre>\n<ol>\n<li>After successfully scanning, we should get and process obtaining data in onActivityResult method:<\/li>\n<\/ol>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n@Override\r\n protected void onActivityResult(int requestCode, int resultCode, Intent intent) {\r\n super.onActivityResult(requestCode, resultCode, intent);\r\n \/**\r\n * Back from scanner view\r\n *\/\r\n if (requestCode == SCANNER_RESULT) {\r\n if (resultCode == RESULT_OK) {\r\n String contents = intent.getStringExtra(&amp;quot;SCAN_RESULT&amp;quot;);\r\n Intent encodeIntent = new Intent(&amp;quot;eu.michalu.ENCODE&amp;quot;);\r\n encodeIntent.addCategory(Intent.CATEGORY_DEFAULT);\r\n encodeIntent.putExtra(&amp;quot;ENCODE_FORMAT&amp;quot;, &amp;quot;CODE_128&amp;quot;);\r\n encodeIntent.putExtra(&amp;quot;ENCODE_DATA&amp;quot;, contents);\r\n startActivity(encodeIntent);\r\n} else if (resultCode == RESULT_CANCELED) {\r\n \/\/ Handle cancel\r\n Log.i(MainActivity.class.getSimpleName(), &amp;quot;Handle cancel&amp;quot;);\r\n }\r\n }\r\n }\r\n<\/pre>\n<h2>Test<\/h2>\n<ol>\n<li>Create CODE128 using online generator i.e. http:\/\/www.barcoding.com\/upc\/ and scan using our example app. After scanning you should get the same CODE128 like this online generated one.<br \/>\n<a href=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/0123456789.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-124 aligncenter\" alt=\"0123456789\" src=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/0123456789-300x133.png\" width=\"300\" height=\"133\" srcset=\"https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/0123456789-300x133.png 300w, https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/0123456789.png 428w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/li>\n<li>Scanning &#8230;<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-126 aligncenter\" alt=\"scanning\" src=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/scanning-300x200.png\" width=\"300\" height=\"200\" srcset=\"https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/scanning-300x200.png 300w, https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/scanning.png 480w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<ol>\n<li>and encoded again our code! \ud83d\ude42<\/li>\n<\/ol>\n<p><a href=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/encoded.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-125 aligncenter\" alt=\"encoded\" src=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/encoded-300x200.png\" width=\"300\" height=\"200\" srcset=\"https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/encoded-300x200.png 300w, https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/encoded.png 480w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Full source code of application, library and apk:<\/p>\n<ul>\n<li><span style=\"line-height: 13px;\"><a title=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/zxing-michalueu-example.zip\" href=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/zxing-michalueu-example.zip\" target=\"_blank\">application<\/a><br \/>\n<\/span><\/li>\n<li><a title=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/zxing-michalueu-library.zip\" href=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/zxing-michalueu-library.zip\" target=\"_blank\">library project<\/a><\/li>\n<li><a title=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/zxing-michalueu-apk.zip\" href=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/zxing-michalueu-apk.zip\" target=\"_blank\">zipped apk<\/a><\/li>\n<\/ul>\n<p>or checkout from my github <a title=\"https:\/\/github.com\/fockeRR\/michalueu-examples\" href=\"https:\/\/github.com\/fockeRR\/michalueu-examples\" target=\"_blank\">account<\/a>:<\/p>\n<p><a href=\"https:\/\/github.com\/fockeRR\/michalueu-examples\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-152\" alt=\"github_logo\" src=\"http:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/github_logo-300x93.png\" width=\"240\" height=\"74\" srcset=\"https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/github_logo-300x93.png 300w, https:\/\/michalu.eu\/wordpress\/wp-content\/uploads\/2013\/03\/github_logo.png 600w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The most popular all-in-one codes library for Android is zxing. Everyone used a Barcode scanner app based on this lib. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[8,22],"tags":[100,55,57,58,56],"class_list":["post-94","post","type-post","status-publish","format-standard","hentry","category-android","category-developers","tag-android","tag-barcodes","tag-generate","tag-scan","tag-zxing"],"_links":{"self":[{"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=94"}],"version-history":[{"count":39,"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":276,"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/posts\/94\/revisions\/276"}],"wp:attachment":[{"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michalu.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}