Android?高德地圖POI定位地址搜索功能
先上演示:

高德地圖的key申請(qǐng)這里就不講了,比較簡(jiǎn)單,網(wǎng)上有很多資料,或者前往官網(wǎng)查看:官方文檔
依賴(lài)引入
項(xiàng)目使用了如下依賴(lài):
//高德地圖
implementation 'com.amap.api:3dmap:latest.integration'
//地圖搜索功能
implementation 'com.amap.api:search:latest.integration'
//權(quán)限申請(qǐng)
implementation 'com.github.getActivity:XXPermissions:18.3'配置清單
<!--允許訪問(wèn)網(wǎng)絡(luò),必選權(quán)限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許獲取粗略位置,若用GPS實(shí)現(xiàn)定位小藍(lán)點(diǎn)功能則必選-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--允許獲取網(wǎng)絡(luò)狀態(tài),用于網(wǎng)絡(luò)定位,若無(wú)gps但仍需實(shí)現(xiàn)定位小藍(lán)點(diǎn)功能則此權(quán)限必選-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許獲取wifi網(wǎng)絡(luò)信息,用于網(wǎng)絡(luò)定位,若無(wú)gps但仍需實(shí)現(xiàn)定位小藍(lán)點(diǎn)功能則此權(quán)限必選-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許獲取wifi狀態(tài)改變,用于網(wǎng)絡(luò)定位,若無(wú)gps但仍需實(shí)現(xiàn)定位小藍(lán)點(diǎn)功能則此權(quán)限必選-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--允許寫(xiě)入擴(kuò)展存儲(chǔ),用于數(shù)據(jù)緩存,若無(wú)此權(quán)限則寫(xiě)到私有目錄-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許寫(xiě)設(shè)備緩存,用于問(wèn)題排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!--允許讀設(shè)備等信息,用于問(wèn)題排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />在application節(jié)點(diǎn)下配置key:
<meta-data android:name="com.amap.api.v2.apikey" android:value="******你的key******"/>
代碼部分
頁(yè)面布局
頁(yè)面比較簡(jiǎn)單,就是一個(gè)輸入框,一個(gè)MapView和一個(gè)ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_search"
android:layout_width="match_parent"
android:layout_height="33dp"
android:layout_marginVertical="15dp"
android:layout_marginHorizontal="10dp"
android:background="@drawable/round_shape"
android:gravity="center"
android:hint="搜索地點(diǎn)"
android:textColorHint="@color/black"
android:imeOptions="actionDone"
android:inputType="text"
android:paddingHorizontal="10dp"
android:textColor="@color/black"
android:textSize="15sp" />
<RelativeLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.amap.api.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
<ListView
android:id="@+id/listView"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>round_shape
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!--圓角半徑-->
<!-- rounded corner -->
<corners android:radius="20dp" />
<!--填充顏色-->
<solid android:color="#C8C8C8" />
</shape>圖片資源:location_center

隱私合規(guī)
新版本在使用高德地圖前都要調(diào)用隱私合規(guī)接口,不然無(wú)法使用
//隱私合規(guī)接口 MapsInitializer.updatePrivacyShow(this,true,true); MapsInitializer.updatePrivacyAgree(this,true);
權(quán)限申請(qǐng)
/**
* 權(quán)限請(qǐng)求
**/
private void permission(){
String[] permission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
permission=new String[]{
Permission.ACCESS_COARSE_LOCATION,
Permission.ACCESS_FINE_LOCATION,
Permission.MANAGE_EXTERNAL_STORAGE,
Permission.READ_PHONE_STATE,
};
}
else {
permission=new String[]{
Permission.ACCESS_COARSE_LOCATION,
Permission.ACCESS_FINE_LOCATION,
Permission.READ_PHONE_STATE,
};
}
XXPermissions.with(this)
.permission(permission).request(new OnPermissionCallback() {
@Override
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
if (allGranted){
initLocation();
startLocation();
}
else {
Toast.makeText(MainActivity.this, "獲取部分權(quán)限成功,但部分權(quán)限未正常授予", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
if (doNotAskAgain){
XXPermissions.startPermissionActivity(MainActivity.this,permissions);
}
else {
Toast.makeText(MainActivity.this, "權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
}
}
});
}初始化
在onCreate進(jìn)行初始化
mMapView=findViewById(R.id.mapView);
ListView listView = findViewById(R.id.listView);
EditText search = findViewById(R.id.et_search);
mMapView.onCreate(savedInstanceState);
aMap=mMapView.getMap();
//地圖移動(dòng)監(jiān)聽(tīng)
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
if (!flag){
if (poiAdapter!=null){
poiAdapter.setSelectPosition(0);
}
try {
getGeocodeSearch(cameraPosition.target);
setMapCenter(cameraPosition.target);
} catch (AMapException e) {
throw new RuntimeException(e);
}
listView.smoothScrollToPosition(0);
}
flag=false;
}
});
permission();
poiAdapter = new PoiAdapter(beanList,this);
listView.setAdapter(poiAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
poiAdapter.setSelectPosition(position);
poiAdapter.notifyDataSetChanged();
selectBean = beanList.get(position);
flag=true;//當(dāng)是點(diǎn)擊地址條目觸發(fā)的地圖移動(dòng)時(shí),不進(jìn)行逆地理解析
aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(selectBean.getLatitude(),selectBean.getLongitude()))); //設(shè)置地圖中心點(diǎn)
}
});
//搜索監(jiān)聽(tīng)
search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(s.toString())){
showTip(s.toString());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});tip搜索
/**
* 搜索tip
**/
private void showTip(String input){
InputtipsQuery inputQuery = new InputtipsQuery(input, city);
Inputtips inputTips = new Inputtips(MainActivity.this, inputQuery);
inputTips.setInputtipsListener(new Inputtips.InputtipsListener() {
@Override
public void onGetInputtips(List<Tip> tipList, int rCode) {
if (rCode == AMapException.CODE_AMAP_SUCCESS) {// 正確返回
if (tipList.size()!=0){
beanList.clear();
for (Tip tip:tipList){
if (tip.getPoint()!=null){
beanList.add(new Bean(tip.getName(),tip.getAddress(),tip.getPoint().getLatitude(),tip.getPoint().getLongitude()));
}
}
poiAdapter.notifyDataSetChanged();
aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(tipList.get(0).getPoint().getLatitude(),tipList.get(0).getPoint().getLongitude()))); //設(shè)置地圖中心點(diǎn)
}
} else {
Toast.makeText(MainActivity.this, String.valueOf(rCode), Toast.LENGTH_SHORT).show();
}
}
});
inputTips.requestInputtipsAsyn();
}定位
/**
* 初始化定位
**/
private void initLocation(){
if (aMap == null) {
aMap = mMapView.getMap();
}
//設(shè)置定位藍(lán)點(diǎn)
MyLocationStyle myLocationStyle;
myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且將視角移動(dòng)到地圖中心點(diǎn)。
aMap.setMyLocationStyle(myLocationStyle);//設(shè)置定位藍(lán)點(diǎn)的Style
//設(shè)置縮放級(jí)別
aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
// 控件交互 縮放按鈕、指南針、定位按鈕、比例尺等
UiSettings mUiSettings;//定義一個(gè)UiSettings對(duì)象
mUiSettings = aMap.getUiSettings();//實(shí)例化UiSettings類(lèi)對(duì)象
mUiSettings.setZoomControlsEnabled(false);
mUiSettings.setMyLocationButtonEnabled(true); //顯示默認(rèn)的定位按鈕
aMap.setMyLocationEnabled(true);// 可觸發(fā)定位并顯示當(dāng)前位置
mUiSettings.setScaleControlsEnabled(true);//控制比例尺控件是否顯示
mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_LEFT);//設(shè)置logo位置
}
/**
* 開(kāi)始定位
**/
private void startLocation() {
try {
//獲取位置信息
mLocationClient = new AMapLocationClient(this);
}catch (Exception e){
e.printStackTrace();
}
//初始化定位參數(shù)
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//設(shè)置定位監(jiān)聽(tīng)
mLocationClient.setLocationListener(this);
//設(shè)置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設(shè)備模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//獲取一次定位結(jié)果
mLocationOption.setOnceLocation(true);
//獲取最近3s內(nèi)精度最高的一次定位結(jié)果
mLocationOption.setOnceLocationLatest(true);
//設(shè)置定位參數(shù)
mLocationClient.setLocationOption(mLocationOption);
//啟動(dòng)定位
mLocationClient.startLocation();
}定位回調(diào)
/**
* 定位回調(diào)
**/
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null && aMapLocation.getErrorCode() == AMapLocation.LOCATION_SUCCESS) {
LatLng latLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
setMapCenter(latLng);
city = aMapLocation.getCity();
aMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); //設(shè)置地圖中心點(diǎn)
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
}地圖中心點(diǎn)
/**
* 設(shè)置中心點(diǎn)
**/
private void setMapCenter(LatLng latLng) {
MarkerOptions markerOptions=new MarkerOptions()
.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(),R.mipmap.location_center)))
.position(latLng);
if (marker!=null){
marker.remove();
}
marker = aMap.addMarker(markerOptions);
//坐標(biāo)系轉(zhuǎn)換,坐標(biāo)信息轉(zhuǎn)換為屏幕的中心點(diǎn)信息
Point markerPoint = aMap.getProjection().toScreenLocation(latLng);
marker.setFixingPointEnable(true);
marker.setPositionByPixels(markerPoint.x, markerPoint.y);
//marker動(dòng)畫(huà)
Point point = aMap.getProjection().toScreenLocation(latLng);
point.y -= dip2px(this);
LatLng target = aMap.getProjection().fromScreenLocation(point);
//使用TranslateAnimation,填寫(xiě)一個(gè)需要移動(dòng)的目標(biāo)點(diǎn)
Animation animation = new TranslateAnimation(target);
animation.setInterpolator(new LinearInterpolator());
long duration = 300;
animation.setDuration(duration);
animation.setInterpolator(new LinearInterpolator());
marker.setAnimation(animation);
marker.startAnimation();
}
/**
* dip和px轉(zhuǎn)換
**/
private static int dip2px(Context context) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) ((float) 30 * scale + 0.5f);
}地理編碼和逆地理編碼
/**
* 逆地理編碼獲取當(dāng)前位置信息
**/
private void getGeocodeSearch(LatLng target) throws AMapException {
if (geocoderSearch == null){
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
}
// 第一個(gè)參數(shù)表示一個(gè)Latlng,第二參數(shù)表示范圍多少米,第三個(gè)參數(shù)表示是火系坐標(biāo)系還是GPS原生坐標(biāo)系
RegeocodeQuery query = new RegeocodeQuery(new LatLonPoint(target.latitude, target.longitude), 500, GeocodeSearch.AMAP);
query.setExtensions("all");
geocoderSearch.getFromLocationAsyn(query);
}
/**
* 地理編碼
**/
private void searchLocation(String address) throws AMapException {
if (geocoderSearch == null){
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
}
GeocodeQuery query=new GeocodeQuery(address,city);
geocoderSearch.getFromLocationNameAsyn(query);
}
/**
* 逆地理編碼回調(diào)
**/
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
if (i != 1000) return;
beanList.clear();
List<PoiItem> poiItems=regeocodeResult.getRegeocodeAddress().getPois();
beanList.add(new Bean("當(dāng)前位置",regeocodeResult.getRegeocodeAddress().getFormatAddress(),regeocodeResult.getRegeocodeQuery().getPoint().getLatitude(),regeocodeResult.getRegeocodeQuery().getPoint().getLongitude()));
if (poiItems.size()!=0){
for (PoiItem poiItem:poiItems){
beanList.add(new Bean(poiItem.getTitle(),poiItem.getSnippet(),poiItem.getLatLonPoint().getLatitude(),poiItem.getLatLonPoint().getLongitude()));
}
poiAdapter.notifyDataSetChanged();
}
}
/**
* 地理編碼回調(diào)
**/
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
if (geocodeResult!=null){
List<GeocodeAddress> geocodeAddressList = geocodeResult.getGeocodeAddressList();
if (geocodeAddressList!=null&&geocodeAddressList.size()!=0){
GeocodeAddress address = geocodeAddressList.get(0);
}
}
}mapView生命周期
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
if (mLocationClient !=null){
mLocationClient.onDestroy();
mLocationClient =null;
}
if (geocoderSearch!=null){
geocoderSearch=null;
}
}MainActivity完整代碼
package com.example.locationselect;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
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.AMapOptions;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.MapsInitializer;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
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.MyLocationStyle;
import com.amap.api.maps.model.animation.Animation;
import com.amap.api.maps.model.animation.TranslateAnimation;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.geocoder.GeocodeAddress;
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.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AMapLocationListener, GeocodeSearch.OnGeocodeSearchListener{
private MapView mMapView;
private AMap aMap;
private AMapLocationClient mLocationClient;
private PoiAdapter poiAdapter;
private final List<Bean> beanList =new ArrayList<>();
private Marker marker;
private String city;
private Bean selectBean;
private GeocodeSearch geocoderSearch;
private boolean flag=false;//條目點(diǎn)擊標(biāo)志位
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//隱私合規(guī)接口
MapsInitializer.updatePrivacyShow(this,true,true);
MapsInitializer.updatePrivacyAgree(this,true);
mMapView=findViewById(R.id.mapView);
ListView listView = findViewById(R.id.listView);
EditText search = findViewById(R.id.et_search);
mMapView.onCreate(savedInstanceState);
aMap=mMapView.getMap();
//地圖移動(dòng)監(jiān)聽(tīng)
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
if (!flag){
if (poiAdapter!=null){
poiAdapter.setSelectPosition(0);
}
try {
getGeocodeSearch(cameraPosition.target);
setMapCenter(cameraPosition.target);
} catch (AMapException e) {
throw new RuntimeException(e);
}
listView.smoothScrollToPosition(0);
}
flag=false;
}
});
permission();
poiAdapter = new PoiAdapter(beanList,this);
listView.setAdapter(poiAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
poiAdapter.setSelectPosition(position);
poiAdapter.notifyDataSetChanged();
selectBean = beanList.get(position);
flag=true;//當(dāng)是點(diǎn)擊地址條目觸發(fā)的地圖移動(dòng)時(shí),不進(jìn)行逆地理解析
aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(selectBean.getLatitude(),selectBean.getLongitude()))); //設(shè)置地圖中心點(diǎn)
}
});
//搜索監(jiān)聽(tīng)
search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(s.toString())){
showTip(s.toString());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* 搜索tip
**/
private void showTip(String input){
InputtipsQuery inputQuery = new InputtipsQuery(input, city);
Inputtips inputTips = new Inputtips(MainActivity.this, inputQuery);
inputTips.setInputtipsListener(new Inputtips.InputtipsListener() {
@Override
public void onGetInputtips(List<Tip> tipList, int rCode) {
if (rCode == AMapException.CODE_AMAP_SUCCESS) {// 正確返回
if (tipList.size()!=0){
beanList.clear();
for (Tip tip:tipList){
if (tip.getPoint()!=null){
beanList.add(new Bean(tip.getName(),tip.getAddress(),tip.getPoint().getLatitude(),tip.getPoint().getLongitude()));
}
}
poiAdapter.notifyDataSetChanged();
aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(tipList.get(0).getPoint().getLatitude(),tipList.get(0).getPoint().getLongitude()))); //設(shè)置地圖中心點(diǎn)
}
} else {
Toast.makeText(MainActivity.this, String.valueOf(rCode), Toast.LENGTH_SHORT).show();
}
}
});
inputTips.requestInputtipsAsyn();
}
/**
* 權(quán)限請(qǐng)求
**/
private void permission(){
String[] permission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
permission=new String[]{
Permission.ACCESS_COARSE_LOCATION,
Permission.ACCESS_FINE_LOCATION,
Permission.MANAGE_EXTERNAL_STORAGE,
Permission.READ_PHONE_STATE,
};
}
else {
permission=new String[]{
Permission.ACCESS_COARSE_LOCATION,
Permission.ACCESS_FINE_LOCATION,
Permission.READ_PHONE_STATE,
};
}
XXPermissions.with(this)
.permission(permission).request(new OnPermissionCallback() {
@Override
public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
if (allGranted){
initLocation();
startLocation();
}
else {
Toast.makeText(MainActivity.this, "獲取部分權(quán)限成功,但部分權(quán)限未正常授予", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
if (doNotAskAgain){
XXPermissions.startPermissionActivity(MainActivity.this,permissions);
}
else {
Toast.makeText(MainActivity.this, "權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
}
}
});
}
/**
* 初始化定位
**/
private void initLocation(){
if (aMap == null) {
aMap = mMapView.getMap();
}
//設(shè)置定位藍(lán)點(diǎn)
MyLocationStyle myLocationStyle;
myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且將視角移動(dòng)到地圖中心點(diǎn)。
aMap.setMyLocationStyle(myLocationStyle);//設(shè)置定位藍(lán)點(diǎn)的Style
//設(shè)置縮放級(jí)別
aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
// 控件交互 縮放按鈕、指南針、定位按鈕、比例尺等
UiSettings mUiSettings;//定義一個(gè)UiSettings對(duì)象
mUiSettings = aMap.getUiSettings();//實(shí)例化UiSettings類(lèi)對(duì)象
mUiSettings.setZoomControlsEnabled(false);
mUiSettings.setMyLocationButtonEnabled(true); //顯示默認(rèn)的定位按鈕
aMap.setMyLocationEnabled(true);// 可觸發(fā)定位并顯示當(dāng)前位置
mUiSettings.setScaleControlsEnabled(true);//控制比例尺控件是否顯示
mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_LEFT);//設(shè)置logo位置
}
/**
* 開(kāi)始定位
**/
private void startLocation() {
try {
//獲取位置信息
mLocationClient = new AMapLocationClient(this);
}catch (Exception e){
e.printStackTrace();
}
//初始化定位參數(shù)
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//設(shè)置定位監(jiān)聽(tīng)
mLocationClient.setLocationListener(this);
//設(shè)置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設(shè)備模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//獲取一次定位結(jié)果
mLocationOption.setOnceLocation(true);
//獲取最近3s內(nèi)精度最高的一次定位結(jié)果
mLocationOption.setOnceLocationLatest(true);
//設(shè)置定位參數(shù)
mLocationClient.setLocationOption(mLocationOption);
//啟動(dòng)定位
mLocationClient.startLocation();
}
/**
* 定位回調(diào)
**/
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null && aMapLocation.getErrorCode() == AMapLocation.LOCATION_SUCCESS) {
LatLng latLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
setMapCenter(latLng);
city = aMapLocation.getCity();
aMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); //設(shè)置地圖中心點(diǎn)
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
}
/**
* 設(shè)置中心點(diǎn)
**/
private void setMapCenter(LatLng latLng) {
MarkerOptions markerOptions=new MarkerOptions()
.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(),R.mipmap.location_center)))
.position(latLng);
if (marker!=null){
marker.remove();
}
marker = aMap.addMarker(markerOptions);
//坐標(biāo)系轉(zhuǎn)換,坐標(biāo)信息轉(zhuǎn)換為屏幕的中心點(diǎn)信息
Point markerPoint = aMap.getProjection().toScreenLocation(latLng);
marker.setFixingPointEnable(true);
marker.setPositionByPixels(markerPoint.x, markerPoint.y);
//marker動(dòng)畫(huà)
Point point = aMap.getProjection().toScreenLocation(latLng);
point.y -= dip2px(this);
LatLng target = aMap.getProjection().fromScreenLocation(point);
//使用TranslateAnimation,填寫(xiě)一個(gè)需要移動(dòng)的目標(biāo)點(diǎn)
Animation animation = new TranslateAnimation(target);
animation.setInterpolator(new LinearInterpolator());
long duration = 300;
animation.setDuration(duration);
animation.setInterpolator(new LinearInterpolator());
marker.setAnimation(animation);
marker.startAnimation();
}
/**
* dip和px轉(zhuǎn)換
**/
private static int dip2px(Context context) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) ((float) 30 * scale + 0.5f);
}
/**
* 逆地理編碼獲取當(dāng)前位置信息
**/
private void getGeocodeSearch(LatLng target) throws AMapException {
if (geocoderSearch == null){
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
}
// 第一個(gè)參數(shù)表示一個(gè)Latlng,第二參數(shù)表示范圍多少米,第三個(gè)參數(shù)表示是火系坐標(biāo)系還是GPS原生坐標(biāo)系
RegeocodeQuery query = new RegeocodeQuery(new LatLonPoint(target.latitude, target.longitude), 500, GeocodeSearch.AMAP);
query.setExtensions("all");
geocoderSearch.getFromLocationAsyn(query);
}
/**
* 地理編碼
**/
private void searchLocation(String address) throws AMapException {
if (geocoderSearch == null){
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
}
GeocodeQuery query=new GeocodeQuery(address,city);
geocoderSearch.getFromLocationNameAsyn(query);
}
/**
* 逆地理編碼回調(diào)
**/
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
if (i != 1000) return;
beanList.clear();
List<PoiItem> poiItems=regeocodeResult.getRegeocodeAddress().getPois();
beanList.add(new Bean("當(dāng)前位置",regeocodeResult.getRegeocodeAddress().getFormatAddress(),regeocodeResult.getRegeocodeQuery().getPoint().getLatitude(),regeocodeResult.getRegeocodeQuery().getPoint().getLongitude()));
if (poiItems.size()!=0){
for (PoiItem poiItem:poiItems){
beanList.add(new Bean(poiItem.getTitle(),poiItem.getSnippet(),poiItem.getLatLonPoint().getLatitude(),poiItem.getLatLonPoint().getLongitude()));
}
poiAdapter.notifyDataSetChanged();
}
}
/**
* 地理編碼回調(diào)
**/
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
if (geocodeResult!=null){
List<GeocodeAddress> geocodeAddressList = geocodeResult.getGeocodeAddressList();
if (geocodeAddressList!=null&&geocodeAddressList.size()!=0){
GeocodeAddress address = geocodeAddressList.get(0);
}
}
}
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
if (mLocationClient !=null){
mLocationClient.onDestroy();
mLocationClient =null;
}
if (geocoderSearch!=null){
geocoderSearch=null;
}
}
}地址適配器
package com.example.locationselect;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class PoiAdapter extends BaseAdapter {
private final List<Bean> poiItemList;
private final Context context;
private int selectPosition=0;
public PoiAdapter(List<Bean> poiItemList, Context context) {
this.poiItemList = poiItemList;
this.context = context;
}
@Override
public int getCount() {
return poiItemList == null ? 0:poiItemList.size();
}
@Override
public Object getItem(int position) {
return poiItemList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_2, parent, false);
holder = new ViewHolder();
holder.text1 = convertView.findViewById(android.R.id.text1);
holder.text2 = convertView.findViewById(android.R.id.text2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Bean bean=poiItemList.get(position);
holder.text1.setText(bean.getName());
holder.text2.setText(bean.getAddress());
if (selectPosition == position){
holder.text1.setTextColor(context.getColor(R.color.green));
holder.text2.setTextColor(context.getColor(R.color.green));
}
else {
holder.text1.setTextColor(context.getColor(R.color.black));
holder.text2.setTextColor(context.getColor(R.color.black));
}
return convertView;
}
public void setSelectPosition(int selectPosition) {
this.selectPosition = selectPosition;
}
static class ViewHolder {
TextView text1,text2;
}
}Bean類(lèi)
package com.example.locationselect;
import java.io.Serializable;
class Bean implements Serializable {
private String name;
private String address;
private double latitude;
private double longitude;
public Bean(String name, String address, double latitude, double longitude) {
this.name = name;
this.address = address;
this.latitude = latitude;
this.longitude = longitude;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
}到此這篇關(guān)于Android 高德地圖POI定位地址搜索的文章就介紹到這了,更多相關(guān)Android 高德地圖地址搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android系統(tǒng)中使用shareuserid獲取系統(tǒng)權(quán)限的教程
這篇文章主要介紹了Android系統(tǒng)中使用shareuserid獲取系統(tǒng)權(quán)限的教程,這樣以來(lái)不同的apk就可以互相訪問(wèn)對(duì)應(yīng)的app文件夾,需要的朋友可以參考下2016-04-04
Android高版本API方法如何在低版本系統(tǒng)上做兼容性處理淺析
這篇文章主要給大家介紹了關(guān)于Android高版本API方法如何在低版本系統(tǒng)上做兼容性處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Android仿新浪微博自定義ListView下拉刷新(4)
這篇文章主要為大家詳細(xì)介紹了Android仿新浪微博自定義ListView下拉刷新,重點(diǎn)介紹了Adapter的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
基于DownloadManager的簡(jiǎn)單下載器編寫(xiě)小結(jié)
Android自帶的DownloadManager是一個(gè)很好的下載文件的工具。該類(lèi)在API level 9之后出現(xiàn),它已經(jīng)幫我們處理了下載失敗、重新下載等功能,整個(gè)下載過(guò)程全部交給系統(tǒng)負(fù)責(zé),不需要我們過(guò)多的處理,非常的nice。關(guān)鍵的是用起來(lái)也很簡(jiǎn)單,稍微封裝一下就可以幾句話搞定下載2017-12-12
Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫(kù)的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12
詳解如何在Flutter中用小部件創(chuàng)建響應(yīng)式布局
由于Flutter的跨平臺(tái)、單一代碼庫(kù)的能力,了解屏幕管理以防止像柔性溢出錯(cuò)誤或糟糕的用戶(hù)界面設(shè)計(jì)這樣的問(wèn)題是至關(guān)重要的。本文將探討如何用靈活和擴(kuò)展的小部件創(chuàng)建響應(yīng)式布局,需要的可以參考一下2022-02-02
Android Studio使用USB真機(jī)調(diào)試詳解
這篇文章主要為大家詳細(xì)介紹了Android Studio使用USB真機(jī)調(diào)試的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

