QRコードをスキャンする際に端末の位置情報を「cordova-plugin-geolocation」で取得してきてQRコードに埋め込んだ緯度と経度とあっているか計測したいのですが、時々、緯度経度が
初期値のfalseのままの場合があります。
これは非同期処理だからでしょうか?
どのようにしたら安定して位置情報を取得できるか教えていただけると助かります。
よろしくおねがいします。
codova使用プラグイン
・cordova-plugin-geolocation
・Phonegap BarcodeScanner
(doMapで位置情報を取得、doScannerでdoMapで呼び出しごQRコードをスキャンする処理を書いています。)
html
1<template> 2 <v-ons-page> 3 <v-ons-toolbar> 4 <div class="center">{{ title }}</div> 5 </v-ons-toolbar> 6 7 <p style="text-align: center"> 8 <v-ons-button @click="doScanner">QRコードをスキャンする</v-ons-button> 9 </p> 10 </v-ons-page> 11</template> 12 13<script> 14export default { 15 data() { 16 return { 17 title: "スキャンアプリ", 18 latitude: false, 19 longitude: false, 20 applicationKey:"xxxx", 21 clientKey:"xxxx", 22 }; 23 }, 24 methods: { 25 doMap() { 26 let self = this; 27 let onSuccess = function (position) { 28 //小数点以下4桁 4kmまで 29 self.latitude = position.coords.latitude.toFixed(4); 30 self.longitude = position.coords.longitude.toFixed(4); 31 }; 32 let option = { timeout: 30000 }; 33 navigator.geolocation.getCurrentPosition(onSuccess, this.onError, option); 34 }, 35 onError(error) { 36 switch (error.code) { 37 case 1: 38 alert("位置情報の利用が許可されていません"); 39 break; 40 case 2: 41 alert("現在位置が取得できませんでした"); 42 break; 43 case 3: 44 alert("タイムアウトになりました"); 45 break; 46 default: 47 alert("その他のエラー(エラーコード:" + error.code + ")"); 48 break; 49 } 50 }, 51 doScanner() { 52 let self = this; 53 if (window.cordova && cordova.plugins && cordova.plugins.barcodeScanner) { 54 self.doMap(); 55 cordova.plugins.barcodeScanner.scan( 56 function (result) { 57 let split_qr = result.text.split(','); 58 // console.log(result.format); 59 if(split_qr[0] == self.latitude && split_qr[1] == self.longitude){ 60 self.doUser(split_qr[2]); 61 }else{ 62 alert("緯度経度が違います"); 63 } 64 }, 65 function (error) { 66 alert("読み込みに失敗しました。\nエラーコード:" + error); 67 } 68 ); 69 }else{ 70 alert("お使いの機器がQRコードのスキャンに対応していません"); 71 } 72 }, 73 ncmbFunc(){ 74 let ncmb = new NCMB(this.applicationKey, this.clientKey); 75 return ncmb; 76 }, 77 doUser:function(uid){ 78 let ncmb = this.ncmbFunc(); 79 ncmb.Role.fetchById("xxxxx").then(function(role){ 80 return role.fetchUser(); 81 }).then(function(users){ 82 let userfind = users.find((user) => { 83 return (user.objectId === uid); 84 }); 85 86 if(userfind){ 87 let recordClass = ncmb.DataStore("recordClass"); 88 let recordClass_new = new recordClass(); 89 recordClass.equalTo("user_id",userfind.objectId).fetch().then(function(res){ 90 if(Object.keys(res).length === 0){ 91 92 recordClass_new.set("user_id",userfind.objectId).save().then(function(){ 93 alert("QRコードの送信に成功しました"); 94 }).catch(function(error){ 95 alert("読み込みに失敗しました。\nエラーコード:" + error); 96 }); 97 98 }else{ 99 alert("すでにQRコードを読み込んでいます。"); 100 } 101 }).catch(function(){ 102 alert("読み込みに失敗しました。\nエラーコード:" + error); 103 }); 104 105 }else{ 106 alert("ユーザー情報がありません"); 107 } 108 }).catch(function(error){ 109 alert("読み込みに失敗しました。\nエラーコード:" + error); 110 }); 111 } 112 }, 113}; 114</script> 115
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。