前提・実現したいこと
Monaca で QRコードリーダを実装し、読み込んだデータをLocalStorageに保存したいのですが、うまくいきません。
Monacaなどアプリ開発は初心者レベルなのでご教授願います。
使用しているバーコードプラグインはPhoneGap Barcode Scanner 8.1.0 です。
該当のソースコード
javascript
1//バーコードを読み込み成功したらアラート表示 2function scanBarcode() { 3 console.log('startCodeScanning'); 4 cordova.plugins.barcodeScanner.scan( 5 function (result) { 6 if(result.cancelled){ 7 return; 8 } 9 //Result: result.text 10 //Format: result.format 11 //Cancelled: result.cancelled 12 alert("We got a barcode\n" + 13 "Result: " + result.text + "\n" + 14 "Format: " + result.format + "\n" + 15 "Cancelled: " + result.cancelled); 16 localStorage.setItem('qr_code',result); 17 }, 18 function (error) { 19 alert("Scanning failed: " + error); 20 } 21 ); 22 23 24 if ('qr_code' in localStorage) { 25 alert('yes'); 26 } else { 27 alert('no'); 28 } 29 30}
HTML
1<!DOCTYPE HTML> 2<html> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, user-scalable=no"> 6 <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> 7 <link rel="stylesheet" href="components/loader.css"> 8 <link href="css/html5reset-1.6.1.css" rel="stylesheet"> 9 <link href="css/style.css" rel="stylesheet"> 10 <link rel="stylesheet" href="components/loader.css"> 11 <script src="js/lib/jquery-3.5.1.min.js"></script> 12 <script src="components/loader.js"></script> 13 <script> 14 function scanBarcode() { 15 cordova.plugins.barcodeScanner.scan( function(result) { 16 alert("We got a barcode\n" + 17 "Result: " + result.text + "\n" + 18 "Format: " + result.format + "\n" + 19 "Cancelled: " + result.cancelled); 20 }, function(error) { 21 alert("Scanning failed: " + error); 22 } 23 ); 24 25 } 26 </script> 27</head> 28<body> 29 <header> 30 <div class="header-bar"> 31 <h1>QRコードリーダ</h1> 32 <a href="menu.html" class="btn-back"></a> 33 </div> 34 </header> 35 36 <input type="button" onClick ="scanBarcode()" value ="Scan" /> 37 38 <footer> 39 <a href="javascript:scanBarcode();" class="big-btn blue">Code Read</a> 40 </footer> 41</body> 42</html>
該当の画面を開く(アプリを動かす)とヘッダに「QRコードリーダ」とひとつ前の画面に戻るボタン、フッタにコードリーダを呼び出すボタンが配置された画面が表示されます。
コードリーダを呼び出すボタンを押すとコードリーダが呼び出されます。その後QRコードなどにかざすと、画面下側に「コードが読み込まれました:<URL>」のような内容が表示されます。
しかし、戻った時にalertのポップアップが表示されるはずなのですが、これが出てきません。
LocalStorageにも変数が追加されていないため、おそらく成功した時の関数が実行されていません。
これをどうにかしたいのですが、似たような問題とそれの解決策がなかったため質問させていただきました。
試したこと
GPSなどでバックグラウンド処理を有効にしていると、ときどき動作しなくなるという旨の記事を見たため、それを回避するコードを入力しました。(上記にはありません)
必要なプラグインのインポートのし忘れやHTMLファイルでsrcの読み込み順番の間違えによるエラー等のチェックを行いましたが、解決には至りませんでした。
(2020/07/27 追記)
Promiseを用いた非同期処理を実践したところ、後述するような文がログに出力されました。以下に示すのはPromiseを用いたjsコードです。
javascript
1function scan(){ 2 return new Promise((resolve,reject) =>{ 3 document.addEventListener("deviceready", cordova.plugins.barcodeScanner.scan( 4 function (result) { 5 resolve(result.text); 6 }, 7 function (error) { 8 reject(error); 9 }, 10 { 11 preferFrontCamera : false, // iOS and Android 12 showFlipCameraButton : true, // iOS and Android 13 showTorchButton : true, // iOS and Android 14 //torchOn: true, // Android, launch with the torch switched on (if available) 15 saveHistory: true, // Android, save scan history (default false) 16 prompt : "Place a barcode inside the scan area", // Android 17 resultDisplayDuration: 500, // Android, display scanned text for X ms. 0 suppresses it entirely, default 1500 18 formats : "QR_CODE,PDF_417", // default: all but PDF_417 and RSS_EXPANDED 19 //orientation : "landscape", // Android only (portrait|landscape), default unset so it rotates with the device 20 disableAnimations : true, // iOS 21 disableSuccessBeep: true // iOS and Android 22 } 23 ), false); 24 }); 25} 26 27function scanBarcode(){ 28 scan().then(response => alert(`Scanning Success: ${response}`)) 29 .catch(error => alert(`Scanning failed: ${error}`)) 30 .finally(() => console.log('終了')); 31} 32}
上記コードを実行したところ、catch()の方が実行(失敗)されました。このエラーを修正すればバーコードスキャナーを使えるようになりそうですが、、、
text
1Scanning failed: TypeError: Cannnot read property 'handleEvent' of undefined
2020/07/28 追記
BarcodeScannerプラグインのみ有効にし、プログラムはサンプルのコードのままで動作させましたが、やはり成功時に呼び出されるalertが表示されませんでした。
また、Blankプロジェクトを作成し、BarcodeScannerのみ有効にし、サンプルコードのまま動かすと、こちらはうまくいきました。
このことから他のプラグインが邪魔をしているわけではなさそうです。
回答2件
あなたの回答
tips
プレビュー