美文网首页
编写cordova插件Amap

编写cordova插件Amap

作者: hijoker | 来源:发表于2017-09-15 11:53 被阅读113次

    android

    创建项目

    创建Android项目,添加依赖CordovaLib依赖
    CordovaLib从Ionic项目的platforms/android目录下获得

    编写插件

    创建AmapPlugin.java类继承CordovaPlugin
    代码如下

    package xxx.xxx.xxx;
    
    import com.amap.api.location.AMapLocation;
    import com.amap.api.location.AMapLocationClient;
    import com.amap.api.location.AMapLocationClientOption;
    import com.amap.api.location.AMapLocationListener;
    
    import org.apache.cordova.CallbackContext;
    import org.apache.cordova.CordovaPlugin;
    import org.json.JSONArray;
    import org.json.JSONException;
    
    public class AmapPlugin extends CordovaPlugin{
        private AMapLocationClient locationClient = null;
        private AMapLocationClientOption locationOption = null;
    
        private  CallbackContext callbackContext = null;
    
        @Override
        public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
            if (action.equals("getLocation")) {
                this.callbackContext = callbackContext;
                this.getLocation();
                return true;
            }
            return false;
        }
    
        /**
         * 初始化定位
         *
         * @since 2.8.0
         * @author hongming.wang
         *
         */
        private void initLocation(){
            //初始化client
            locationClient = new AMapLocationClient(cordova.getActivity());
            locationOption = getDefaultOption();
            //设置定位参数
            locationClient.setLocationOption(locationOption);
            // 设置定位监听
            locationClient.setLocationListener(locationListener);
        }
    
        public void getLocation() {
            initLocation();
            // 启动定位
            locationClient.startLocation();
        }
    
        /**
         * 默认的定位参数
         * @since 2.8.0
         * @author hongming.wang
         *
         */
        private AMapLocationClientOption getDefaultOption(){
            AMapLocationClientOption mOption = new AMapLocationClientOption();
            mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
            mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
            mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
            mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
            mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
            mOption.setOnceLocation(true);//可选,设置是否单次定位。默认是false
            mOption.setOnceLocationLatest(true);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
            AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.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) {
                if (null != location) {
    
                    StringBuffer sb = new StringBuffer();
                    //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
                    if(location.getErrorCode() == 0){
                        sb.append("定位成功" + "\n");
                        sb.append("定位类型: " + location.getLocationType() + "\n");
                        sb.append("经    度    : " + location.getLongitude() + "\n");
                        sb.append("纬    度    : " + location.getLatitude() + "\n");
                        sb.append("精    度    : " + location.getAccuracy() + "米" + "\n");
                        sb.append("提供者    : " + location.getProvider() + "\n");
    
                        sb.append("速    度    : " + location.getSpeed() + "米/秒" + "\n");
                        sb.append("角    度    : " + location.getBearing() + "\n");
                        // 获取当前提供定位服务的卫星个数
                        sb.append("星    数    : " + location.getSatellites() + "\n");
                        sb.append("国    家    : " + location.getCountry() + "\n");
                        sb.append("省            : " + location.getProvince() + "\n");
                        sb.append("市            : " + location.getCity() + "\n");
                        sb.append("城市编码 : " + location.getCityCode() + "\n");
                        sb.append("区            : " + location.getDistrict() + "\n");
                        sb.append("区域 码   : " + location.getAdCode() + "\n");
                        sb.append("地    址    : " + location.getAddress() + "\n");
                        sb.append("兴趣点    : " + location.getPoiName() + "\n");
                        //定位完成的时间
                        // sb.append("定位时间: " + Utils.formatUTC(location.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n");
                    } else {
                        //定位失败
                        sb.append("定位失败" + "\n");
                        sb.append("错误码:" + location.getErrorCode() + "\n");
                        sb.append("错误信息:" + location.getErrorInfo() + "\n");
                        sb.append("错误描述:" + location.getLocationDetail() + "\n");
                    }
                    //定位之后的回调时间
                    // sb.append("回调时间: " + Utils.formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n");
    
                    //解析定位结果,
                    String result = sb.toString();
                    callbackContext.success(result);
                } else {
                    callbackContext.error("定位失败,loc is null");
                }
    
                stopLocation();
                destroyLocation();
            }
        };
    
        /**
         * 停止定位
         *
         * @since 2.8.0
         * @author hongming.wang
         *
         */
        private void stopLocation(){
            // 停止定位
            locationClient.stopLocation();
        }
    
        /**
         * 销毁定位
         *
         * @since 2.8.0
         * @author hongming.wang
         *
         */
        private void destroyLocation(){
            if (null != locationClient) {
                /**
                 * 如果AMapLocationClient是在当前Activity实例化的,
                 * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
                 */
                locationClient.onDestroy();
                locationClient = null;
                locationOption = null;
            }
        }
    }
    

    测试通过。

    创建插件目录

    参考:cordova插件编写与使用
    创建插件目录

    AmapPlugin目录
    plugin.xml代码:
    <?xml version='1.0' encoding='utf-8'?>
    <plugin 
        id="cordova-plugin-amap" 
        version="1.0.0" 
        xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
        <name>AmapPlugin</name>
        <js-module name="AmapPlugin" src="www/AmapPlugin.js">
            <clobbers target="AmapPlugin" />
        </js-module>
        <platform name="android">
            <config-file parent="/*" target="res/xml/config.xml">
                <feature name="AmapPlugin">
                    <param name="android-package" value="com.chltec.yoju.AmapPlugin" />
                </feature>
            </config-file>
    
            <!--以下配置完全按照高德的指南进行配置,详见:http://lbs.amap.com/api/android-location-sdk/gettingstarted/-->
            <config-file target="AndroidManifest.xml" parent="/manifest/application">
                <!--在AndroidManifest.xml的application标签中配置Key:-->
                <meta-data android:name="com.amap.api.v2.apikey" android:value="cfb0fd40731561a2c160f4a75116dd67">
                </meta-data>
                <!--在application标签中声明service组件:-->
                <service android:name="com.amap.api.location.APSService"></service>
            </config-file>
    
            <config-file parent="/*" target="AndroidManifest.xml">
                <!--用于进行网络定位-->
                <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
                <!--用于访问GPS定位-->
                <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
                <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
                <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
                <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
                <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
                <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
                <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
                <!--用于访问网络,网络定位需要上网-->
                <uses-permission android:name="android.permission.INTERNET"></uses-permission>
                <!--用于读取手机当前的状态-->
                <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
                <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
                <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
                <!--用于申请调用A-GPS模块-->
                <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
                <!--用于申请获取蓝牙信息进行室内定位-->
                <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
                <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
            </config-file>
    
            <source-file src="src/android/AmapPlugin.java" target-dir="src/com/chltec/yoju" />
            <source-file src="src/android/libs/AMap_Location_V3.5.0.jar" target-dir="libs" />
        </platform>
    </plugin>
    

    插件调用

    ...
    declare var AmapPlugin: any;
    ...
    ...
        AmapPlugin.getLocation('xxx',
        succ=>{
            alert(succ);
        },
        err=>{
            alert(err);
        });
      ...
    
    

    相关文章

      网友评论

          本文标题:编写cordova插件Amap

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