美文网首页我的 ionicIonic之路ionic2实战
ionic2实战-封装插件进行精确定位和导航

ionic2实战-封装插件进行精确定位和导航

作者: 昵称已被使用_ | 来源:发表于2017-02-25 16:22 被阅读12096次

前言

  • web端的定位是不准确的,在一些对定位要求不高的情况下可以用,比如只需要定位到城市用来查询天气

效果展示

封装插件进行精确定位和导航.gif

安装插件方式1:命令安装

安装定位插件

cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amaplocation --save

安装导航插件.如果只需要定位,则不需要安装导航插件

cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amapnavigation --save
安装效果图

安装插件方式2:手动安装

  1. 下载插件到本地,如下图点击Download Zip


  2. 解压.zip后.删掉文件夹目录-master后缀

3.复制插件文件夹到app项目plugins目录下.此时插件已经安装完成,可以使用了

4.为了让插件集成的更完善.可以修改fetch.jsonconfig.xml声明插件来源


"com.kit.cordova.amaplocation": {
        "source": {
            "type": "git",
            "url": "https://github.com/yanxiaojun617/com.kit.cordova.amaplocation",
            "subdir": "."
        },
        "is_top_level": true,
        "variables": {}
    }
<plugin name="com.kit.cordova.amaplocation" spec="https://github.com/yanxiaojun617/com.kit.cordova.amaplocation" />

获取key

  • 在高德开发平台控制台添加Android和ios key
  • Android平台key分debug key 和release key,对应debug Apk和release Apk
  • 获取release key需要对app签名获得keystore文件,在开发调试阶段可以先只获取地图debug key,如下图红色字体标注.还需要注意的是,debug key每台电脑都不一样,如果另一位同事也要调试地图定位功能,则需要在他电脑上申请debug key
    添加Android平台key
    添加ios平台key

配置插件key

  • 把申请的Android key填写到如下图位置


  • 把申请的ios key填写到如下图位置


  • 由于许多人还不会申请key,所以添加此gif,注意此gif只添加了android debug key.如果app已经有签名文件,就一并把release key申请了,如下图.

  • 如果已经有了release keystore.则按如下方式申请正式版android key

还不会生成正式版keystore,看这里

最快捷的测试方法

  declare var LocationPlugin;
  test(){
    LocationPlugin.getLocation(data => {
      alert(JSON.stringify(data))
    }, msg => {
      alert(JSON.stringify(msg))
    });
  }

封装插件

如下图,创建一个provider封装插件,注意红色标注

/**
 * Created by yanxiaojun617@163.com on 12-27.
 */
import {Injectable} from '@angular/core';
import {Platform} from 'ionic-angular';
declare var LocationPlugin;
declare var AMapNavigation;

@Injectable()
export class NativeService {
  private loading;

  constructor(private platform: Platform) {
  }

  /**
   * 是否真机环境
   * @return {boolean}
   */
  isMobile() {
    return this.platform.is('mobile') && !this.platform.is('mobileweb');
  }

  /**
   * 获得用户当前坐标
   * @return {Promise<T>}
   */
  getUserLocation() {
    return new Promise((resolve, reject) => {
      if (this.isMobile()) {
        LocationPlugin.getLocation(data => {
          resolve({'lng': data.longitude, 'lat': data.latitude});
        }, msg => {
          console.error('定位错误消息' + msg);
          alert(msg.indexOf('缺少定位权限') == -1 ? ('错误消息:' + msg) : '缺少定位权限,请在手机设置中开启');
          reject('定位失败');
        });
      } else {
        console.log('非手机环境,即测试环境返回固定坐标');
        resolve({'lng': 113.350912, 'lat': 23.119495});
      }
    });
  }

  /**
   * 地图导航
   * @param startPoint 开始坐标
   * @param endPoint 结束坐标
   * @param type 0实时导航,1模拟导航,默认为模拟导航
   * @return {Promise<T>}
   */
  navigation(startPoint, endPoint, type = 1) {
    return new Promise((resolve, reject) => {
      if (this.platform.is('mobile') && !this.platform.is('mobileweb')) {
        AMapNavigation.navigation({
          lng: startPoint.lng,
          lat: startPoint.lat
        }, {
          lng: endPoint.lng,
          lat: endPoint.lat
        }, type, function (message) {
          resolve(message);//非手机环境,即测试环境返回固定坐标
        }, function (message) {
          alert('导航失败:' + message);
          reject('导航失败');
        });
      } else {
        console.log('非手机环境不能导航');
      }
    });
  }


}

封装插件

在app中使用插件

  • app.module.ts中注入NativeServiceprovider

  • 在组件中使用,更完整代码在github查看

常见问题

1.定位权限问题

使用cordova.plugins.diagnostic中的isLocationAuthorized方法可以判断app是否有定位权限.
使用cordova.plugins.diagnostic中的isLocationEnabled方法可以判断app是否开启位置服务.
根据这两个方法就可以友好的提示用户开启定位权限,目前我的app已经实现此功能,详情看NativeService.ts中getUserLocation方法

如果不想使用diagnostic插件判断这么复杂,那就给config.xml添加

  <preference name="android-minSdkVersion" value="16" />
  <preference name="android-maxSdkVersion" value="22"/>
  <preference name="android-targetSdkVersion" value="22"/>

Android 6.0权限说明,Android 6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,当targetSdkVersion大于23需要自己实现动态权限申请功能

2.导航功能和极光推送插件冲突

删除/plugins/cordova-plugin-jcore/plugin.xml中的引用


2.导航功能和cordova-sqlite-storage插件冲突

3.和插件冲突说明

  • android查找.so文件会先看有没有arm64-v8a文件夹,如果没有该文件夹就去找armeabi-v7a文件夹,如果没有再去找armeabi文件夹.所以这三个文件夹有优先顺序.并且如果找到了就不再往下找了.
  • 导航插件所有的.so文件都放在armeabi文件夹下,所以如果其他插件提供了arm64-v8a或者armeabi-v7a文件夹,那就找不到导航插件的.so文件了.所以导航功能会闪退
  • 目前处理的方法就是不需要arm64-v8a和armeabi-v7a文件夹,具体操作就是注释其他插件plugin.xml中target-dir="libs/arm64-v8a"target-dir="libs/armeabi-v7a"的记录

相关文章

网友评论

  • 狼群_0b56:大神 你的插件需要更新苹果端的权限 :
    <platform name="ios">
    <config-file parent="/*" target="config.xml">
    <feature name="LocationPlugin">
    <param name="ios-package" value="LocationPlugin"/>
    </feature>
    </config-file>
    <config-file target="*/*-Info.plist" parent="UIBackgroundModes">
    <array>
    <string>location</string>
    </array>
    </config-file>
    <config-file target="*/*-Info.plist" parent="NSLocationAlwaysAndWhenInUseUsageDescription">

    <string>为了确保您可以正确使用本应用,请选择允许</string>
    </config-file>
    <config-file target="*/*-Info.plist" parent="NSLocationWhenInUseUsageDescription">

    <string>为了确保您可以正确使用本应用,请选择允许</string>
    </config-file>
    <source-file src="src/ios/LocationPlugin.m"/>
    </platform>
  • jijihu123:一直报location Error, ErrCode:7, errInfo:KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:auth fail:INVALID_USER_KEY#SHA1AndPackage#
    我都查过了SHA码都是对的
    昵称已被使用_:@jijihu123 然后记得rm platform重新add platform
    昵称已被使用_:@jijihu123 你要在插件plugin.xml配置你申请的key
    jijihu123:我看了打包时候manifest里会自动添加 <meta-data android:name="com.amap.api.v2.apikey" android:value="这里填您申请的高德地图android定位key"/> 而不是key值
  • 4d41f2f1c773:LZ你好 我用高德的api定位
    自己打包成ios app 发现 当应用程序按home页返回手机桌面 或者一段时间锁屏以后
    获取经纬度的方法就无效了.
    但是android打包后没有这个问题.. 请问您有遇到过吗
    还有如果使用你的插件 ionic3 可以直接使用吗
    4d41f2f1c773:@小军617 我现在用的是 js api的定位方法
    现在有个问题就是锁屏以后 大概10秒 设置定时器的获取地理位置的方法就不执行了...
    4d41f2f1c773:@小军617 谢谢. 我再研究研究 我cd 到 .android 没用 手动搜索路径输入命令行 无效.再找找啥情况
    昵称已被使用_:@HH_762e app按home键一段时间不用(20分钟左右),就会停止运行,当然不会再获取到定位,android和ios都是。插件和ionic版本没关系,所以ionic3可以用
  • ec8486ad314c:军神,我在android7.0,cordova8.0.0上安装您的定位插件,通过ionic cordova build android --prod --release来build android app,出现下面的错误,请帮忙看看是否遇到过,万分感谢:

    cp: copyFileSync: could not write to dest file (code=ENOENT):/projectPath/commandApp/platforms/android/res/xml/config.xml

    (node:47746) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ENOENT: no such file or directory, open projectPath/platforms/android/res/xml/config.xml'
    ec8486ad314c:@小军617 谢谢,我试试把cordova版本降级下。。另外,军神,啥时候更新下您http的那篇博客啊,现在angular5之后要使用HttpClient了。。。
    昵称已被使用_:@love_cola 不好意思,我没见过这错误。cordova版本用的是6.5,还没用过8.0
  • 7b53d167ba46:请问博主,地图页面二次进入出现地图不显示,求指教
  • 78b59273581f:定义的LocationPlugin未定义
  • 78b59273581f:你那最快测试里的declare var LocationPlugin; 有什么用 后面面运行的是还是显示引用的未定义错误
  • 78b59273581f:为啥他说LocationPlugin is not defined?
  • 面向秋名山编程:这个DEMO跑不起来,Cannot find module 'tslib' 这个报错如何解决
    昵称已被使用_:@面向秋名山编程 还跑不起来是不是你nodejs版本太低了,起码7.x
    .get('MapSearchHistory')第一次获取肯定是空,搜索成功后才会往里面存数据。
    面向秋名山编程:@小军617 demo还是没跑起来,不过在自己新建的项目里可以用,但是用搜索历史记录的功能时,从this.storage.get('MapSearchHistory')中拿不出任何东西, TypeError: Cannot read property 'id' of null,请问下该如何解决
    昵称已被使用_:重新安装node_modules试试
  • c542a29d055e:楼主您好,请问这个导航是安卓苹果都可用的吗?
    昵称已被使用_:@一息_2326 本文最最后说了为什么会闪退,你检查一下你的插件
    c542a29d055e:@小军617 苹果我用都是好的 ,安卓的话 就是导航闪退 是不是导航那个插件也需要配置key啊
    昵称已被使用_:@一息_2326 都可以
  • EddyWorkHard:大神,为什么我在网页中实现导航能成功,在手机上定位能成功,但是按导航,是空白的?
    昵称已被使用_:@Tsmo 可能是你环境的问题,你更新一下api,cordova使用6.5.0,ionic使用最新
    EddyWorkHard:@小军617 那为什么我下载了你的demo后,打包apk。在模拟器和手机上都加载不出来你的app,一直停留在初始运行界面,和API版本有关吗?我试着用--prod打包,打包也会报错。
    昵称已被使用_:@Tsmo 这我不好回答你
  • 8d9747b91604:你好,我想问下AMap是怎么来的?
    昵称已被使用_:AMap是高德地图,插件是自己封装的.可以参考这里封装插件https://www.jianshu.com/p/5147e11dd14d
  • b5992b6df060:你好!你的github好象下载不了?
  • 6d0e93f23bf5:为什么有些机型安装时不弹出来获取定位权限的提示框,在设置里看的是允许的,但是依然定不了位
  • 6ab9fa5c8fd1:博主,我在你的源码里的config.xml里发现你根本没有写这段代码:<plugin name="com.kit.cordova.amaplocation" spec="https://github.com/yanxiaojun617/com.kit.cordova.amaplocation"; />,但是你这文章里说要加这个?我按你的所有流程做了,但还是LocationPlugin is not defined,是什么原因呢
  • de12d80639ce:返回的json中没有单独的城市~:joy:
  • de12d80639ce:搞出来了~ 发布版获取SHA1路径没写对:joy:
  • de12d80639ce:手机上提示获取未知错误,错误消息:KEY错误,我按照你的替换了key
    <config-file target="AndroidManifest.xml" parent="/manifest/application">
    <meta-data android:name="com.amap.api.v2.apikey" android:value="67c8cb260aea6740bba40d64c0d94bc1"/>
    </config-file>

    <config-file target="AndroidManifest.xml" parent="/manifest/application">
    <meta-data android:name="com.amap.api.v2.apikey" android:value="key">67c8cb260aea6740bba40d64c0d94bc1</meta-data>
    </config-file>

    这里两种配置都试过,报同样的错误!
  • bd2b3d068057:博主,关于手机定位的KEY错误,我一直找不到原因,我按照你另一篇文章:ionic apk打包签名的方式,也查看了keystore的SHA1,也和PackageName都对应得上了,可还是不行
    昵称已被使用_:@9527浪阿浪 继续阅读本文,从头添加key,key错误真的是key错了
  • aeafe975bcf3:楼主感谢分享,我用是你的定位插件,在android下面非常好,但是在ios下面,有2个问题,1提示:THREAD WARNING: ['LocationPlugin'] took '70.552246' ms. Plugin should use a background thread. 我百度没有解决这个问题,
    2.在模拟器下虽然有上面的警告,但是能返回经纬度,而位置信息就不能返回了,position下面没有address这个字段
    请问如何解决?
    昵称已被使用_:@subway7767
    Plugin should use a background thread这个警告也有,但不影响定位
    ios没有返回地址详情,地理反编码参考这里.
    http://lbs.amap.com/api/javascript-api/example/geocoder/regeocoding
    aeafe975bcf3:@小军617 感谢楼主,你在gitbub上有说明,ios用的是苹果自带的定位,主要是在用的时候要警告这个错误:Plugin should use a background thread。你ios返回的是不是只有经纬度,没有街道信息,我需要进行地理反编码,通过经纬度获取街道等信息
    昵称已被使用_:ios定位用不是高德定位sdk.https://github.com/yanxiaojun617/ionic2_tabs/blob/master/plugins/com.kit.cordova.amaplocation/src/ios/LocationPlugin.m

    http://blog.csdn.net/wangqinglei0307/article/details/54632571
  • bd2b3d068057:楼主,LocationPlugin is not define 怎么破
    bd2b3d068057:@小军617 作者你好,com.kit.cordova.amaplocation有限定android版本吗,我build的android @6.1.2的版本,好像地图显示不了。
    bd2b3d068057:@小军617 你好,我跑了你的项目,android6.0.0版本在手机上好像高德地图用不了,有推荐的android版本吗
    昵称已被使用_:@9527浪阿浪 插件没有集成成功,建议下载我的app,https://github.com/yanxiaojun617/ionic2_tabs
    然后使用代码对比工具对比代码https://www.jianshu.com/p/081f7778523e
  • 三点水滴:博主您好!
    我使用了您的插件之后,按照上面所说 将 Android的 appkey 写在plugin.xml中 但是运行 ionic cordova build andorid --release --prod 之后,在/plarforms/android/AndroidManifest.xml中的 <meta-data android:name="com.amap.api.v2.apikey" android:value="这里填您申请的高德地图android key" /> 这里面的key还是没有变成我自己申请的。还请博主帮忙看看。万分感谢:pray: :pray:
    三点水滴:先是自己手动改了博主的插件代码,成功了,但是总觉得不太好。后面翻了之前的评论,找到了解决办法:smiley:
    再次感谢楼主的辛苦工作:+1:
  • 彼岸的一株草:请问下 ,我这边android6.0以上的点击导航都会闪退 以下的可以正常使用。是否有解决方案 。 我这边的权限都有判断 ,没有授权会去授权但是还是会闪退
    彼岸的一株草:@小军617 谢谢 导航可以了
    昵称已被使用_:@e0434f5477c0 建议你在config.xml设置
    <preference name="android-minSdkVersion" value="16" />
    <preference name="android-maxSdkVersion" value="22" />
    <preference name="android-targetSdkVersion" value="22" />
  • d8cf6bdac64e:博主,我用你github上的项目导航也是闪退,自己的项目集成你的插件也是闪退,我也检查了没有包冲突,请问什么原因,实测小米note3
  • 204de2c5fa00:您在map-location上定义了params说是从主页传过来 但是我里面的address没有值,这是为什么?
    昵称已被使用_:@微风513 参数不是必填
  • 204de2c5fa00:@小军617 您好 我想问你一下 您写的searchTextStream: Subject<string> = new Subject<string>();打包报错啊
    昵称已被使用_:@微风513 不清楚原因.我和同事打包都没问题.
  • 雪月_6c67:你好。ionic2定位。declare var LocationPlugin;
    gaodeCmdTest(){
    LocationPlugin.getLocation(data => {
    console.log(JSON.stringify(data))
    }), msg => {
    console.log(JSON.stringify(msg))
    }
    }
    调用该方法 报LocationPlugin 未定义。 请问 是哪里出错了呢
  • cl9000:问下我讲iOS的定位Sdk封成了Cordova插件、但是调用时定位很慢、至少2秒的延迟、为什么
  • 98303316d8b8:博主 LocationPlugin is not defined怎么处理
    98303316d8b8:@小军6 还是不好使,未定义
    昵称已被使用_:@仰望看日出 重装插件.
  • 4da007345a3f:大佬,能不能联系下 我,求指教额。qq
    290558535
  • CHJ_1993:包名和key配置都正确了 还是提示KEY 错误 是什么原因呢?
    CHJ_1993:@小军617 debug包也是错误的啊
    CHJ_1993:@小军617 不是io.ionic.starter 是 com.xxx.zzz之类的
    昵称已被使用_:@CHJ_1993 提示KEY 错误这个提示是高德插件提示的.只能说明你的key真的错误..你的app id是什么?不会是默认的io.ionic.starter吧
  • 洛基閪:你好,我运行了你的APP,ios没问题,就是android时定位会一直提示未授权,现实情况是手机设置已开启定位,APP的定位授权也给了,我想问一下是插件的问题吗?是只适应ios吗?
    204de2c5fa00:您好 我想问您一下 您引用 rxjs 文件时,写searchTextStream: Subject<string> = new Subject<string>();这句话时 打包报错了吗 ??我用的是导航
    昵称已被使用_:你确定app权限给了?
  • JoyoDuan:小军 你好!我加了两个插件,config.xml、plugin.xml、fetch.json三个文件都改了,但是调用出现“ReferenceError: LocationPlugin is not defined”这个错误 这是什么原因呀?
    昵称已被使用_:@JoyoDuan 没毛病了啊....要不再试试ionic cordova platform rm/add android
    JoyoDuan:@小军617 小军 我git和本地两种安装方式都试了 cordova plugin list里也存在插件,cordova platform rm/add android也都执行过,declare var LocationPlugin: any;和declare var cordova: any两种调用方式也尝试了,但还是LocationPlugin/cordova is not defined,这个怎么办啊?还有其他隐藏的什么东东么?
    昵称已被使用_:插件还没安装成功
  • spilledyear:楼主,你好,还有个问题想请教下。我下载了你github上的那个项目 ionic-tabs2 , 我看你在 index.html文件中引入了 高德 web服务的 appkey。但是我自己申请了一个web服务key,却没有用?楼主能 帮忙解释下吗?
    <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.0&key=xxx";></script>
    昵称已被使用_:@spilledyear web定位不准.插件是用gps定位,是调用硬件的
    spilledyear:@小军617 嗯,已经申请了。楼主,我这里还有一点疑问,既然再index.html 里面引入那一段脚本就可以实现定位,那是不是说,只要映入那一段脚本就可以了,可以不引用你写的那两个插件?谢谢
    昵称已被使用_:@spilledyear index.html中的key可以公用..建议你的项目中用你自己申请的key.这样才能在高德控制台看一下统计信息,数据分析等内容..用我的kye,如果我把这个key删了,你项目就用不了.
  • spilledyear:楼主,在 plugin.xml文件中, 我没看到 添加 ios key 的那一行代码啊?我在你 github上的源码上也没发现。
    <preference name=xxx" value="xx"></preference> ? 这行代码自己加上去就可以了吗?
    spilledyear:@小军617 嗯嗯,看到了,是我搞错了,你写了两个插件,我只用了那个定位的插件。
    昵称已被使用_:@spilledyear 看第23行https://github.com/yanxiaojun617/com.kit.cordova.amapnavigation/blob/master/plugin.xml
  • CHJ_1993:一直提示key错误
    CHJ_1993:@小军617 地图是可以显示的 但是导航就没办进行
    CHJ_1993:@小军617 就是按照那个方法获取的
    昵称已被使用_:请阅读本文"获取key"'内容
  • 洛基閪:博主,为什么去ithub下载你的项目打包后不能导航,是不支持android吗?
    昵称已被使用_:@洛基閪 支持的
  • Steven2619:@小军617 我在真机上测试定位插件的时候,报错 提示KEY错误,让我查看错误码说明,这是什么原因呀
    昵称已被使用_:@潇忆之书 申请并配置key,请详细阅读本文
  • kinglike:定位可以,想做地址搜索,为啥提示USERKEY_PLAT_NOMATCH 拿到地址搜索下拉列表和定位不是一个key么?
    昵称已被使用_:@kinglike index.html配置web端key
    kinglike:已解决,地址搜索需要web的key。
  • CHJ_1993:比如 位置转换的 有没有封装进去呢?
    昵称已被使用_:http://lbs.amap.com/api/javascript-api/example/geocoder/geocoding
  • CHJ_1993:楼主你好! 您封装的插件是不是其他功能也封装进去了了 ? 比如搜索附近之类的
    昵称已被使用_:这个看高德javascript api就行了
  • 0159cab95565:高德地图marker 点击事件的监听,可以调其angularjs的函数吗,我试了一下午,不知道有没有什么办法
    昵称已被使用_:@Asanant http://lbs.amap.com/api/javascript-api/reference/overlay#Marker
    昵称已被使用_:@Asanant
    marker.on('click', function (e) {
    //....
    });
  • 清丶虹:博主,请问navigation组件里doNavigation事件里还需要写些什么吗,调用了nativeService里的navigation事件然后subscribe会导致点击导航按钮app闪退,如果不subscribe点击导航就没有反应,求指教。
    昵称已被使用_:@清丶虹 什么标注..没懂
    清丶虹:@小军617 请问下定位用了标注,还可以在地图上显示多个标注吗,按照文档上的写法其它的marker在地图上不显示呢,没有效果。。
    昵称已被使用_:@清丶虹 必须.subscribe才会调用导航事件.至于闪退可能是和其他插件冲突,你先跑我github上的项目试试看是否闪退.
  • Kathy丶Andy:为什么在手机上点击实时导航,和模拟导航自动退出app
    昵称已被使用_:闪退一般是插件plugins/com.kit.cordova.amapnavigation/src/android/libs下的.so文件冲突造成的.目前我只发现与极光推送插件有冲突.
  • Kathy丶Andy:军哥,为什么我这一直显示这个问题啊,我看别人评论也没出现我这种情况,Observable.js:50 Uncaught TypeError: AMap.Geocoder is not a constructor
    Kathy丶Andy: @小军617 那个问题我今天给它解决了,现在问题是,在手机上一开启导航。会自动退出app
    昵称已被使用_:你是不是index.html中的高德地图src链接中没加&plugin=AMap.Geocoder
    看这里第18行.https://github.com/yanxiaojun617/ionic2_tabs/blob/master/src/index.html
  • c542a29d055e:请问ionic3 怎么定位的啊?
    昵称已被使用_:使用定位插件https://github.com/yanxiaojun617/com.kit.cordova.amaplocation
  • brantzzu:经常会出现 Error: Uncaught (in promise): ReferenceError: LocationPlugin is not defined
    定位方法mapLocation写在:ngAfterContentInit() {
    this.loadMap();
    setTimeout(() => {
    if (!this.map) {
    this.loadMap();
    }
    }, 5000);
    this.mapLocation();
    // this.initMarker();
    }
    brantzzu:@小军617 可能是,改成这种写法后就没出现过问题了。
    constructor(public testService: TestService,
    private nativeService: NativeService,
    private navCtrl: NavController,
    private geolocation: Geolocation,
    private modalCtrl: ModalController,
    private platform: Platform
    ) {
    this.tab = this.navCtrl.parent;
    this.platform.ready().then((readySource) => {
    console.log('Platform ready from', readySource);
    this.mapLocation();
    });
    }
    昵称已被使用_:app是不是一启动就立马获取定位,我怀疑是定位插件还没初始化完成导致的.你在第一次获取定位的时候加个延迟,测试一下
  • 841884eaf11c:博主你好 请问这个获取的经纬度是 GPS经纬度 还是高德的经纬度?
    昵称已被使用_:高德的经纬度和你说的GPS经纬度应该是一样的,坐标系都一样,只有百度的不统一
  • LLG1988:ionic cordova build android --prod --release后AndroidManifest.xml重复
    <meta-data android:name="com.amap.api.v2.apikey" android:value="d2bf7fc2e51f6fd2e13038b9a8346f40" />
    <service android:name="com.amap.api.location.APSService" />
    <meta-data android:name="com.amap.api.v2.apikey" android:value="这里填您申请的高德地图android key" />
    LLG1988:config.xml已经配置
    <config-file target="AndroidManifest.xml" parent="/manifest/application">
    <!--您申请的高德地图android key更多详情请看http://www.jianshu.com/p/85aceaee3b35--&gt;
    <meta-data android:name="com.amap.api.v2.apikey" android:value="027953419a4b48b45c476c4e04515ada"/>
    </config-file>
    LLG1988:@小军
  • 删库且跑路:楼主你好: 按照你的方式 测试 ,说 LocationPlugin 未定义
    ERROR ReferenceError: LocationPlugin is not defined
    at LoginPage.webpackJsonp.295.LoginPage.ionViewDidLoad (login.ts:24)
    at ViewController._lifecycle (view-controller.js:566)
    at ViewController._didLoad (view-controller.js:439)
    at NavControllerBase._didLoad (nav-controller-base.js:950)
    at t.invoke (polyfills.js:3)
    at Object.onInvoke (core.es5.js:4149)
    at t.invoke (polyfills.js:3)
    at r.run (polyfills.js:3)
    at NgZone.run (core.es5.js:4017)
    at NavControllerBase._viewAttachToDOM (nav-controller-base.js:592)
    昵称已被使用_:@54b0b2a38147 ...你是不安装了插件,没有cordova plugin rm android
    54b0b2a38147:@小军617 我是用第二种方式安装的
    昵称已被使用_:@StringUtils LocationPlugin 未定义 插件没有安装成功.在认真阅读本文,重新安装一次试试
  • 删库且跑路:你好 在安装定位插件时报错:cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amaplocation --save

    Error: Failed to fetch plugin https://github.com/yanxiaojun617/com.kit.cordova.
    maplocation via registry.
    Probably this is either a connection problem, or plugin spec is incorrect.
    Check your connection and plugin name/version/URL.
    Error: cmd: Command failed with exit code 4294963228 Error output:
    npm ERR! addLocal Could not install C:\Users\ADMINI~1\AppData\Local\Temp\npm-22
    4-7a03c1d9\git-cache-0f0782f8\a6a0fe1484d4f34783b73b40ce9706adc795a436
    npm ERR! Windows_NT 6.1.7601
    npm ERR! argv "D:\\IDE\\nodejs\\node.exe" "D:\\IDE\\nodejs\\node_modules\\npm\\
    in\\npm-cli.js" "install" "https://github.com/yanxiaojun617/com.kit.cordova.ama
    location" "--save"
    npm ERR! node v6.10.3
    npm ERR! npm v3.10.10
    npm ERR! code EISDIR
    npm ERR! errno -4068
    npm ERR! syscall read

    npm ERR! eisdir EISDIR: illegal operation on a directory, read
    npm ERR! eisdir This is most likely not a problem with npm itself
    npm ERR! eisdir and is related to npm not being able to find a package.json in
    npm ERR! eisdir a package you are trying to install.

    npm ERR! Please include the following file with any support request:
    npm ERR! D:\IonicWorkSpace\swc_mobile_project\node_modules\npm-debug.log
    这个是什么原因


    昵称已被使用_:@kinglike 本文我更新了"安装插件方式2:手动安装"请查看
    昵称已被使用_:本文我更新了"安装插件方式2:手动安装"请查看
    kinglike:我也遇到,不知道如何解决。
  • kinglike:最近执行
    cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amaplocation --save

    有提示报错么?为啥我的提示错误,安装不成功。
    昵称已被使用_:本文我更新了"安装插件方式2:手动安装"请查看
  • 1cf8da3cf7c6:插件已经集成了,但是使用导航功能的时候出现错误了,

    规划路径错误:ErrorDomain=AmapNaviErrorDomainCode=3 "CalculateRouteError:3;"
    UserInfo={NsLocalizedDescription=CalculateRouteError:3;}
  • 1cf8da3cf7c6:你好,我在ionic3 中不能添加你的插件,如果用离线添加的话,提示缺少package.json文件。要怎样才能安装呢?
    昵称已被使用_:@HelloWords 下载下来复制进去就行了
  • wang1992:为什么 我照着你的写 在谷歌上总是提示AMap is not defined
    wang1992:@小军617 大哥 有没有完整版的极光推送demo
    wang1992:@小军617 顺便问一下 用ionic2官方的Geolocation 定位,真机调试时 ios端会出现' " /var/contaioners/Bundle/Application/.../index.html”想使用您的位置信息‘ 请问这句话怎样删除,这个好像是导入插件后 运行在手机上自动生成的
    昵称已被使用_:@wang1992 是不是没有在index.html中引入高德地图js,详情看http://www.jianshu.com/p/4de365c55668
  • 99a607dacf31:这个js版的高德地图包没有离线地图,拖动的时候会出现空白,而且已经加载过的地区来回拖动也会出现空白,有什么好的解决方法吗。我问官方了,他们说js的不支持离线,百度的js地图也会空白但感觉上比高德好点。
  • mysticIon:博主你好,请问这个定位可以逆地理编码到物理地址么
    昵称已被使用_:@mysticIon
    用高德javascript api
    http://lbs.amap.com/api/javascript-api/example/geocoder/regeocoding
  • 2e1485ddf5b4:博主 help!
    安装定位和导航插件的时候安不上 老是报错
  • 34cb58e57d35:按照你的教程,做成了,可以实时导航!谢谢!
    Kathy丶Andy:大兄弟,能告诉我为啥会出现这种情况么,Observable.js:50 Uncaught TypeError: AMap.Geocoder is not a constructor
  • b32c506e9345:朋友,请教个问题,高德地图应用管理界面的 发布版sha1码和测试版sha1分别怎么获得的啊,高德给的教程http://lbs.amap.com/faq/top/hot-questions/249,这是给的是获取测试版的sha1码吧
    a30233aa83f8:Typescript Error
    Cannot find module '@ionic-native/file-opener'.
    D:/ionic2_tabs-master/src/app/app.module.ts
    import {FileTransfer} from "@ionic-native/file-transfer";
    import {FileOpener} from '@ionic-native/file-opener';
    import {InAppBrowser} from "@ionic-native/in-app-browser";
    Typescript Error
    Cannot find module '@ionic-native/http'.
    D:/ionic2_tabs-master/src/app/app.module.ts
    import {Diagnostic} from "@ionic-native/diagnostic";
    import {HTTP} from '@ionic-native/http';
    import {NativeService} from "../providers/NativeService";
    Typescript Error
    Module '"D:/ionic2_tabs-master/node_modules/ion2-calendar/dist/index"' has no exported member 'CalendarModalOptions'.
    D:/ionic2_tabs-master/src/pages/demo/calendar-demo/calendar-demo.ts
    import {NativeService} from "../../../providers/NativeService";
    import {CalendarModalOptions, CalendarModal} from 'ion2-calendar'
    Typescript Error
    Module '"D:/ionic2_tabs-master/node_modules/ion2-calendar/dist/index"' has no exported member 'CalendarModal'.
    D:/ionic2_tabs-master/src/pages/demo/calendar-demo/calendar-demo.ts
    import {NativeService} from "../../../providers/NativeService";
    import {CalendarModalOptions, CalendarModal} from 'ion2-calendar'
    Typescript Error
    Cannot find module 'echarts'.
    D:/ionic2_tabs-master/src/pages/demo/echarts-demo/echarts-demo.ts
    import {NavController, NavParams} from 'ionic-angular';
    import ECharts from 'echarts';
    import {NativeService} from "../../../providers/NativeService";
    Typescript Error
    Module '"D:/ionic2_tabs-master/src/model/UserInfo"' has no exported member 'LoginInfo'.
    D:/ionic2_tabs-master/src/pages/login/LoginService.ts
    import {Observable} from "rxjs";
    import {LoginInfo} from "../../model/UserInfo";
    Typescript Error
    Cannot find module '@ionic-native/http'.
    昵称已被使用_: @Architect_ZBX http://www.jianshu.com/p/8b2a9c3a1c07
  • fa7f94d4e78c:楼主你好,我这遇到ios导航的时候闪退问题,该怎么解决
    昵称已被使用_:@想嘟 在同时使用导航插件和极光推送的情况下遇到过闪退,其他情况还没遇到过.解决方法看文章底部http://www.jianshu.com/p/eb8ab29329d9.
    想嘟:闪退解决了吗?我也遇到这个问题了
  • 路灯下站一会:我使用了你的demo 但是定位不准,看代码中没有涉及坐标系的转换,请问是怎么回事?
  • f3fd7ec6d230:写的很好
  • 我必不弃:<preference name="android-maxSdkVersion" value="22"/>
    <preference name="android-targetSdkVersion" value="22"/>

    使用这个打包安装不了
    我必不弃:@小军617 我吧原来的删除了然后在安装,才可以安装
    我必不弃:@小军617 我放到根目录的config.xml这里面,对吗
    昵称已被使用_:这个是没问题的,检查你配置的位置
  • 02e2bac4bfda:博主您好,我想在地图中显示手机定位,可是运行后总是显示错误Cannot find module '@ionic-native/geolocation' ,安装好插件后仍然报同样的错误,我使用的是谷歌的地图(公司要求),不知道怎么解决,请您帮助,万分感谢
    昵称已被使用_:cnpm i @ionic-native/geolocation
  • f3fd7ec6d230:驾车导航点击模拟或者实时导航app就停止运行0.0
    求救啊博主。实在不知道哪里的问题了
    昵称已被使用_:@早安午安晚安_81f7 我估计你是key错误了吧,你先点击定位看可以吗,定位没问题,那key就没问题
    f3fd7ec6d230:@小军617 不会。你的正常运行
    昵称已被使用_:你运行我的app也会停止吗?
  • 890a100e322d:你好,为甚么我编译之后就会在AndroidManifest.xml出现两个mete-data,并且是两个完全不一样的key
    昵称已被使用_:@890a100e322d 插件中的方法安卓和iOS是分开的
    890a100e322d:@小军617 哈哈,已经好了,谢谢您了,和以前的一个地方冲突了。还有一个问题,就是我现在在插件中新加了一个方法,ios中可以同步吗?
    昵称已被使用_:@890a100e322d 只有一个 <meta-data android:name="com.amap.api.v2.apikey" android:value="c803f2312bbbe..." />
  • f3fd7ec6d230:照git上代码一样放在我的app里导航功能的公交和步行都正常,驾车导航不管是模拟还是实时都会显示app已经停止运行,之后退出,不知道是为什么。博主知道原因吗?
    昵称已被使用_:@早安午安晚安_81f7 :pensive: ....
    f3fd7ec6d230:调试好像没报错,只是在停止运行以后有个连接丢失,应该是应用停止运行的关系,没报其他错,很奇怪
    昵称已被使用_:用数据线连接手机和电脑,在chrome调试,看控制台有没有报错.
  • e8e6ab3a2631:博主你好 ,我从github上下载了您的demo,demo能运行起来游览器上没问题,但是真机上高德地图加载不出来。并且android4.0界面都进不去,不知道可有相关思路,十分感谢
    e8e6ab3a2631:@小军617 我加了一个cordova-plugin-crosswalk-webview 插件然后能支持到android 4.1.2了:smiley:
    昵称已被使用_:@Along_0b79 只考虑android4.4+
    e8e6ab3a2631:我刚又试了安卓6.0以上的,地图可有加载了
  • f3fd7ec6d230:我的提示key错误是为什么?然后我发现编译时AndroidManifest.xml里自动添加的是android:value="您申请的高德地图android key",并没有我在插件里设置的那个key,怎么回事?
    昵称已被使用_:@早安午安晚安_81f7 你肯定没配置才会出现value="您申请的高德地图android key",因为配置后你应该要把这句"您申请的高德地图android key"删除
    f3fd7ec6d230:@小军617 配置了呀
    昵称已被使用_:上面内容"配置插件key"你没看到?
  • f3fd7ec6d230:很棒,试一下。还有一个问题,博主知不知道为什么我的app上高德地图没有文字,如何解决?
    f3fd7ec6d230:@小军617 添加了baseRender就可以了,谢谢
    昵称已被使用_:@早安午安晚安_81f7 new AMap.Map('map_container', {
    view: new AMap.View2D({//创建地图二维视口
    zoom: 11 //设置地图缩放级别
    })
    });
    你是不是没有new AMap.View2D?


    也可以这样试试:注意添加了baseRender
    new AMap.Map('map_container', {
    zoom: 11, //设置地图缩放级别
    baseRender:'d'
    });
    昵称已被使用_:@早安午安晚安_81f7 这....不知道....
  • bd007a657f45:web端 JavaScript API 和 平台的SDK在使用上性能有差别吗,不使用JavaScript API ,地图SDK 能封装成插件使用吗?
    昵称已被使用_:@我非上帝 我这里是高德定位和导航;在ionic1项目上直接使用LocationPlugin.getLocation和AMapNavigation.navigation传对应参数就能定位和导航
    我非上帝:博主 这个谷歌定位和导航在ionic1项目中如何使用?谢谢
    昵称已被使用_:@sunvshow 高德地图web端和android端有性能差异吗?高德地图android app不就是封装好的sdk.只是需要再套一层形成cordova插件
  • e312e2e92c68:博主你好,我在ionViewDidEnter的时候直接调用NativeService中的getUserLocation方法,有时候会报错LocationPlugin is not define,好像是插件没有加载上,请教一下这是什么原因呢
    e312e2e92c68:@小军617
    哇哦,博主星期天也在啊,刚才一直在查资料,直接获取定位的代码不能写在ionViewDidEnter里面,应该写在cordova插件就绪以后
    constructor(public platform: Platform, private nativeService: NativeService) {
    this.platform.ready().then((readySource) => {
    console.log('Platform ready from', readySource);
    this.getLocation();
    });
    }

    getLocation() {
    this.nativeService.getUserLocation().then(position =>
    {
    //alert(position);
    //this.map.clearMap();
    this.map = new AMap.Map(this.map_container.nativeElement, {
    view: new AMap.View2D({//创建地图二维视口
    zoom: 11, //设置地图缩放级别
    rotateEnable: true,
    showBuildingBlock: true
    })
    });
    this.map.on('complete', function () {
    //this.getLocation();
    //that.mapIsComplete = true;
    AMap.plugin(['AMap.ToolBar', 'AMap.Scale'], function () {//添加工具条和比例尺
    this.map.addControl(new AMap.ToolBar());
    this.map.addControl(new AMap.Scale());
    });
    });
    window['HomeAMap'] = this.map;
    this.marker = new AMap.Marker({
    map: this.map,
    position: new AMap.LngLat(position['lng'], position['lat'])
    });
    this.map.setFitView();
    this.map.setZoom(16);
    }).catch((error) =>
    {
    alert(error);
    //this.getLocation();
    });
    }

    经过测试应该没问题了

    还有个疑问
    ngOnInit() {
    setTimeout(() => this.loadMap(), 1000);//1秒后加载地图
    let loadNum = 0;
    let interval = setInterval(() => {//10秒后检测地图是否加载成功
    if (!this.map && loadNum < 5) {
    this.loadMap();
    } else {
    clearInterval(interval);
    this.getLocation();
    }
    }, 1000);
    }
    这个循环是什么意思?map回出现初始化错误么?我在本机上没有跑出这个错误来
    昵称已被使用_:https://github.com/yanxiaojun617/ionic2_tabs/
    昵称已被使用_:插件是在app启动的时候就加载了.
    针对你的问题,我写了如下代码并在真机调试,但是没有发现你这个情况,你不妨运行我的app在手机上测试
    ionViewDidEnter() {
    this.nativeService.getUserLocation().then(res=>{
    alert(res['lng']+','+res['lat']);
    },err=>{
    alert(err);
    })
    }
  • 胖子饭店::+1: 受教了
  • 小木___Boy:博主你好,请问插件是怎么封装的呢。使用cordova 封装插件 从而和原生代码和页面交互。
    不知道可有相关资料,十分感谢。
    昵称已被使用_: @小木___Boy 是一样的
    小木___Boy:@小军617 ionIc1 和 ionic2 的插件写法是一样的可是。
    昵称已被使用_:@小木___Boy http://cordova.apache.org/docs/en/3.4.0/guide/hybrid/plugins/index.html#Plugin%20Development%20Guide 这是官方的自定义插件指南,百度也有许多,基本上就是照着cordova已有的插件,照猫画虎
  • 64b2a14de597:写的不错!
    昵称已被使用_: @麒麟公子 ╮ (. ❛ ᴗ ❛.) ╭

本文标题:ionic2实战-封装插件进行精确定位和导航

本文链接:https://www.haomeiwen.com/subject/fsxnwttx.html