Android开发之高德地图实现定位,关于Android高德地图的简单开发实例代码

废话不多说了,直接给大家上干货了。

在应用开发中,地图开发是经常需要使用的“组件”,Google
Map虽然有官方教程,无奈用不起来,原因你懂的~~那么国内比较出名的是就是百度地图和高德地图,由于个人喜好,所以选择了高德地图LBS,废话不说,上干货。

以下为初次接触时 ,练手的DEMO

1、注册开发者,创建应用

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.Gravity; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AutoCompleteTextView; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
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 com.amap.api.maps.AMap; 
import com.amap.api.maps.CameraUpdateFactory; 
import com.amap.api.maps.LocationSource; 
import com.amap.api.maps.MapView; 
import com.amap.api.maps.UiSettings; 
import com.amap.api.maps.model.BitmapDescriptorFactory; 
import com.amap.api.maps.model.LatLng; 
import com.amap.api.maps.model.Marker; 
import com.amap.api.maps.model.MarkerOptions; 
import com.amap.api.maps.model.Poi; 
import com.amap.api.maps.overlay.PoiOverlay; 
import com.amap.api.services.core.LatLonPoint; 
import com.amap.api.services.core.PoiItem; 
import com.amap.api.services.core.SuggestionCity; 
import com.amap.api.services.geocoder.GeocodeQuery; 
import com.amap.api.services.geocoder.GeocodeResult; 
import com.amap.api.services.geocoder.GeocodeSearch; 
import com.amap.api.services.geocoder.RegeocodeQuery; 
import com.amap.api.services.geocoder.RegeocodeResult; 
import com.amap.api.services.help.Inputtips; 
import com.amap.api.services.help.InputtipsQuery; 
import com.amap.api.services.help.Tip; 
import com.amap.api.services.poisearch.PoiResult; 
import com.amap.api.services.poisearch.PoiSearch; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
public class BaseMapActivity extends Activity implements 
View.OnClickListener,LocationSource,AMapLocationListener,TextWatcher,Inputtips.InputtipsLi 
stener,AMap.OnMarkerClickListener,PoiSearch.OnPoiSearchListener,AMap.OnPOIClickListener,Ge 
ocodeSearch.OnGeocodeSearchListener{ 
private MapView mapView; 
private AMap aMap; 
private LinearLayout ly_1; 
private Button bt_map; 
private AutoCompleteTextView search_keyword; //输入要搜索的keyword 
private ListView listview; //keyword 监听数据形成的列表 
private ProgressDialog progDialog = null;// 进度条显示 
private LinearLayout ly_2; //ly_1 所包含的布局之一 
private Button bt_back1; 
private ListView history_listview; 
private TextView history_item_tv; 
List<Map<String, Object>> listItem; //输入keyword,数据返回的list数据源 
//====================以下为操作数据库================== 
private ArrayList<HashMap<String, Object>> MapHistoryList; 
//=============地图定位控件============== 
private OnLocationChangedListener mListener; 
private AMapLocationClient mlocationClient; 
private AMapLocationClientOption mLocationOption; 
//=============地图自身UI定义============ 
private UiSettings mUiSettings; 
//=============通用地图控件============== 
private LatLonPoint mLatLonPoint;//初始定位经纬度 
private double ms,me; //经纬度double值 
private String locationAdressName; 
//=============地图POI关键字搜索========== 
private PoiResult poiResult; // poi返回的结果 
private PoiSearch.Query query;// Poi查询条件类 
private PoiSearch poiSearch;// POI搜索 
private static String keyWord = "";// 要输入的poi搜索关键字 
private int currentPage = 0;// 当前页面,从0开始计数 
private Button bt_search; //搜索POI 
private MarkerOptions options; 
//========================以下为地理编码================= 
private GeocodeSearch geocoderSearch; 
private static String addressCityDistric; //得到逆地理编码的 市区 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.base_map_activity); 
mapView = (MapView) findViewById(R.id.map); 
mapView.onCreate(savedInstanceState);// 此方法必须重写 
init(); 
initUi(); 
initHistoryList(); 
} 
/** 
* 初始化AMap对象 
*/ 
private void init() { 
if (aMap == null) { 
aMap = mapView.getMap(); 
setUpMap(); 
} 
} 
/** 
* 设置一些amap的属性 
*/ 
private void setUpMap() { 
aMap.setLocationSource(this);// 设置定位监听 
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示 
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示 
隐藏定位层并不可触发定位,默认是false 
// 设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种 
aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE); 
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(me,ms), 14)); //当前 
地图镜头界面 (让地图在刚进入时就是这个的话,需要先得到LatLng值即可,待后续修正) 
mUiSettings= aMap.getUiSettings(); //实例化地图UI设置 
mUiSettings.setScaleControlsEnabled(true); //比例尺显示 
mUiSettings.setCompassEnabled(false); //指南针不显示 
mLocationOption.setGpsFirst(true); //优先返回GPS定位信息 
aMap.setOnPOIClickListener(this); //POI 点击事件监听 
aMap.setOnMarkerClickListener(this); 
geocoderSearch = new GeocodeSearch(this); 
geocoderSearch.setOnGeocodeSearchListener(this); // 注册地理编码监听 
} 
private void initUi(){ 
ly_1=(LinearLayout)findViewById(R.id.map_2); //地图隐藏掉显示的界面 
bt_map=(Button)findViewById(R.id.map_bt); //首页 按钮 
bt_map.setOnClickListener(this); 
//返回键 
bt_back1=(Button)findViewById(R.id.bt_back_1); 
bt_back1.setOnClickListener(this); 
//keyword 
search_keyword=(AutoCompleteTextView)findViewById(R.id.keyWord); 
search_keyword.addTextChangedListener(this); 
//keyword输入list 
listview=(ListView)findViewById(R.id.map_list); 
//第二页显示 
ly_2=(LinearLayout)findViewById(R.id.history_record); 
//POI 搜索 按钮 
bt_search=(Button)findViewById(R.id.bt_search); 
bt_search.setOnClickListener(this); 
//历史记录 list 
history_listview=(ListView)findViewById(R.id.lv_history); 
history_item_tv=(TextView)findViewById(R.id.history_item_addressName); 
} 
@Override 
public void onClick(View v) { 
switch (v.getId()){ 
case R.id.map_bt: 
bt_map.setVisibility(View.GONE); 
mapView.setVisibility(View.GONE); 
ly_1.setVisibility(View.VISIBLE); 
break; 
case R.id.bt_search: 
// mlocationClient.stopLocation(); 
searchButton(); 
bt_map.setVisibility(View.GONE); 
mapView.setVisibility(View.VISIBLE); 
ly_1.setVisibility(View.VISIBLE); 
listview.setVisibility(View.GONE); 
ly_2.setVisibility(View.GONE); 
break; 
case R.id.bt_back_1: 
aMap.clear(); 
bt_map.setVisibility(View.VISIBLE); 
mapView.setVisibility(View.VISIBLE); 
ly_1.setVisibility(View.GONE); 
break; 
} 
} 
/** 
* 方法必须重写 
*/ 
@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(); 
} 
/** 
* back设置 
* @param keyCode 
* @param event 
* @return 
*/ 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
if (keyCode == KeyEvent.KEYCODE_BACK ) 
{ 
aMap.clear(); 
bt_map.setVisibility(View.VISIBLE); 
mapView.setVisibility(View.VISIBLE); 
ly_1.setVisibility(View.GONE); 
} 
return false; 
} 
//========================================================以下为定位 
=============================================== 
/** 
* 激活定位 
*/ 
@Override 
public void activate(OnLocationChangedListener listener) { 
mListener = listener; 
if (mlocationClient == null) { 
mlocationClient = new AMapLocationClient(this); 
mLocationOption = new AMapLocationClientOption(); 
//设置定位监听 
mlocationClient.setLocationListener(this); 
//设置为高精度定位模式 
mLocationOption.setLocationMode 
(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); 
//设置定位参数 
mlocationClient.setLocationOption(mLocationOption); 
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, 
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用 
stopLocation()方法来取消定位请求 
// 在定位结束后,在合适的生命周期调用onDestroy()方法 
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求, 
定位sdk内部会移除 
mlocationClient.startLocation(); 
} 
} 
/** 
* 停止定位 
*/ 
@Override 
public void deactivate() { 
mListener = null; 
if (mlocationClient != null) { 
mlocationClient.stopLocation(); 
mlocationClient.onDestroy(); 
} 
mlocationClient = null; 
} 
/** 
* 定位成功后回调函数 
*/ 
@Override 
public void onLocationChanged(AMapLocation amapLocation) { 
if (mListener != null && amapLocation != null) { 
if (amapLocation != null 
&& amapLocation.getErrorCode() == 0) { 
mListener.onLocationChanged(amapLocation);// 显示系统小蓝点 
Message msg = mHandler.obtainMessage(); //定位成功后,开始hangler更新经纬 
度 
msg.obj = amapLocation; 
msg.what = Utils.MSG_LOCATION_FINISH; 
mHandler.sendMessage(msg); 
//当前定位后的详细位置(省、市、区、街道信息) 
locationAdressName=amapLocation.getProvider()+amapLocation.getCity 
()+amapLocation.getDistrict()+amapLocation.getAddress(); 
} else { 
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + 
amapLocation.getErrorInfo(); 
Toast.makeText(getApplicationContext(),errText,Toast.LENGTH_SHORT).show(); 
} 
} 
} 
Handler mHandler = new Handler() { 
public void dispatchMessage(android.os.Message msg) { 
switch (msg.what) { 
//开始定位 
case Utils.MSG_LOCATION_START: 
//("正在定位..."); 
break; 
// 定位完成 
case Utils.MSG_LOCATION_FINISH: 
AMapLocation loc = (AMapLocation) msg.obj; 
String result = Utils.getLocationStr(loc); 
// (result); 
ms=Utils.jingdu; 
me=Utils.weidu; 
mLatLonPoint=new LatLonPoint(me,ms); 
break; 
//停止定位 
case Utils.MSG_LOCATION_STOP: 
// ("定位停止"); 
break; 
default: 
break; 
} 
}; 
}; 
//=========================================以下为keyword 改变监听 
=================================== 
@Override 
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
} 
@Override 
public void onTextChanged(CharSequence s, int start, int stop, int count) { 
String newText = s.toString().trim(); 
//在这里判断 是否有输入 
if(s.length()<1){ 
ly_2.setVisibility(View.VISIBLE); 
listview.setVisibility(View.GONE); 
}else 
{ 
ly_2.setVisibility(View.GONE); 
mapView.setVisibility(View.GONE); 
listview.setVisibility(View.VISIBLE); 
} 
if (!AMapUtil.IsEmptyOrNullString(newText)) { 
InputtipsQuery inputquery = new InputtipsQuery(newText, Utils.city); 
Inputtips inputTips = new Inputtips(BaseMapActivity.this, inputquery); 
inputTips.setInputtipsListener(this); //设置=======得到数据监听======= 
inputTips.requestInputtipsAsyn(); 
} 
} 
@Override 
public void afterTextChanged(Editable editable) { 
} 
//=======得到数据监听======= 
@Override 
public void onGetInputtips(List<Tip> tipList, int rCode) { 
if (rCode == 1000) {// 正确返回 
//监听反馈回来的数据当做listView数据源 
listItem=new ArrayList<Map<String,Object>>(); 
for (int i = 0; i < tipList.size(); i++) { 
HashMap<String, Object> map = new HashMap<String, Object>(); 
map.put("mapName",tipList.get(i).getName()); 
map.put("mapAddress",tipList.get(i).getDistrict()); 
map.put("mapPosition",tipList.get(i).getPoint()); 
listItem.add(map); 
} 
listview.setAdapter(new MapListAdapter(this,listItem)); 
//输入时keyword 产生的列表的 item点击事件 
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long 
l) { 
aMap.clear(); 
mlocationClient.stopLocation(); 
LatLonPoint latLonPoint=(LatLonPoint)(listItem.get(i).get 
("mapPosition")); 
Double dd=latLonPoint.getLatitude(); 
Double ee=latLonPoint.getLongitude(); 
options=new MarkerOptions(); 
Marker marker=aMap.addMarker(options.position(new LatLng(dd,ee))); // 
做marker标记 
marker.setVisible(true); 
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dd,ee), 
14));//移动视图 
bt_map.setVisibility(View.GONE); 
mapView.setVisibility(View.VISIBLE); 
ly_1.setVisibility(View.VISIBLE); 
listview.setVisibility(View.GONE); 
ly_2.setVisibility(View.GONE); 
Toast.makeText(getApplicationContext(),""+listItem.get(i).get 
("mapPosition"),Toast.LENGTH_SHORT).show(); 
} 
}); 
} else { 
ToastUtil.showerror(this, rCode); 
} 
} 
//==========================================以下为POI关键字搜索 
===================================================== 
/** 
* 显示进度框 
*/ 
private void showProgressDialog() { 
if (progDialog == null) 
progDialog = new ProgressDialog(this); 
progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
progDialog.setIndeterminate(false); 
progDialog.setCancelable(false); 
progDialog.setMessage("正在搜索:\n" + keyWord); 
progDialog.show(); 
} 
/** 
* 隐藏进度框 
*/ 
private void dissmissProgressDialog() { 
if (progDialog != null) { 
progDialog.dismiss(); 
} 
} 
/** 
* 点击搜索按钮 
*/ 
public void searchButton() { 
keyWord = AMapUtil.checkEditText(search_keyword); 
if ("".equals(keyWord)) { 
ToastUtil.show(BaseMapActivity.this, "请输入搜索关键字"); 
return; 
} else { 
doSearchQuery(); 
if (MapHistoryList.size()>0){ 
for (int i=0;i<MapHistoryList.size();i++){ 
if (keyWord.equals(MapHistoryList.get(i).get("mapHistoryName").toString 
())){ 
return; 
} 
}} 
map_addToHistory(); //增加数据到数据库 
} 
} 
/** 
* 开始进行poi搜索 
*/ 
protected void doSearchQuery() { 
showProgressDialog();// 显示进度框 
mlocationClient.stopLocation(); //停止定位 20160812 
query = new PoiSearch.Query(keyWord, "", Utils.city);// 第一个参数表示搜索字符串第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国) 
query.setPageSize(20);// 设置每页最多返回多少条poiitem 
query.setPageNum(currentPage);// 设置查第一页 
poiSearch = new PoiSearch(this, query); 
poiSearch.setOnPoiSearchListener(this); 
poiSearch.searchPOIAsyn(); 
} 
/** 
* poi没有搜索到数据,返回一些推荐城市的信息 
*/ 
private void showSuggestCity(List<SuggestionCity> cities) { 
String infomation = "推荐城市\n"; 
for (int i = 0; i < cities.size(); i++) { 
infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:" 
+ cities.get(i).getCityCode() + "城市编码:" 
+ cities.get(i).getAdCode() + "\n"; 
} 
ToastUtil.show(BaseMapActivity.this, infomation); 
} 
/** 
* POI信息查询回调方法 
*/ 
@Override 
public void onPoiSearched(PoiResult result, int rCode) { 
dissmissProgressDialog();// 隐藏对话框 
if (rCode == 1000) { 
if (result != null && result.getQuery() != null) {// 搜索poi的结果 
if (result.getQuery().equals(query)) {// 是否是同一条 
poiResult = result; 
// 取得搜索到的poiitems有多少页 
List<PoiItem> poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始 
List<SuggestionCity> suggestionCities = poiResult 
.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息 
if (poiItems != null && poiItems.size() > 0) { 
aMap.clear();// 清理之前的图标 
PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems); 
poiOverlay.removeFromMap(); 
poiOverlay.addToMap(); 
poiOverlay.zoomToSpan(); 
} else if (suggestionCities != null 
&& suggestionCities.size() > 0) { 
showSuggestCity(suggestionCities); 
} else { 
ToastUtil.show(BaseMapActivity.this, 
"无返回结果"); 
} 
} 
} else { 
ToastUtil.show(BaseMapActivity.this, 
"无返回结果"); 
} 
} else { 
ToastUtil.showerror(this, rCode); 
} 
} 
@Override 
public void onPoiItemSearched(PoiItem poiItem, int i) { 
} 
//===================以下为POI 点击事件================ 
@Override 
public void onPOIClick(Poi poi) { 
// aMap.clear(); //暂时去掉 
MarkerOptions markOptiopns = new MarkerOptions(); 
markOptiopns.position(poi.getCoordinate()); 
TextView textView = new TextView(getApplicationContext()); 
textView.setText("到"+poi.getName()+"去"); 
textView.setGravity(Gravity.CENTER); 
textView.setTextColor(Color.BLACK); 
textView.setBackgroundResource(R.drawable.dir1); 
markOptiopns.icon(BitmapDescriptorFactory.fromView(textView)); 
markOptiopns.icon(BitmapDescriptorFactory.defaultMarker()); 
aMap.addMarker(markOptiopns); 
LatLng newLatLng=poi.getCoordinate(); 
Double ss=newLatLng.latitude; 
Double se=newLatLng.longitude; 
// LatLonPoint newLatLonPoint=new LatLonPoint(ss,se); 
getAddress(new LatLonPoint(ss,se)); 
// Toast.makeText(getApplicationContext 
(),"marker"+addressCityDistric,Toast.LENGTH_SHORT).show(); 
} 
//==================以下为 marker 点击事件反馈=================== 
@Override 
public boolean onMarkerClick(Marker marker) { 
Toast.makeText(getApplicationContext(),"marker点击"+marker.getPosition 
()+"--"+marker.getTitle()+"--"+marker.getSnippet(),Toast.LENGTH_SHORT).show(); 
marker.getPosition(); 
return false; 
} 
//========================以下为地理编码以及你地理编码================================ 
/** 
* 响应地理编码 
*/ 
public void getLatlon(final String name) { 
// showDialog(); 
GeocodeQuery query = new GeocodeQuery(name, Utils.city);// 第一个参数表示地址,第 
二个参数表示查询城市,中文或者中文全拼,citycode、adcode, 
geocoderSearch.getFromLocationNameAsyn(query);// 设置同步地理编码请求 
} 
/** 
* 响应逆地理编码 
*/ 
public void getAddress(final LatLonPoint latLonPoint) { 
// showDialog(); 
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, 
GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米, 
第三个参数表示是火系坐标系还是GPS原生坐标系 
geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求 
} 
/** 
* 地理编码查询回调 
*/ 
@Override 
public void onGeocodeSearched(GeocodeResult result, int rCode) { 
// dismissDialog(); 
if (rCode == 1000) { 
if (result != null && result.getGeocodeAddressList() != null 
&& result.getGeocodeAddressList().size() > 0) { 
// GeocodeAddress address = result.getGeocodeAddressList().get(0); 
// aMap.animateCamera(CameraUpdateFactory.newLatLngZoom( 
// AMapUtil.convertToLatLng(address.getLatLonPoint()), 15)); 
// geoMarker.setPosition(AMapUtil.convertToLatLng(address 
// .getLatLonPoint())); 
// addressName = "经纬度值:" + address.getLatLonPoint() + "\n位置描 
述:" 
// + address.getFormatAddress(); 
} 
} else { 
ToastUtil.showerror(this, rCode); 
} 
} 
/** 
* 逆地理编码回调 
*/ 
@Override 
public void onRegeocodeSearched(RegeocodeResult result, int rCode) { 
// dismissDialog(); 
if (rCode == 1000) { 
if (result != null && result.getRegeocodeAddress() != null) { 
addressCityDistric = result.getRegeocodeAddress().getFormatAddress(); 
TextView tv=(TextView)findViewById(R.id.address_name); 
tv.setText(addressCityDistric); 
Log.e("fans",""+addressCityDistric); 
} else { 
ToastUtil.showerror(this, rCode); 
} 
} 
} 
} 
资源文件如下:
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.gaodemap.BaseMapActivity"> 
<Button 
android:id="@+id/map_bt" 
android:layout_width="260dp" 
android:layout_height="40dp" 
android:text="|查地点、搜路线" 
android:layout_marginLeft="10dp" 
android:layout_marginTop="7dp" 
android:background="@android:color/white" 
/> 
<com.amap.api.maps.MapView 
android:id="@+id/map" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 
</com.amap.api.maps.MapView> 
<LinearLayout 
android:id="@+id/ly_address_route" 
android:layout_width="350dp" 
android:layout_height="70dp" 
android:orientation="vertical" 
android:layout_centerHorizontal="true" 
android:layout_marginTop="450dp" 
android:background="@android:color/darker_gray" 
> 
<LinearLayout 
android:layout_width="match_parent" 
android:layout_height="40dp" 
android:orientation="horizontal" 
> 
<TextView 
android:id="@+id/address_name" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1" 
android:gravity="center"/> 
<TextView 
android:id="@+id/xiangqing" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="3" 
android:text="详情" 
android:gravity="center" 
/> 
</LinearLayout> 
<FrameLayout 
android:layout_width="match_parent" 
android:layout_height="1dp" 
android:background="@android:color/black"></FrameLayout> 
<TextView 
android:id="@+id/route_tv" 
android:layout_width="match_parent" 
android:layout_height="29dp" 
android:text="路径规划" 
android:gravity="center"/> 
</LinearLayout> 
<LinearLayout 
android:id="@+id/map_2" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:visibility="gone"> 
<LinearLayout 
android:layout_width="match_parent" 
android:layout_height="60dp" 
android:orientation="horizontal"> 
<Button 
android:id="@+id/bt_back_1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_weight="1" 
android:text="返回"/> 
<AutoCompleteTextView 
android:id="@+id/keyWord" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:hint="请输入关键字" 
android:textSize="14dp" 
android:imeOptions="actionDone" 
android:inputType="text|textAutoComplete" 
android:maxLength="20" 
android:layout_weight="2"/> 
<Button 
android:id="@+id/bt_search" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_weight="1" 
android:text="搜索"/> 
</LinearLayout> 
<ListView 
android:id="@+id/map_list" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:visibility="gone"></ListView> 
<LinearLayout 
android:id="@+id/history_record" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="@android:color/darker_gray" 
> 
<TextView 
android:id="@+id/history_tv" 
android:layout_width="match_parent" 
android:layout_height="50dp" 
android:text="历史记录" 
android:textSize="16dp" 
android:gravity="center" 
/> 
<ListView 
android:id="@+id/lv_history" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_marginTop="10dp"></ListView> 
<TextView 
android:id="@+id/zero_history_tv" 
android:layout_width="match_parent" 
android:layout_height="50dp" 
android:text="清空历史记录" 
android:textSize="16dp" 
android:gravity="center" 
/> 
</LinearLayout> 
</LinearLayout> 
</RelativeLayout> 
代码中相关的工具类,即官方DEMO 中提供的工具类,并没什么改变。。
好了,初步的使用就是这样。
清单文件中相关权限
<!--地图相关权限--> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
<!-- 定位需要的服务 使用2.0的定位需要加上这个 --> 
<service android:name="com.amap.api.location.APSService" ></service> 
申请官方相关key ,根据自己androdi studio 上的sha1值和包名来获取
<meta-data 
android:name="com.amap.api.v2.apikey" 
android:value="xxxxxxxxxxxxxxxxxxxxxxx" /> 

这个几乎是所有开放平台都通用的做法,无外乎注册帐号,成为开发者,然后创建一个Android应用,会为你分配一个key绑定你的服务。

以上所述是小编给大家介绍的关于Android高德地图的简单开发实例代码(DEMO),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

图片 1

您可能感兴趣的文章:

  • Android
    百度地图marker中图片不显示的解决方法(推荐)
  • Android百度地图添加Marker失真问题的解决方案
  • Android中GPS坐标转换为高德地图坐标详解
  • Android开发之高德地图实现定位
  • Android之高德地图定位SDK集成及地图功能实现
  • Android仿微信调用第三方地图应用导航(高德、百度、腾讯)
  • Android
    高德地图之poi搜索功能的实现代码
  • GMap.Net开发之自定义Marker使用方法
  • Android基于高德地图完全自定义Marker的实现方法

注册key.PNG

2、下载SDK,导入jar包,add to library

图片 2

jar包.PNG

第一个是2D地图的jar包,因为最后定位以后我要在地图上标出来位置

第二个是用于定位的jar包

注意:如果使用的是3D地图,那么地图SDK和导航SDK需要引入so库文件,先在app/src/main/目录下新建一个jniLibs目录,将so放到此目录下

3、配置AndroidMainfest.xml文件

<!-- 申请必要的权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<application
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:theme="@style/AppTheme"

  >
  <!--设置key-->
  <meta-data
   android:name="com.amap.api.v2.apikey"
   android:value="这里填写第一步你申请的那个key" />
  <!--声明定位service-->
  <service android:name="com.amap.api.location.APSService"></service>
</application>

4、Activity的布局文件

<com.amap.api.maps2d.MapView
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/map"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" />

很简单,就一个2D的地图

5、Activity,注释非常详细

//监听定位和定位变化
public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener {

 //显示地图需要的变量
 private MapView mapView;//地图控件
 private AMap aMap;//地图对象

 //定位需要的声明
 private AMapLocationClient mLocationClient = null;//定位发起端
 private AMapLocationClientOption mLocationOption = null;//定位参数
 private OnLocationChangedListener mListener = null;//定位监听器

 //标识,用于判断是否只显示一次定位信息和用户重新定位
 private boolean isFirstLoc = true;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  //显示地图
  mapView = (MapView) findViewById(R.id.map);
  //必须要写
  mapView.onCreate(savedInstanceState);
  //获取地图对象
  aMap = mapView.getMap();

  //设置显示定位按钮 并且可以点击
  UiSettings settings = aMap.getUiSettings();
  //设置定位监听
  aMap.setLocationSource(this);
  // 是否显示定位按钮
  settings.setMyLocationButtonEnabled(true);
  // 是否可触发定位并显示定位层
  aMap.setMyLocationEnabled(true);

  //定位的小图标 默认是蓝点 这里自定义一团火,其实就是一张图片
  MyLocationStyle myLocationStyle = new MyLocationStyle();
  myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.firetwo));
  myLocationStyle.radiusFillColor(android.R.color.transparent);
  myLocationStyle.strokeColor(android.R.color.transparent);
  aMap.setMyLocationStyle(myLocationStyle);
  //开始定位
  initLoc();
 }
 //定位
 private void initLoc() {
  //初始化定位
  mLocationClient = new AMapLocationClient(getApplicationContext());
  //设置定位回调监听
  mLocationClient.setLocationListener(this);
  //初始化定位参数
  mLocationOption = new AMapLocationClientOption();
  //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
  mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
  //设置是否返回地址信息(默认返回地址信息)
  mLocationOption.setNeedAddress(true);
  //设置是否只定位一次,默认为false
  mLocationOption.setOnceLocation(false);
  //设置是否强制刷新WIFI,默认为强制刷新
  mLocationOption.setWifiActiveScan(true);
  //设置是否允许模拟位置,默认为false,不允许模拟位置
  mLocationOption.setMockEnable(false);
  //设置定位间隔,单位毫秒,默认为2000ms
  mLocationOption.setInterval(2000);
  //给定位客户端对象设置定位参数
  mLocationClient.setLocationOption(mLocationOption);
  //启动定位
  mLocationClient.startLocation();
 }

 //定位回调函数
 @Override
 public void onLocationChanged(AMapLocation amapLocation) {
  if (amapLocation != null) {
   if (amapLocation.getErrorCode() == 0) {
    //定位成功回调信息,设置相关消息
    amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见官方定位类型表
    amapLocation.getLatitude();//获取纬度
    amapLocation.getLongitude();//获取经度
    amapLocation.getAccuracy();//获取精度信息
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = new Date(amapLocation.getTime());
    df.format(date);//定位时间
    amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
    amapLocation.getCountry();//国家信息
    amapLocation.getProvince();//省信息
    amapLocation.getCity();//城市信息
    amapLocation.getDistrict();//城区信息
    amapLocation.getStreet();//街道信息
    amapLocation.getStreetNum();//街道门牌号信息
    amapLocation.getCityCode();//城市编码
    amapLocation.getAdCode();//地区编码

    // 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置
    if (isFirstLoc) {
     //设置缩放级别
     aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
     //将地图移动到定位点
     aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude())));
     //点击定位按钮 能够将地图的中心移动到定位点
     mListener.onLocationChanged(amapLocation);
     //添加图钉
     aMap.addMarker(getMarkerOptions(amapLocation));
     //获取定位信息
     StringBuffer buffer = new StringBuffer();
     buffer.append(amapLocation.getCountry() + "" + amapLocation.getProvince() + "" + amapLocation.getCity() + "" + amapLocation.getProvince() + "" + amapLocation.getDistrict() + "" + amapLocation.getStreet() + "" + amapLocation.getStreetNum());
     Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();
     isFirstLoc = false;
    }

   } else {
    //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
    Log.e("AmapError", "location Error, ErrCode:"
      + amapLocation.getErrorCode() + ", errInfo:"
      + amapLocation.getErrorInfo());

    Toast.makeText(getApplicationContext(), "定位失败", Toast.LENGTH_LONG).show();
   }
  }
 }

 //自定义一个图钉,并且设置图标,当我们点击图钉时,显示设置的信息
 private MarkerOptions getMarkerOptions(AMapLocation amapLocation) {
   //设置图钉选项
  MarkerOptions options = new MarkerOptions();
  //图标
  options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.fire));
  //位置
  options.position(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude()));
  StringBuffer buffer = new StringBuffer();
  buffer.append(amapLocation.getCountry() + "" + amapLocation.getProvince() + "" + amapLocation.getCity() + "" + amapLocation.getDistrict() + "" + amapLocation.getStreet() + "" + amapLocation.getStreetNum());
  //标题
  options.title(buffer.toString());
  //子标题
  options.snippet("这里好火");
  //设置多少帧刷新一次图片资源
  options.period(60);
  return options;

 }
 //激活定位
 @Override
 public void activate(OnLocationChangedListener listener) {
  mListener = listener;
 }

 //停止定位
 @Override
 public void deactivate() {
  mListener = 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();
 }
}

6、运行程序,点击自定义的 “火” 图钉,效果图如下:

图片 3

Location Result.png

7、长按地图截图并保存图片

Activity实现AMap.OnMapLongClickListener和AMap.OnMapLongClickListener接口,

然后Activity的声明变为:

public class MainActivity extends AppCompatActivity implements AMap.OnMapLongClickListener, AMap.OnMapScreenShotListener, LocationSource, AMapLocationListener

分别实现下列两个的方法

 /**
  * 长按地图进行截屏
  *
  * @param latLng
  */
 @Override
 public void onMapLongClick(LatLng latLng) {

  // 设置截屏监听接口,截取地图可视区域
  // 需要传入一个 AMap.OnMapLongClickListener 接口的实现者
  aMap.getMapScreenShot(this);
 }
 /**
  * 截屏回调方法 保存截图
  */

 @Override
 public void onMapScreenShot(Bitmap bitmap) {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  try {
   // 保存在SD卡根目录下,图片为png格式。
   FileOutputStream fos = new FileOutputStream(
     Environment.getExternalStorageDirectory() + "/test_"
       + sdf.format(new Date()) + ".png");
   boolean b = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
   try {
    fos.flush();
   } catch (IOException e) {
    e.printStackTrace();
   }
   try {
    fos.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   if (b)

    Toast.makeText(MainActivity.this, "截屏成功", Toast.LENGTH_LONG).show();
   else {
    Toast.makeText(MainActivity.this, "截屏失败", Toast.LENGTH_LONG).show();
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }

2016.8.26 补充

有很多简友按照如上过程走下来,发现实现不了我的效果,因此我总结了可能的原因:

1、AndroidMainfest.xml 里一定要将自己申请的key放进去;

2、申请key时有个SHA-1的,千万不能错,错了也不能定位,因为一旦错了,就无法识别是你当前的应用了;

3、如果你使用的是3D的图,务必要将3D的库导进项目,我的案例是2D的;

4、一定要在真机测试。

有无法定位的朋友,请按照上述错误原因来排查。希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

您可能感兴趣的文章:

  • Android
    百度地图marker中图片不显示的解决方法(推荐)
  • Android百度地图添加Marker失真问题的解决方案
  • 关于Android高德地图的简单开发实例代码(DEMO)
  • Android中GPS坐标转换为高德地图坐标详解
  • Android之高德地图定位SDK集成及地图功能实现
  • Android仿微信调用第三方地图应用导航(高德、百度、腾讯)
  • Android
    高德地图之poi搜索功能的实现代码
  • GMap.Net开发之自定义Marker使用方法
  • Android基于高德地图完全自定义Marker的实现方法

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注