如何解决Cordova Android 在没有 wifi 的情况下获得地理定位
目标
我正在开发一款针对搭载 Android 9 的平板电脑的cordova 应用程序。 该应用程序的主要功能之一是无需连接到互联网或需要 SIM 卡即可检索平板电脑的当前经度和纬度。
行为
我正在使用 cordova plugin add cordova-plugin-geolocation
添加 cordova-plugin-geolocation
插件,该插件似乎仅在平板电脑连接到 Internet 时才起作用。
如果 wifi 关闭,那么我只会得到无限的等待时间。
如果我设置了超时,那么在超时完成后会调用错误函数。
检查
- 我已确认我使用的设备具有正常运行的 GPS 系统,因为其他 GIS 应用程序在不使用 wifi/数据的情况下也能正常运行
- 允许应用读取我的位置
- 我尝试在几个不同的位置使用几个不同的超时(10E3 - 5*60E3 毫秒),但没有成功
JavaScript + HTML
我的 html 中的第一个脚本是 <script src="cordova.js"></script>
,所有脚本都没有 async 标签,因此所有脚本都在加载 cordova 脚本后运行(在适用时仍使用 document.addEventListener("deviceready",...,false);
)
控制台或网络选项卡上没有错误。
下面是我用来获取地理位置的函数,它在 wifi 关闭时总是打印 no data
。
var deviceIsReady;
document.addEventListener("deviceready",function() {
deviceIsReady = true;
},false);
function getLocation() {
return new Promise(function(resolve,reject) {
if (!navigator.geolocation || !deviceIsReady) {
console.log("Can't use geolocation");
return reject();
}
var unreliablePosition;
navigator.geolocation.getCurrentPosition(function(position) {
unreliablePosition = position;
},function(err) {
console.log("Failed to get unreliable geolocation");
},{
enableHighAccuracy: false,maximumAge: Infinity,timeout: 4.5 * 60E3
});
navigator.geolocation.getCurrentPosition(function(position) {
resolve(position.coords.latitude + "," + position.coords.longitude);
},function(error) {
if (unreliablePosition) {
console.log("using unreliable");
resolve(unreliablePosition.coords.latitude + "," + unreliablePosition.coords.longitude);
} else {
console.log("no data");
reject(error);
}
},{
enableHighAccuracy: true,timeout: 5 * 60E3,maximumAge: 0
});
});
}
我尝试了什么
我在 stackoverflow 上发现的唯一解决问题的问题是 this one,我尝试过,但它似乎没有用(可能是因为它是 2014 年的)。我创建了一个名为 custom-plugins
的文件夹并将插件移到那里而不是 c。
我还尝试从 xml 中删除 ACCESS_COARSE_LOCATION
以试图强制应用程序使用 ACCESS_FINE_LOCATION
,但是一旦我调用 PositionError {code: null,message: ""}
,就会使用 getCurrentPosition
调用错误函数}}
config.xml
<?xml version='1.0' encoding='utf-8'?>
<widget id="my-app" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<icon src="www/logo.png" />
<name>my-app</name>
<description>
my application
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="geo:*" />
<platform name="android" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.4" />
</widget>
package.json
{
"name": "my-app","displayName": "my-app","version": "1.0.0","description": "my app","main": "build.js","scripts": {
"build": "node build.js","debug": "node debug.js","test": "node test.js"
},"keywords": [
"ecosystem:cordova"
],"author": "me","license": "Apache-2.0","devDependencies": {
"cordova-android": "^9.1.0","cordova-browser": "^6.0.0","cordova-plugin-geolocation": "file:custom-plugins/cordova-plugin-geolocation","cordova-plugin-ionic-keyboard": "^2.2.0","cordova-plugin-network-information": "^2.0.2","cordova-plugin-whitelist": "^1.3.4"
},"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},"cordova-plugin-ionic-keyboard": {},"cordova-plugin-network-information": {},"cordova-plugin-geolocation": {
"GPS_REQUIRED": "true"
}
},"platforms": [
"android","browser"
]
}
}
AndroidManifest.xml
该文件由cordova在./platforms/android/app/src/main/
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="my-app" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
</manifest>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。