地理定位离子在浏览器测试中工作但不在android上
Posted
技术标签:
【中文标题】地理定位离子在浏览器测试中工作但不在android上【英文标题】:geolocation ionic working in browser test but not on android 【发布时间】:2018-04-19 18:32:48 【问题描述】:我正在编写一个应用程序,它需要在某个时间点获取您的位置。 我为此使用了离子原生地理定位,它被发送到谷歌 API 进行反向地理编码。
当我只使用ionic serve
时,它完全按照我想要的方式工作。
但是当我尝试在 android 上运行它时,它似乎根本不起作用。
如果我运行ionic cordova run android --device -c -l
,我会得到这些控制台日志:
[20:23:58] console.log: Device Ready
[20:23:58] console.log: [object Object]
[20:23:58] console.log: No location Error
这是该页面上代码的 sn-p。
constructor(public navCtrl: NavController, public navParams: NavParams, private geo: Geolocation, private platform: Platform, public geocodeProvider: GeocodeProvider)
this.platform.ready().then(()=>
console.log("Device Ready");
this.geo.getCurrentPosition(this.options).then(resp =>
console.log(resp.coords.latitude);
console.log(resp.coords.longitude);
this.getCountry(resp.coords.latitude,resp.coords.longitude);
).catch((err)=>
console.log(err)
);
);
getCountry(lat,long)
this.geocodeProvider.getCountry(lat,long).subscribe(result =>this.country = this.getName(result));
getName(JSON:IRootObject)
var location = JSON.results[0].address_components[0].long_name;
return JSON.results[0].address_components[0].long_name;
我似乎无法找出它为什么不起作用。
编辑:
我的安卓清单:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="io.ionic.starter" 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" />
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
<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:glEsVersion="0x00020000" android:required="true" />
<uses-feature android:name="android.hardware.location" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 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>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="***" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
</application>
</manifest>
【问题讨论】:
您是否拥有所需的权限?COURSE_LOCATION
, FINE_LOCATION
?
我用 android manifest 编辑了我的问题
【参考方案1】:
我认为您使用的是 Android 6 或更高版本。您必须在运行时请求权限。
安装:
$ ionic cordova plugin add cordova-plugin-android-permissions
$ npm install --save @ionic-native/android-permissions
用途:
import AndroidPermissions from '@ionic-native/android-permissions';
constructor(private androidPermissions: AndroidPermissions)
this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.LOCATION_COURSE)
.then(
result => console.log('Has permission?', result.hasPermission),
err => this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.LOCATION_COURSE)
);
您必须为所需的每个权限执行此请求。
详情请见https://ionicframework.com/docs/native/android-permissions/。
在 Google 的指南中,您可以找到有关如何请求权限和处理用户响应的其他信息(解释您为什么需要权限,不要要求太多,...)
https://developer.android.com/training/permissions/requesting.html
【讨论】:
这是最近发生的变化吗?我们遇到一些用户报告说地理定位在 3 周前在 android 设备上停止工作。 (它适用于ios)。 @fastr.de(我没有使用离子,只是科尔多瓦,想知道我是否可以做类似的事情) ionic 使用github.com/NeoLSN/cordova-plugin-android-permissions 请求权限。但是权限请求方法是在 Android 6 中引入的,比 3 周早了 ;-/【参考方案2】:@fastr.de 我添加了这个:
constructor(public navCtrl: NavController, public navParams: NavParams, private geo: Geolocation, private platform: Platform, public geocodeProvider: GeocodeProvider,private androidPermissions: AndroidPermissions)
this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION).then(
result => console.log('Has permission? ACCESS_FINE_LOCATION',result.hasPermission),
err => this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION)
);
this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_LOCATION_EXTRA_COMMANDS).then(
result => console.log('Has permission? ACCESS_LOCATION_EXTRA_COMMANDS',result.hasPermission),
err => this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_LOCATION_EXTRA_COMMANDS)
);
this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION).then(
result => console.log('Has permission? ACCESS_COARSE_LOCATION',result.hasPermission),
err => this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION)
);
this.platform.ready().then(()=>
console.log("Device Ready");
this.androidPermissions.requestPermissions([this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION, this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,this.androidPermissions.PERMISSION.ACCESS_LOCATION_EXTRA_COMMANDS]);
this.geo.getCurrentPosition(this.options).then(resp =>
console.log(resp.coords.latitude);
console.log(resp.coords.longitude);
this.getCountry(resp.coords.latitude,resp.coords.longitude);
).catch((err)=>
console.log(err)
);
);
控制台输出为:
[16:17:15] console.log: Device Ready
[16:17:15] console.log: Has permission? ACCESS_LOCATION_EXTRA_COMMANDS true
[16:17:15] console.log: Has permission? ACCESS_FINE_LOCATION true
[16:17:15] console.log: Has permission? ACCESS_COARSE_LOCATION true
[16:17:15] console.log: [object Object]
[16:17:15] console.log: No location Error
【讨论】:
以上是关于地理定位离子在浏览器测试中工作但不在android上的主要内容,如果未能解决你的问题,请参考以下文章