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)建插件目錄
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);
});
...