地理定位离子在浏览器测试中工作但不在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上的主要内容,如果未能解决你的问题,请参考以下文章

ApnsPHP:在开发中工作但不在生产中的推送通知

获取在 HTML 页面中工作但不在 JS 中工作 [重复]

请求在CURL中工作但不在Ajax中工作

地理定位在笔记本电脑上工作,但不在智能手机上

CoreLocation 应用程序在模拟器中工作但不在设备上

Azure Notificationhub - PN 发送在沙盒中工作但不在生产中