【Android 高德地图POI定位地址搜索】

先上演示:
在这里插入图片描述
高德地图的key申请这里就不讲了,比较简单,网上有很多资料,或者前往官网查看:官方文档

依赖引入

项目使用了如下依赖:

    //高德地图implementation 'com.amap.api:3dmap:latest.integration'//地图搜索功能implementation 'com.amap.api:search:latest.integration'//权限申请implementation 'com.github.getActivity:XXPermissions:18.3'

配置清单

	<!--允许访问网络,必选权限--><uses-permission android:name="android.permission.INTERNET" /><!--允许获取粗略位置,若用GPS实现定位小蓝点功能则必选--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--允许获取网络状态,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--允许获取wifi网络信息,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--允许获取wifi状态改变,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!--允许写入扩展存储,用于数据缓存,若无此权限则写到私有目录--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--允许写设备缓存,用于问题排查--><uses-permission android:name="android.permission.WRITE_SETTINGS" /><!--允许读设备等信息,用于问题排查--><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节点下配置key:

<meta-dataandroid:name="com.amap.api.v2.apikey"android:value="******你的key******"/>

代码部分

页面布局

页面比较简单,就是一个输入框,一个MapView和一个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"><EditTextandroid: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="搜索地点"android:textColorHint="@color/black"android:imeOptions="actionDone"android:inputType="text"android:paddingHorizontal="10dp"android:textColor="@color/black"android:textSize="15sp" /><RelativeLayoutandroid:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent"><com.amap.api.maps.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout><ListViewandroid: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
在这里插入图片描述

隐私合规

新版本在使用高德地图前都要调用隐私合规接口,不然无法使用

//隐私合规接口
MapsInitializer.updatePrivacyShow(this,true,true);
MapsInitializer.updatePrivacyAgree(this,true);

权限申请

    /*** 权限请求**/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() {@Overridepublic void onGranted(@NonNull List<String> permissions, boolean allGranted) {if (allGranted){initLocation();startLocation();}else {Toast.makeText(MainActivity.this, "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT).show();}}@Overridepublic void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {if (doNotAskAgain){XXPermissions.startPermissionActivity(MainActivity.this,permissions);}else {Toast.makeText(MainActivity.this, "权限获取失败", Toast.LENGTH_SHORT).show();}}});}

初始化

在onCreate进行初始化

        mMapView=findViewById(R.id.mapView);ListView listView = findViewById(R.id.listView);EditText search = findViewById(R.id.et_search);mMapView.onCreate(savedInstanceState);aMap=mMapView.getMap();//地图移动监听aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {@Overridepublic void onCameraChange(CameraPosition cameraPosition) {}@Overridepublic 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() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {poiAdapter.setSelectPosition(position);poiAdapter.notifyDataSetChanged();selectBean = beanList.get(position);flag=true;//当是点击地址条目触发的地图移动时,不进行逆地理解析aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(selectBean.getLatitude(),selectBean.getLongitude()))); //设置地图中心点}});//搜索监听search.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if (!TextUtils.isEmpty(s.toString())){showTip(s.toString());}}@Overridepublic 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() {@Overridepublic 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()))); //设置地图中心点}} else {Toast.makeText(MainActivity.this, String.valueOf(rCode), Toast.LENGTH_SHORT).show();}}});inputTips.requestInputtipsAsyn();}

定位

    /*** 初始化定位**/private void initLocation(){if (aMap == null) {aMap = mMapView.getMap();}//设置定位蓝点MyLocationStyle myLocationStyle;myLocationStyle = new MyLocationStyle();myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且将视角移动到地图中心点。aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style//设置缩放级别aMap.moveCamera(CameraUpdateFactory.zoomTo(15));// 控件交互 缩放按钮、指南针、定位按钮、比例尺等UiSettings mUiSettings;//定义一个UiSettings对象mUiSettings = aMap.getUiSettings();//实例化UiSettings类对象mUiSettings.setZoomControlsEnabled(false);mUiSettings.setMyLocationButtonEnabled(true); //显示默认的定位按钮aMap.setMyLocationEnabled(true);// 可触发定位并显示当前位置mUiSettings.setScaleControlsEnabled(true);//控制比例尺控件是否显示mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_LEFT);//设置logo位置}/*** 开始定位**/private void startLocation() {try {//获取位置信息mLocationClient = new AMapLocationClient(this);}catch (Exception e){e.printStackTrace();}//初始化定位参数AMapLocationClientOption mLocationOption = new AMapLocationClientOption();//设置定位监听mLocationClient.setLocationListener(this);//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//获取一次定位结果mLocationOption.setOnceLocation(true);//获取最近3s内精度最高的一次定位结果mLocationOption.setOnceLocationLatest(true);//设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}

定位回调

    /*** 定位回调**/@Overridepublic 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)); //设置地图中心点mLocationClient.stopLocation();mLocationClient.onDestroy();}}

地图中心点

    /*** 设置中心点**/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);//坐标系转换,坐标信息转换为屏幕的中心点信息Point markerPoint = aMap.getProjection().toScreenLocation(latLng);marker.setFixingPointEnable(true);marker.setPositionByPixels(markerPoint.x, markerPoint.y);//marker动画Point point =  aMap.getProjection().toScreenLocation(latLng);point.y -= dip2px(this);LatLng target = aMap.getProjection().fromScreenLocation(point);//使用TranslateAnimation,填写一个需要移动的目标点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转换**/private static int dip2px(Context context) {final float scale = context.getResources().getDisplayMetrics().density;return (int) ((float) 30 * scale + 0.5f);}

地理编码和逆地理编码

	/*** 逆地理编码获取当前位置信息**/private void getGeocodeSearch(LatLng target) throws AMapException {if (geocoderSearch == null){geocoderSearch = new GeocodeSearch(this);geocoderSearch.setOnGeocodeSearchListener(this);}// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系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);}/*** 逆地理编码回调**/@Overridepublic void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {if (i != 1000) return;beanList.clear();List<PoiItem> poiItems=regeocodeResult.getRegeocodeAddress().getPois();beanList.add(new Bean("当前位置",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();}}/*** 地理编码回调**/@Overridepublic 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生命周期

    @Overridepublic void onPause() {super.onPause();mMapView.onPause();}@Overridepublic void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected 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;//条目点击标志位@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//隐私合规接口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();//地图移动监听aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {@Overridepublic void onCameraChange(CameraPosition cameraPosition) {}@Overridepublic 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() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {poiAdapter.setSelectPosition(position);poiAdapter.notifyDataSetChanged();selectBean = beanList.get(position);flag=true;//当是点击地址条目触发的地图移动时,不进行逆地理解析aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(selectBean.getLatitude(),selectBean.getLongitude()))); //设置地图中心点}});//搜索监听search.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if (!TextUtils.isEmpty(s.toString())){showTip(s.toString());}}@Overridepublic 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() {@Overridepublic 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()))); //设置地图中心点}} else {Toast.makeText(MainActivity.this, String.valueOf(rCode), Toast.LENGTH_SHORT).show();}}});inputTips.requestInputtipsAsyn();}/*** 权限请求**/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() {@Overridepublic void onGranted(@NonNull List<String> permissions, boolean allGranted) {if (allGranted){initLocation();startLocation();}else {Toast.makeText(MainActivity.this, "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT).show();}}@Overridepublic void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {if (doNotAskAgain){XXPermissions.startPermissionActivity(MainActivity.this,permissions);}else {Toast.makeText(MainActivity.this, "权限获取失败", Toast.LENGTH_SHORT).show();}}});}/*** 初始化定位**/private void initLocation(){if (aMap == null) {aMap = mMapView.getMap();}//设置定位蓝点MyLocationStyle myLocationStyle;myLocationStyle = new MyLocationStyle();myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且将视角移动到地图中心点。aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style//设置缩放级别aMap.moveCamera(CameraUpdateFactory.zoomTo(15));// 控件交互 缩放按钮、指南针、定位按钮、比例尺等UiSettings mUiSettings;//定义一个UiSettings对象mUiSettings = aMap.getUiSettings();//实例化UiSettings类对象mUiSettings.setZoomControlsEnabled(false);mUiSettings.setMyLocationButtonEnabled(true); //显示默认的定位按钮aMap.setMyLocationEnabled(true);// 可触发定位并显示当前位置mUiSettings.setScaleControlsEnabled(true);//控制比例尺控件是否显示mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_LEFT);//设置logo位置}/*** 开始定位**/private void startLocation() {try {//获取位置信息mLocationClient = new AMapLocationClient(this);}catch (Exception e){e.printStackTrace();}//初始化定位参数AMapLocationClientOption mLocationOption = new AMapLocationClientOption();//设置定位监听mLocationClient.setLocationListener(this);//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//获取一次定位结果mLocationOption.setOnceLocation(true);//获取最近3s内精度最高的一次定位结果mLocationOption.setOnceLocationLatest(true);//设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}/*** 定位回调**/@Overridepublic 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)); //设置地图中心点mLocationClient.stopLocation();mLocationClient.onDestroy();}}/*** 设置中心点**/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);//坐标系转换,坐标信息转换为屏幕的中心点信息Point markerPoint = aMap.getProjection().toScreenLocation(latLng);marker.setFixingPointEnable(true);marker.setPositionByPixels(markerPoint.x, markerPoint.y);//marker动画Point point =  aMap.getProjection().toScreenLocation(latLng);point.y -= dip2px(this);LatLng target = aMap.getProjection().fromScreenLocation(point);//使用TranslateAnimation,填写一个需要移动的目标点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转换**/private static int dip2px(Context context) {final float scale = context.getResources().getDisplayMetrics().density;return (int) ((float) 30 * scale + 0.5f);}/*** 逆地理编码获取当前位置信息**/private void getGeocodeSearch(LatLng target) throws AMapException {if (geocoderSearch == null){geocoderSearch = new GeocodeSearch(this);geocoderSearch.setOnGeocodeSearchListener(this);}// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系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);}/*** 逆地理编码回调**/@Overridepublic void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {if (i != 1000) return;beanList.clear();List<PoiItem> poiItems=regeocodeResult.getRegeocodeAddress().getPois();beanList.add(new Bean("当前位置",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();}}/*** 地理编码回调**/@Overridepublic 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);}}}@Overridepublic void onPause() {super.onPause();mMapView.onPause();}@Overridepublic void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected 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;}@Overridepublic int getCount() {return poiItemList == null ? 0:poiItemList.size();}@Overridepublic Object getItem(int position) {return poiItemList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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类

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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第六十八天 APP攻防-XposedFridaHook证书校验反代理代理转发

第68天 APP攻防-Xposed&Frida&Hook&证书校验&反代理&代理转发 知识点&#xff1a; 1、APP防代理绕过-应用&转发 2、APP证书校验类型-单向&双向 3、APP证书校验绕过-Frida&XP框架等 章节点&#xff1a; 1、信息收集-应用&资产提取&权…

Elasticsearch 别名(Aliases)的作用

Elasticsearch 8.4.3 别名&#xff08;Aliases&#xff09; 一. 介绍二. 别名的优势三. 别名的基本操作3.1 创建别名3.2 查询别名关联的索引3.3 删除别名3.4 更新别名3.5 通过别名查询数据 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接…

【Redis学习笔记03】Java客户端

1. 初识Jedis Jedis的官网地址&#xff1a;https://github.com/redis/jedis 1.1 快速入门 使用步骤&#xff1a; 注意&#xff1a;如果是云服务器用户使用redis需要先配置防火墙&#xff01; 引入maven依赖 <dependencies><!-- 引入Jedis依赖 --><dependency&g…

【Crypto | CTF】BugKu 简单的RSA

天命&#xff1a;这题也不算简单了&#xff0c;要反编译&#xff0c;要灵活一点 首先收到pyc文件&#xff0c;拿去反编译出来&#xff0c;可以用在线反编译&#xff0c;也可以用工具反编译 在线&#xff1a;python反编译 - 在线工具 工具&#xff1a;https://download.csdn.n…

[设计模式Java实现附plantuml源码~行为型]算法的封装与切换——策略模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

消息中间件相关介绍

一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&am…

【iOS ARKit】ARWorldMap

ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据&#xff0c;包括地标&#xff08;Landmark&#xff09;、特征点&#xff08;Feature Point&#xff09;、平面&#xff08;Plane&#xff09;等&#xff0c;以及使用者的操作信息&#xff0c;如使用者添加的 ARAnchor …

数据采集设备:安装过程的要点与注意事项

在当今的数据驱动世界&#xff0c;数据采集设备在各行各业中发挥着至关重要的作用。从工业生产到环境监测&#xff0c;再到医疗诊断&#xff0c;数据采集设备为我们提供了大量有价值的信息。然而&#xff0c;要想充分发挥这些设备的潜力&#xff0c;首先需要确保它们被正确地安…

黑马程序员——接口测试——day03

目录&#xff1a; Potman断言 Postman断言简介Postman常用断言 断言响应状态码断言包含某字符串断言JSON数据Postman断言工作原理Postman关联 简介实现步骤核心代码创建环境案例1案例2Postman参数化 简介数据文件简介编写数据文件 CSV文件JSON文件导入数据文件到postman读取数…

啊丢的刷题记录手册(洛谷题单排序篇)

1.洛谷题P1923 求第k小的数 题目描述 输入 n&#xff08;1≤n<5000000 且 n 为奇数&#xff09;个数字ai​&#xff08;1≤ai​<109&#xff09;&#xff0c;输出这些数字的第 k 小的数。最小的数是第 0 小。 请尽量不要使用 nth_element 来写本题&#xff0c;因为本题…

换档控制支架的尺寸优化

前言 本示例使用优化模块&#xff0c;通过在保持原始重量的同时改变壳体厚度&#xff0c;使冲压钣金支架中的应变能之和最小化&#xff08;使刚度最大化&#xff09;。 本页讨论 前言应用描述Abaqus建模方法和仿真技术文件参考 应用描述 本示例说明了汽车变速箱连杆中使用的…

亿道丨三防平板pad丨三防平板是指哪三防丨三防工业级平板电脑

三防工业级平板电脑成为许多行业中的重要工具。本文将介绍三防工业级平板电脑的特点以及其在各个领域中的广泛应用。 三防工业级平板电脑的特点 三防工业级平板电脑是指具备防水、防尘和防震功能的平板电脑。这些特点使得它们能够在恶劣环境中工作&#xff0c;如沙尘飞扬的工地…

sockaddr结构体、sockaddr_in结构体和gethostbyname函数

sockaddr结构体 sockaddr结构体是在网络编程中经常使用的一个数据结构&#xff0c;用来表示套接字地址。它是一个通用的地址结构&#xff0c;可以用于不同的协议&#xff08;如IPv4、IPv6、UNIX等&#xff09;。 在C语言中&#xff0c;sockaddr结构体定义如下&#xff1a; s…

交换两个整数

交换两个整数 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 写⼀个函数Swap&#xff0c;可以交换两个整数的内容。注意必须实现成函数完成。 输入2个整数&#xff0c;调用自定义函数Swap&#xff0c;完成2个整数的…

【HarmonyOS】鸿蒙开发之Stage模型-基本概念——第4.1章

Stage模型-基本概念 名词解释 AbilityStage:应用组件的“舞台“ UIAbility:包含UI界面的应用组件&#xff0c;是系统调度的基本单元 WindowStage:组件内窗口的“舞台“ Window&#xff1a;用来绘制UI页面的窗口 HAP:Harmony Ability Package(鸿蒙能力类型的包) HSP:Harmony Sh…

C++17之折叠表达式

相关文章系列 深入理解可变参数(va_list、std::initializer_list和可变参数模版) 目录 1.介绍 2.应用 2.1.使用折叠表达式 2.2.支持的运算符 2.3.使用折叠处理类型 3.总结 1.介绍 折叠表达式是C17新引进的语法特性。使用折叠表达式可以简化对C11中引入的参数包的处理&…

合泰杯开发板HT66F2390入门教程(点亮LED灯)——获得成就:点灯大师

前言 前不久报名了合泰杯竞赛项目&#xff0c;然后手上也是有一个HT66F2390的开发板&#xff0c;我就打算先从点灯开始&#xff0c;学习一个新的芯片第一步都是先成为点灯大师。 一开始&#xff0c;我在网上搜寻了许多的代码示例&#xff0c;希望能够顺利实现LED的控制。然而&…

LeetCode第七题: 整数反转

题目描述 给你一个 32 位的有符号整数 x​ &#xff0c;返回将 x​ 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1]​ &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 …

铭瑄科技——为星闪技术发展与应用带来新推力

随着智能化生活逐渐普及&#xff0c;无线通信不仅是不仅是信息时代的重要基础设施&#xff0c;而且是推动社会向智能化发展的核心力量之一&#xff0c;其中短距无线通信更是推动未来智能化发展的关键。 为积极推动未来硬件智能化、产业智能化发展&#xff0c;铭瑄正式宣布成为星…

黑马头条-day10

文章目录 app端文章搜索1、文章搜索1.1 ElasticSearch环境搭建1.2 索引库创建①需求分析②ES导入数据场景分析③创建索引和映射 1.3 索引数据同步①app文章历史数据导入ES②文章实时数据导入ES 1.4 文章搜索多条件复合查询①关键词搜索②搜索接口定义 2、搜索历史记录2.1 需求说…