質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

1回答

974閲覧

cordovaで位置情報を取得したい

web11

総合スコア52

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2022/01/05 13:49

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

doScannerの中で実行されているこの2行の処理が同期を図っていないからかと思います。

doMap(); cordova.plugins.barcodeScanner.scan(

doMapの中で実行されるnavigator.geolocation.getCurrentPosition()は非同期処理の様ですので、jsの処理は次の行であるcordova.plugins.barcodeScanner.scan()の実行に移っているかと思います。
scanの方が先に処理を完了すると、緯度・経度の変数は初期値のままになるという事かと・・・

コールバック内(onSuccess内)で実行する様にして同期・順序付けをすればいけるかと思います。

投稿2023/09/20 02:51

ttttth

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問