Android?高德地圖POI定位地址搜索功能
先上演示:
高德地圖的key申請這里就不講了,比較簡單,網(wǎng)上有很多資料,或者前往官網(wǎng)查看:官方文檔
依賴引入
項(xiàng)目使用了如下依賴:
//高德地圖 implementation 'com.amap.api:3dmap:latest.integration' //地圖搜索功能 implementation 'com.amap.api:search:latest.integration' //權(quán)限申請 implementation 'com.github.getActivity:XXPermissions:18.3'
配置清單
<!--允許訪問網(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ò)定位,若無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ò)定位,若無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ò)定位,若無gps但仍需實(shí)現(xiàn)定位小藍(lán)點(diǎn)功能則此權(quán)限必選--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!--允許寫入擴(kuò)展存儲,用于數(shù)據(jù)緩存,若無此權(quán)限則寫到私有目錄--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--允許寫設(shè)備緩存,用于問題排查--> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!--允許讀設(shè)備等信息,用于問題排查--> <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******"/>
代碼部分
頁面布局
頁面比較簡單,就是一個輸入框,一個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"> <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ī)接口,不然無法使用
//隱私合規(guī)接口 MapsInitializer.updatePrivacyShow(this,true,true); MapsInitializer.updatePrivacyAgree(this,true);
權(quán)限申請
/** * 權(quán)限請求 **/ 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(); //地圖移動監(jiān)聽 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ā)的地圖移動時,不進(jìn)行逆地理解析 aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(selectBean.getLatitude(),selectBean.getLongitude()))); //設(shè)置地圖中心點(diǎn) } }); //搜索監(jiān)聽 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);//定位一次,且將視角移動到地圖中心點(diǎn)。 aMap.setMyLocationStyle(myLocationStyle);//設(shè)置定位藍(lán)點(diǎn)的Style //設(shè)置縮放級別 aMap.moveCamera(CameraUpdateFactory.zoomTo(15)); // 控件交互 縮放按鈕、指南針、定位按鈕、比例尺等 UiSettings mUiSettings;//定義一個UiSettings對象 mUiSettings = aMap.getUiSettings();//實(shí)例化UiSettings類對象 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位置 } /** * 開始定位 **/ private void startLocation() { try { //獲取位置信息 mLocationClient = new AMapLocationClient(this); }catch (Exception e){ e.printStackTrace(); } //初始化定位參數(shù) AMapLocationClientOption mLocationOption = new AMapLocationClientOption(); //設(shè)置定位監(jiān)聽 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); //啟動定位 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動畫 Point point = aMap.getProjection().toScreenLocation(latLng); point.y -= dip2px(this); LatLng target = aMap.getProjection().fromScreenLocation(point); //使用TranslateAnimation,填寫一個需要移動的目標(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); } // 第一個參數(shù)表示一個Latlng,第二參數(shù)表示范圍多少米,第三個參數(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(); //地圖移動監(jiān)聽 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ā)的地圖移動時,不進(jìn)行逆地理解析 aMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(selectBean.getLatitude(),selectBean.getLongitude()))); //設(shè)置地圖中心點(diǎn) } }); //搜索監(jiān)聽 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)限請求 **/ 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);//定位一次,且將視角移動到地圖中心點(diǎn)。 aMap.setMyLocationStyle(myLocationStyle);//設(shè)置定位藍(lán)點(diǎn)的Style //設(shè)置縮放級別 aMap.moveCamera(CameraUpdateFactory.zoomTo(15)); // 控件交互 縮放按鈕、指南針、定位按鈕、比例尺等 UiSettings mUiSettings;//定義一個UiSettings對象 mUiSettings = aMap.getUiSettings();//實(shí)例化UiSettings類對象 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位置 } /** * 開始定位 **/ private void startLocation() { try { //獲取位置信息 mLocationClient = new AMapLocationClient(this); }catch (Exception e){ e.printStackTrace(); } //初始化定位參數(shù) AMapLocationClientOption mLocationOption = new AMapLocationClientOption(); //設(shè)置定位監(jiān)聽 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); //啟動定位 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動畫 Point point = aMap.getProjection().toScreenLocation(latLng); point.y -= dip2px(this); LatLng target = aMap.getProjection().fromScreenLocation(point); //使用TranslateAnimation,填寫一個需要移動的目標(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); } // 第一個參數(shù)表示一個Latlng,第二參數(shù)表示范圍多少米,第三個參數(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類
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android系統(tǒng)中使用shareuserid獲取系統(tǒng)權(quán)限的教程
這篇文章主要介紹了Android系統(tǒng)中使用shareuserid獲取系統(tǒng)權(quán)限的教程,這樣以來不同的apk就可以互相訪問對應(yīng)的app文件夾,需要的朋友可以參考下2016-04-04Android高版本API方法如何在低版本系統(tǒng)上做兼容性處理淺析
這篇文章主要給大家介紹了關(guān)于Android高版本API方法如何在低版本系統(tǒng)上做兼容性處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Android仿新浪微博自定義ListView下拉刷新(4)
這篇文章主要為大家詳細(xì)介紹了Android仿新浪微博自定義ListView下拉刷新,重點(diǎn)介紹了Adapter的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11基于DownloadManager的簡單下載器編寫小結(jié)
Android自帶的DownloadManager是一個很好的下載文件的工具。該類在API level 9之后出現(xiàn),它已經(jīng)幫我們處理了下載失敗、重新下載等功能,整個下載過程全部交給系統(tǒng)負(fù)責(zé),不需要我們過多的處理,非常的nice。關(guān)鍵的是用起來也很簡單,稍微封裝一下就可以幾句話搞定下載2017-12-12Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫的方法
這篇文章主要介紹了Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12詳解如何在Flutter中用小部件創(chuàng)建響應(yīng)式布局
由于Flutter的跨平臺、單一代碼庫的能力,了解屏幕管理以防止像柔性溢出錯誤或糟糕的用戶界面設(shè)計(jì)這樣的問題是至關(guān)重要的。本文將探討如何用靈活和擴(kuò)展的小部件創(chuàng)建響應(yīng)式布局,需要的可以參考一下2022-02-02Android Studio使用USB真機(jī)調(diào)試詳解
這篇文章主要為大家詳細(xì)介紹了Android Studio使用USB真機(jī)調(diào)試的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05