我們在項目中經(jīng)常會用到地圖定位功能蚀浆,位置搜索和打點功能缀程。
這里會用兩篇文章來跟大家介紹如何從在項目中使用高德地圖。
第一步:獲取鑰匙key
http://lbs.amap.com/api/android-sdk/guide/create-project/get-key 高德API官網(wǎng)中獲取一個key
具體操作請在官網(wǎng)中查看詳情市俊,有什么問題可以在評論或者聯(lián)系QQ杨凑。
第二步:導(dǎo)入jar包、so文件
直接把下載的整個包拷進libs文件夾里摆昧。
附上下載地址 http://lbs.amap.com/api/android-sdk/download
第三步:配置gradle
1.在Project的gradle中添加
allprojects { repositories { jcenter() // 或者 mavenCentral() } }
如果已存在則不做處理撩满。
2.在module的gradle中添加
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
compile files('libs/AMap3DMap_4.1.3_AMapLocation_3.3.0_20170118.jar')
compile files('libs/AMap_Search_V4.0.0_20170111.jar') //這里是剛才libs文件中的兩個jar包
3.在AndroidManifest.xml中配置權(quán)限:
//地圖包、搜索包需要的基礎(chǔ)權(quán)限
<!--允許程序打開網(wǎng)絡(luò)套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設(shè)置內(nèi)置sd卡的寫權(quán)限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網(wǎng)絡(luò)狀態(tài)-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網(wǎng)絡(luò)信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機狀態(tài)和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允許程序訪問CellID或WiFi熱點來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="請輸入您的用戶Key"/>
……
</application>
最后一步也就是用到我們最開始申請的Key的時候了.
到這里就完成了所有配置绅你,我們可以開始代碼了伺帘。
代碼塊
Xml布局中:
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Activity中:
public class AddressMapActivity extends FragmentActivity implements LocationSource,
AMapLocationListener{
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);// 此方法必須重寫
/**
* 初始化AMap對象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
setUpMap();
//aMap.setOnMapClickListener(this); //不讓點擊
aMap.setOnCameraChangeListener(this);
}
}
/**
* 設(shè)置一些amap的屬性
*/
private void setUpMap() {
// 自定義系統(tǒng)定位小藍點
MyLocationStyle myLocationStyle = new MyLocationStyle();
/* myLocationStyle.myLocationIcon(BitmapDescriptorFactory
.fromResource(R.mipmap.icon_gcoding));// 設(shè)置小藍點的圖標(biāo)*/
myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));// 設(shè)置圓形的邊框顏色
myLocationStyle.radiusFillColor(Color.argb(57, 17, 0, 5));// 設(shè)置圓形的填充顏色
myLocationStyle.strokeWidth(0f);// 設(shè)置圓形的邊框粗細(xì)
// myLocationStyle.anchor(int,int)//設(shè)置小藍點的錨點
// getMap().setLatLonQuanVisible(false);
aMap.getUiSettings().setCompassEnabled(false);
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 設(shè)置定位監(jiān)聽
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設(shè)置默認(rèn)定位按鈕是否顯示
aMap.setMyLocationEnabled(true);// 設(shè)置為true表示顯示定位層并可觸發(fā)定位,false表示隱藏定位層并不可觸發(fā)定位忌锯,默認(rèn)是false
//aMap.setMyLocationType();
}
/**
* 定位成功后回調(diào)函數(shù)
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
/*開啟定位時*/
&& amapLocation.getErrorCode() == 0) {
isHandDrag = false;
mListener.onLocationChanged(amapLocation);// 顯示系統(tǒng)小藍點
latitude = amapLocation.getLatitude();
longitude = amapLocation.getLongitude();
//city = amapLocation.getCity();
mlocationClient.stopLocation();
lat = new LatLonPoint(latitude, longitude);
mUpdata = CameraUpdateFactory.newCameraPosition(
//15是縮放比例伪嫁,0是傾斜度,30顯示比例
new CameraPosition(new LatLng(lat.getLatitude(), lat.getLongitude()), 17, 0, 30));
aMap.moveCamera(mUpdata);
}
}
/**
* 激活定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//設(shè)置定位監(jiān)聽
mlocationClient.setLocationListener(this);
//設(shè)置為高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//設(shè)置定位參數(shù)
mlocationClient.setLocationOption(mLocationOption);
// 此方法為每隔固定時間會發(fā)起一次定位請求偶垮,為了減少電量消耗或網(wǎng)絡(luò)流量消耗张咳,
// 注意設(shè)置合適的定位時間的間隔(最小間隔支持為2000ms),并且在合適時間調(diào)用stopLocation()方法來取消定位請求
// 在定位結(jié)束后似舵,在合適的生命周期調(diào)用onDestroy()方法
// 在單次定位情況下脚猾,定位無論成功與否,都無需調(diào)用stopLocation()方法移除請求砚哗,定位sdk內(nèi)部會移除
mlocationClient.startLocation();
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
/**
* 方法必須重寫
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必須重寫
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必須重寫
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
if (null != mlocationClient) {
mlocationClient.onDestroy();
}
}
}
以上就是一些定位的核心代碼龙助。基本都貼出來了蛛芥,等下一篇寫完后會有完整的demo貼上來的泌参。趕緊試試定位吧。本次功能效果圖
下篇文章會講到poi搜索(附近的位置搜索)常空,逆地理編碼(經(jīng)緯度轉(zhuǎn)具體地址)沽一,大家稍等,先貼出效果圖!
多謝耐心看完漓糙,大家相互學(xué)習(xí)铣缠,有什么問題及時溝通。
以上。