編寫cordova插件Amap

android

創(chuàng)建項目

創(chuàng)建Android項目粘室,添加依賴CordovaLib依賴
CordovaLib從Ionic項目的platforms/android目錄下獲得

編寫插件

創(chuàng)建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();
        //設(shè)置定位參數(shù)
        locationClient.setLocationOption(locationOption);
        // 設(shè)置定位監(jiān)聽
        locationClient.setLocationListener(locationListener);
    }

    public void getLocation() {
        initLocation();
        // 啟動定位
        locationClient.startLocation();
    }

    /**
     * 默認的定位參數(shù)
     * @since 2.8.0
     * @author hongming.wang
     *
     */
    private AMapLocationClientOption getDefaultOption(){
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可選呈队,設(shè)置定位模式,可選的模式有高精度、僅設(shè)備、僅網(wǎng)絡(luò)。默認為高精度模式
        mOption.setGpsFirst(false);//可選车遂,設(shè)置是否gps優(yōu)先,只在高精度模式下有效斯辰。默認關(guān)閉
        mOption.setHttpTimeOut(30000);//可選舶担,設(shè)置網(wǎng)絡(luò)請求超時時間。默認為30秒彬呻。在僅設(shè)備模式下無效
        mOption.setInterval(2000);//可選衣陶,設(shè)置定位間隔。默認為2秒
        mOption.setNeedAddress(true);//可選闸氮,設(shè)置是否返回逆地理地址信息剪况。默認是true
        mOption.setOnceLocation(true);//可選,設(shè)置是否單次定位蒲跨。默認是false
        mOption.setOnceLocationLatest(true);//可選译断,設(shè)置是否等待wifi刷新,默認為false.如果設(shè)置為true,會自動變?yōu)閱未味ㄎ换虮掷m(xù)定位時不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可選孙咪, 設(shè)置網(wǎng)絡(luò)請求的協(xié)議⊙灿铮可選HTTP或者HTTPS翎蹈。默認為HTTP
        mOption.setSensorEnable(false);//可選,設(shè)置是否使用傳感器男公。默認是false
        mOption.setWifiScan(true); //可選荤堪,設(shè)置是否開啟wifi掃描。默認為true,如果設(shè)置為false會同時停止主動刷新逞力,停止以后完全依賴于系統(tǒng)刷新曙寡,定位位置可能存在誤差
        mOption.setLocationCacheEnable(true); //可選,設(shè)置是否使用緩存定位寇荧,默認為true
        return mOption;
    }

    /**
     * 定位監(jiān)聽
     */
    AMapLocationListener locationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation location) {
            if (null != location) {

                StringBuffer sb = new StringBuffer();
                //errCode等于0代表定位成功,其他的為定位失敗执隧,具體的可以參照官網(wǎng)定位錯誤碼說明
                if(location.getErrorCode() == 0){
                    sb.append("定位成功" + "\n");
                    sb.append("定位類型: " + location.getLocationType() + "\n");
                    sb.append("經(jīng)    度    : " + 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");
                    // 獲取當前提供定位服務的衛(wèi)星個數(shù)
                    sb.append("星    數(shù)    : " + 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("區(qū)            : " + location.getDistrict() + "\n");
                    sb.append("區(qū)域 碼   : " + 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");
                }
                //定位之后的回調(diào)時間
                // sb.append("回調(diào)時間: " + Utils.formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n");

                //解析定位結(jié)果揩抡,
                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中一定要執(zhí)行AMapLocationClient的onDestroy
             */
            locationClient.onDestroy();
            locationClient = null;
            locationOption = null;
        }
    }
}

測試通過峦嗤。

創(chuàng)建插件目錄

參考:cordova插件編寫與使用
創(chuàng)建插件目錄

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">
            <!--用于進行網(wǎng)絡(luò)定位-->
            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
            <!--用于訪問GPS定位-->
            <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
            <!--獲取運營商信息屋摔,用于支持提供運營商信息相關(guān)的接口-->
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
            <!--用于訪問wifi網(wǎng)絡(luò)信息烁设,wifi信息會用于進行網(wǎng)絡(luò)定位-->
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
            <!--這個權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會用來進行網(wǎng)絡(luò)定位-->
            <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
            <!--用于訪問網(wǎng)絡(luò)钓试,網(wǎng)絡(luò)定位需要上網(wǎng)-->
            <uses-permission android:name="android.permission.INTERNET"></uses-permission>
            <!--用于讀取手機當前的狀態(tài)-->
            <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
            <!--寫入擴展存儲装黑,向擴展卡寫入數(shù)據(jù),用于寫入緩存定位數(shù)據(jù)-->
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
            <!--用于申請調(diào)用A-GPS模塊-->
            <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
            <!--用于申請獲取藍牙信息進行室內(nèi)定位-->
            <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>

插件調(diào)用

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胳搞,一起剝皮案震驚了整個濱河市蛀蜜,隨后出現(xiàn)的幾起案子话浇,更是在濱河造成了極大的恐慌,老刑警劉巖疚颊,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異信认,居然都是意外死亡材义,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門嫁赏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來其掂,“玉大人,你說我怎么就攤上這事橄教∏蹇埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵护蝶,是天一觀的道長华烟。 經(jīng)常有香客問我,道長持灰,這世上最難降的妖魔是什么盔夜? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上喂链,老公的妹妹穿的比我還像新娘返十。我一直安慰自己,他們只是感情好椭微,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布洞坑。 她就那樣靜靜地躺著,像睡著了一般蝇率。 火紅的嫁衣襯著肌膚如雪迟杂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天本慕,我揣著相機與錄音排拷,去河邊找鬼。 笑死锅尘,一個胖子當著我的面吹牛监氢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藤违,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浪腐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纺弊?” 一聲冷哼從身側(cè)響起牛欢,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淆游,沒想到半個月后傍睹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡犹菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年拾稳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腊脱。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡访得,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陕凹,到底是詐尸還是另有隱情悍抑,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布杜耙,位于F島的核電站搜骡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佑女。R本人自食惡果不足惜记靡,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一谈竿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摸吠,春花似錦空凸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轿腺,卻和暖如春两嘴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背族壳。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趣些,地道東北人仿荆。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像坏平,于是被迫代替她去往敵國和親拢操。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • 導語 這篇文章主要介紹了如何在Android平臺上使用Cordova 的command-line interfac...
    jorstinchan閱讀 22,606評論 6 41
  • @所有人舶替,踏入結(jié)束一令境、二階課程的第二天,再次回想去年九月第一次參加三階結(jié)束不久后進入16期實踐計劃的情形顾瞪,記得那時...
    劉健虹閱讀 1,199評論 6 1
  • 今天要做的事情舔庶,等到明天,明天玩做的事情陈醒,等到后天惕橙,日復一日,無論多小的目標钉跷,我們一個都沒能完成弥鹦,拖延是一個萬丈深...
    一杯電影閱讀 145評論 0 0
  • @Jean是小貓咪 :3 今天午睡的時候,做了一個夢——夢見了一場自己的婚禮爷辙。 其實彬坏,夢見婚禮的次數(shù)并不在少數(shù)。有...
    Jean是小貓咪閱讀 602評論 0 1