Ionic 使用原生定位功能

Java禅修者
• 阅读 6573

我们在上一篇已经成功创建并编译了 hello-world 项目。现在增加读取当前坐标的功能。

新增读取当前坐标的功能

  1. 首先要安装 geolocation plugin

    npm install --save @ionic-native/geolocation
  2. 将 geolocation plugin 添加到 app.module.ts 的 providers 中:

    import { Geolocation } from "@ionic-native/geolocation";
    
    @NgModule({
      providers: [
        StatusBar,
        SplashScreen,
        Geolocation,
        { provide: ErrorHandler, useClass: IonicErrorHandler }
      ]
    })
    export class AppModule { }
  3. 在 home.html 中增加一个按钮,在按钮的 click 事件中调用 gps 插件获取当前坐标点并显示在 home.html 中:

    import { Geolocation } from '@ionic-native/geolocation';
    
    @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {
      constructor(
        public navCtrl: NavController,
        private geolocation: Geolocation
      ) {
      }
      position = "()";
    
      ngOnInit() {
        this.isLoading = "加载完毕";
      }
    
      getPosition() {
        this.geolocation.getCurrentPosition().then((resp) => {
          this.position = `(${resp.coords.latitude}, ${resp.coords.longitude})`;
        }).catch((error) => {
          this.position = 'error:' + error.message;
          console.log('Error getting location', error);
        });
      }
    }
  4. 按上一篇的方法再次编译 apk。注意编译之前要把之前生成过的 apk 全部删除先。因为今后要经常进行编译 apk 的工作,建议把压缩未签名 apk、签名 apk、验证签名这 3 项工作放进一个叫做 “sign.bat” 的批处理文件并放置在项目根目录下,然后编写 npm scripts 如下:

    "scripts": {
      "prebuild": "del /F /Q C:\\projects\\ionic\\hello-world\\platforms\\android\\app\\build\\outputs\\apk\\release\\*.*",
      "build": "ionic cordova build android --prod --release",
      "postbuild": "sign"
    }

    这样今后只要执行“npm run build”就会先执行 prebuild 里面的脚本删除旧的 apk,然后编译出新的 apk,再执行签名脚本。

在手机上安装新版 apk 之后会发现获取不到当前坐标,错误信息为“application does not have sufficient geolocation permissions.”,也就是默认是没有获取定位的权限的。

请求定位权限

  1. 参考官方文档,首先要安装 android-permissions 插件,注意这两个都要装,可不是装一个插件的两种方法!

    ionic cordova plugin add cordova-plugin-android-permissions
    npm install --save @ionic-native/android-permissions
  2. 官方文档漏了必须的一步,要在

    C:\projects\ionic\hello-world\platforms\android\app\src\main\AndroidManifest.xml

    中添加要申请的权限:ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION 和 ACCESS_LOCATION_EXTRA_COMMANDS:

    <?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-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" />
        <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>
        </application>
        <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26" />
    </manifest>

    否则根本不会弹出权限请求系统对话框。
    其中权限字符串列表在Manifest.permission.html中可以查到。

  3. 安装之后同样要把它放置到 app.module.ts 的 providers 中,并在 home.ts 中添加请求权限的代码。值得注意的是 Android 26 以上要求在请求权限之前要有使用该权限的代码,否则同样不会弹出权限申请系统对话框,所以 home.ts 代码像这样:

    import { Geolocation } from '@ionic-native/geolocation';
    import { AndroidPermissions } from '@ionic-native/android-permissions';
    
    @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {
      constructor(
        public navCtrl: NavController,
        private geolocation: Geolocation,
        private androidPermissions: AndroidPermissions
      ) {
      }
    
      position = "()";
    
      getPosition() {
        this.geolocation.getCurrentPosition().then((resp) => {
          this.position = `(${resp.coords.latitude}, ${resp.coords.longitude})`;
        }).catch((error) => {
          this.androidPermissions.requestPermissions([
            this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION,
            this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
            this.androidPermissions.PERMISSION.ACCESS_LOCATION_EXTRA_COMMANDS]).then(r => {
              // 申请权限成功
              this.geolocation.getCurrentPosition().then((resp) => {
                this.position = `(${resp.coords.latitude}, ${resp.coords.longitude})`;
              });
            }).catch(err => {
              //申请权限失败:"
            });
        });
      }
    }
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
USB中文网 USB中文网
4年前
USB中文网之虚拟鼠标功能演示
该功能是USB中文网的开发例程,其设计原理见:使用驱动程序实现的是虚拟USB鼠标功能。鼠标的事件由应用应用层下发:当前完成的功能:鼠标指针的移动鼠标的点击事件动态创建和销毁鼠标设备支持WIN7,WIN10X64,X86使用WDM框架开发应用层是VS2019编译驱动,生成驱动文件,然后再使用批处理调用devcon.exe安装
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Shodan的http.favicon.hash语法详解与使用技巧
  在Shodan搜索中有一个关于网站icon图标的搜索语法,http.favicon.hash,我们可以使用这个语法来搜索出使用了同一icon图标的网站,不知道怎么用的朋友请参考我上一篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fmia
Stella981 Stella981
3年前
Nepxion Discovery 5.5.0 发布
!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度
Stella981 Stella981
3年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这