在开发的过程中我们更多的是使用别人开发的cordova插件,但是在使用的过程中经常会遇到一些不合自己心意的问题,那么我们就来使用plugman开发一个属于自己的cordova插件吧。
源码地址 : https://github.com/DaiHuaXieHuaKai/GaoDeLocation.git
下面就以开发一个高德地图的定位插件为例:
第一步:检查是否具备开发环境
检查是否有cordova和plugman的环境
分别执行cordova -v和plugman -v查看是否有版本号出现,如果没有安装这两个环境请按照以下步骤安装:
安装crodva和plugman都需要使用nodejs的npm管理工具,所以我们先要安装nodejs,nodejs下载地址,下载安装后执行npm -v出现版本号即安装成功。
安装cordova:
npm install -g cordova
安装plugman:
npm install -g plugman
然后分别执行cordova -v和plugman -v检查是否环境搭建成功。
第二步:使用plugman创建插件模板
//创建插件 (GaoDeLocation为插件名称, com.zhaoying.GaoDeLocation为插件id
plugman create --name GaoDeLocation --plugin_id com.zhaoying.GaoDeLocation--plugin_version 1.0.0
//进入GaoDeLocation 目录
cd GaoDeLocation
//为插件添加android平台(此处只添加了安卓,如果要开发ios插件请执行plugman platform add --platform_name ios)
plugman platform add --platform_name android
模板创建成功后目录格式如下:
第三步:修改配置模板
元素 | 描述 |
---|---|
id | 插件id,创建插件的时候设定,该id可用于添加插件,如:cordova plugin add com.zhaoying.GaoDeLocation |
name | 插件名称 |
js-module | 这里指定clobbers ,然后通过它来调用GaoDeLocation.js,此处应该对应GaoDeLocation.js中exports的对象 |
preference | 指定参数,比如这里设定了API_KEY这个参数,在添加插件的时候就必须加上--variable API_KEY=your key |
config-file | 这里主要是填写一些配置信息,比如高德定位的获取定位权限等等 |
source-file | 用于指定引用的libs的资源和路径 |
1、修改plugin.xml
plugin.xml的配置非常重要,以下是几个重要的地方:
元素 | 描述 |
---|---|
id | 插件id,创建插件的时候设定,该id可用于添加插件,如:cordova plugin add com.zhaoying.GaoDeLocation |
name | 插件名称 |
js-module | 这里指定clobbers ,然后通过它来调用GaoDeLocation.js,此处应该对应GaoDeLocation.js中exports的对象 |
preference | 指定参数,比如这里设定了API_KEY这个参数,在添加插件的时候就必须加上--variable API_KEY=your key |
config-file | 这里主要是填写一些配置信息,比如高德定位的获取定位权限等等 |
source-file | 用于指定引用的libs的资源和路径 |
我们修改后的plugin.xml如下:
GaoDeLocation
此处我们要注意需要将:
修改为:
如果不修改的话会找不到GaoDeLocation.js.
第四步:添加高德SDK,修改GaoDeLocation.js
首先在http://lbs.amap.com/api/android-location-sdk/download/下载需要用到的jar包,这里我们只需要下载定位的jar即可。
下载完成后将其解压,并将jar包引入插件项目,这里需要我们在插件项目中创建一个libs文件夹来放jar包,最终结构如下:
然后我们先要修改GaoDeLocation.js文件,将其修改为:
var exec = require('cordova/exec');
var GaoDe = {
getCurrentPosition:function (successFn,errorFn) {
exec(successFn,errorFn,'GaoDeLocation','getCurrentPosition',[]);
}
};
module.exports = GaoDe;
然后我们需要修改GaoDeLocation.java文件,修改为:(具体的方法可以参照官方demo进行添加或修改)
package com.zhaoying.GaoDeLocation;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;
import com.amap.api.location.AMapLocationListener;
/**
* @author zhaoying
*/
public class GaoDeLocation extends CordovaPlugin {
//声明AMapLocationClient类对象
public AMapLocationClient locationClient = null;
//声明定位参数
public AMapLocationClientOption locationOption = null;
/**
* JS回调接口对象
*/
public static CallbackContext cb = null;
/*
* 程序入口
* */
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("getCurrentPosition")) {
cb = callbackContext;
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true);
cb.sendPluginResult(pluginResult);
this.getCurrentPosition();
return true;
}
return false;
}
/**
* 获取定位
*
* @author zhaoying
*/
private void getCurrentPosition() {
if (locationClient == null) {
this.initLocation();
}
this.startLocation();
}
/**
* 初始化定位
*
* @author zhaoying
*/
private void initLocation() {
//初始化client
locationClient = new AMapLocationClient(this.webView.getContext());
//设置定位参数
locationClient.setLocationOption(getDefaultOption());
// 设置定位监听
locationClient.setLocationListener(locationListener);
}
/**
* 默认的定位参数
*
* @author zhaoying
*/
private AMapLocationClientOption getDefaultOption() {
AMapLocationClientOption mOption = new AMapLocationClientOption();
mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
return mOption;
}
/**
* 定位监听
*/
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
try {
JSONObject json = new JSONObject();
if (null != location) {
//解析定位结果
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
if (location.getErrorCode() == 0) {
json.put("status", "定位成功");
//定位类型
json.put("type", location.getLocationType());
//纬度
json.put("latitude", location.getLatitude());
//经度
json.put("longitude", location.getLongitude());
//精度
json.put("accuracy", location.getAccuracy());
//角度
json.put("bearing", location.getBearing());
// 获取当前提供定位服务的卫星个数
//星数
json.put("satellites", location.getSatellites());
//国家
json.put("country", location.getCountry());
//省
json.put("province", location.getProvince());
//市
json.put("city", location.getCity());
//城市编码
json.put("citycode", location.getCityCode());
//区
json.put("district", location.getDistrict());
//区域码
json.put("adcode", location.getAdCode());
//地址
json.put("address", location.getAddress());
//兴趣点
json.put("poi", location.getPoiName());
//兴趣点
json.put("time", location.getTime());
} else {
json.put("status", "定位失败");
json.put("errcode", location.getErrorCode());
json.put("errinfo", location.getErrorInfo());
json.put("detail", location.getLocationDetail());
}
//定位之后的回调时间
json.put("backtime",System.currentTimeMillis());
} else {
}
PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, json);
pluginResult.setKeepCallback(true);
cb.sendPluginResult(pluginResult);
} catch (JSONException e) {
PluginResult pluginResult = new PluginResult(PluginResult.Status.ERROR, e.getMessage());
pluginResult.setKeepCallback(true);
cb.sendPluginResult(pluginResult);
} finally {
locationClient.stopLocation();
}
}
};
/**
* 开始定位
*
* @author zhaoying
*/
private void startLocation() {
// 启动定位
locationClient.startLocation();
}
/**
* 停止定位
*
* @author zhaoying
*/
private void stopLocation() {
// 停止定位
locationClient.stopLocation();
}
/**
* 销毁定位
*
* @author zhaoying
*/
private void destroyLocation() {
if (null != locationClient) {
/**
* 如果AMapLocationClient是在当前Activity实例化的,
* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
*/
locationClient.onDestroy();
locationClient = null;
locationOption = null;
}
}
}
第五步:添加插件,调用定位
首先新建一个ionic项目(具体方法参照ionic官网文档)
项目新建完成后,添加刚刚新建完成的插件:
cordova plugin add C:\Users\HD\GaoDeLocation --variable API_KEY=yourkey
这里需要用到API_KEY,该key需要在高德地图的控制台去申请,具体参照
添加完成后就可以在页面中调用定位方法了:
GaoDe.getCurrentPosition(function (success) {
console.log(success);
},function (error) {
console.log(error)
})