依赖:
implementation 'com.amap.api:3dmap:6.9.2'
implementation 'com.amap.api:location:4.7.0'
implementation 'com.amap.api:search:6.5.0.1'
xml权限
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 用于访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 用于写入缓存数据到扩展存储卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 用于申请调用A-GPS模块 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于申请获取蓝牙信息进行室内定位 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
放到</receiver>下面
<service android:name="com.amap.api.location.APSService"/>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你自己的key"/>
CheckPermissionsActivity
————————————————————————————————————————————————————————
public class CheckPermissionsActivity extends AppCompatActivity
implements
ActivityCompat.OnRequestPermissionsResultCallback {
/**
* 需要进行检测的权限数组
*/
protected String[] needPermissions = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
};
private static final int PERMISSON_REQUESTCODE = 0;
/**
* 判断是否需要检测,防止不停的弹框
*/
private boolean isNeedCheck = true;
@Override
protected void onResume() {
super.onResume();
if(isNeedCheck){
checkPermissions(needPermissions);
}
}
/**
*
* @param
* @since 2.5.0
*
*/
private void checkPermissions(String... permissions) {
List<String> needRequestPermissonList = findDeniedPermissions(permissions);
if (null != needRequestPermissonList
&& needRequestPermissonList.size() > 0) {
ActivityCompat.requestPermissions(this,
needRequestPermissonList.toArray(
new String[needRequestPermissonList.size()]),
PERMISSON_REQUESTCODE);
}
}
/**
* 获取权限集中需要申请权限的列表
*
* @param permissions
* @return
* @since 2.5.0
*
*/
private List<String> findDeniedPermissions(String[] permissions) {
List<String> needRequestPermissonList = new ArrayList<String>();
for (String perm : permissions) {
if (ContextCompat.checkSelfPermission(this,
perm) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.shouldShowRequestPermissionRationale(
this, perm)) {
needRequestPermissonList.add(perm);
}
}
return needRequestPermissonList;
}
/**
* 检测是否说有的权限都已经授权
* @param grantResults
* @return
* @since 2.5.0
*
*/
private boolean verifyPermissions(int[] grantResults) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] paramArrayOfInt) {
if (requestCode == PERMISSON_REQUESTCODE) {
if (!verifyPermissions(paramArrayOfInt)) {
showMissingPermissionDialog();
isNeedCheck = false;
}
}
}
/**
* 显示提示信息
*
* @since 2.5.0
*
*/
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.notifyTitle);
builder.setMessage(R.string.notifyMsg);
// 拒绝, 退出应用
builder.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setPositiveButton(R.string.setting,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
});
builder.setCancelable(false);
builder.show();
}
/**
* 启动应用的设置
*
* @since 2.5.0
*
*/
private void startAppSettings() {
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
————————————————————————————————————————————————————————
自己的Activity
public class Activity extends CheckPermissionsActivity implements
AMap.OnMarkerClickListener,
AMap.OnMapLoadedListener,
AMap.OnMapClickListener,
LocationSource,
AMapLocationListener,
GeocodeSearch.OnGeocodeSearchListener,
AMap.OnCameraChangeListener{
private MapView mMapView;
private AMap mAMap;
private Marker mGPSMarker; //定位位置显示
private AMapLocation location;
private LocationSource.OnLocationChangedListener mListener;
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明mLocationOption对象
public AMapLocationClientOption mLocationOption = null;
//你编码对象
private GeocodeSearch geocoderSearch;
private String actualAddr;
private Double actualLon;
private Double actualLat;
private MarkerOptions markOptions;
private LatLng latLng;
private String addressName;
private TextView tv;
LinearLayout fh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cldw);
mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);// 此方法必须重写
fh=findViewById(R.id.fh);
tv = findViewById(R.id.wz);
initMap();
}
private void initMap() {
fh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
geocoderSearch = new GeocodeSearch(this);
mAMap = mMapView.getMap();
// 设置定位监听
mAMap.setOnMapLoadedListener(this);
mAMap.setOnMarkerClickListener(this);
mAMap.setOnMapClickListener(this);
mAMap.setLocationSource(this);
//设置地图拖动监听
mAMap.setOnCameraChangeListener(this);
geocoderSearch.setOnGeocodeSearchListener(this);
MyLocationStyle myLocationStyle = new MyLocationStyle();
//myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
// myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
// myLocationStyle.anchor(int,int)//设置小蓝点的锚点
//myLocationStyle.strokeWidth(0f);// 设置圆形的边框粗细
//myLocationStyle.anchor(0.5f, 0.7f);
mAMap.setMyLocationStyle(myLocationStyle);
mAMap.moveCamera(CameraUpdateFactory.zoomTo(15)); //缩放比例
//添加一个圆
/* CircleOptions circleOptions = new CircleOptions();
circleOptions.radius(20.0f);
mAMap.addCircle(circleOptions);*/
//设置amap的属性
UiSettings settings = mAMap.getUiSettings();
settings.setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
mAMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
location = aMapLocation;
if (mListener != null && location != null)
{
if (location != null && location.getErrorCode() == 0)
{
mListener.onLocationChanged(location);// 显示系统箭头
LatLng la = new LatLng(location.getLatitude(), location.getLongitude());
setMarket(la, location.getCity(), location.getAddress());
this.actualAddr = location.getAddress();
this.actualLon = location.getLongitude();
this.actualLat = location.getLatitude();
mLocationClient.stopLocation();
// this.location = location;
// 显示导航按钮
// btnNav.setVisibility(View.VISIBLE);
}
}
}
private void setMarket(LatLng latLng, String title, String content) {
if (mGPSMarker != null)
{
mGPSMarker.remove();
}
//获取屏幕宽高
WindowManager wm = this.getWindowManager();
int width = (wm.getDefaultDisplay().getWidth()) / 2;
int height = ((wm.getDefaultDisplay().getHeight()) / 2) - 80;
markOptions = new MarkerOptions();
markOptions.draggable(true);//设置Marker可拖动
markOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.local))).anchor(0.5f, 0.7f);
//设置一个角标
mGPSMarker = mAMap.addMarker(markOptions);
//设置marker在屏幕的像素坐标
mGPSMarker.setPosition(latLng);
// mGPSMarker.setTitle(title);
tv.setText(content);
// mGPSMarker.setSnippet(content);
//设置像素坐标
mGPSMarker.setPositionByPixels(width, height);
if (!TextUtils.isEmpty(content))
{
mGPSMarker.showInfoWindow();
}
mMapView.invalidate();
}
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
latLng=cameraPosition.target;
double latitude= latLng.latitude;
double longitude= latLng.longitude;
Log.e("latitude",latitude+"");
Log.e("longitude",longitude+"");
getAddress(latLng);
}
/**
* 根据经纬度得到地址
*/
public void getAddress(final LatLng latLonPoint) {
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
LatLonPoint latLonPoint1=new LatLonPoint(latLng.latitude,latLng.longitude);
RegeocodeQuery query = new RegeocodeQuery(latLonPoint1, 500, GeocodeSearch.AMAP);
geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
}
@Override
public void onMapClick(LatLng latLng) {
}
@Override
public void onMapLoaded() {
}
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.isInfoWindowShown()) {
marker.hideInfoWindow();
}
else {
marker.showInfoWindow();
}
return false;
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
//初始化定位
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 * 10);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
public void deactivate() {
}
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
if (rCode == 1000) {
if (result != null && result.getRegeocodeAddress() != null
&& result.getRegeocodeAddress().getFormatAddress() != null) {
addressName = result.getRegeocodeAddress().getFormatAddress(); // 逆转地里编码不是每次都可以得到对应地图上的opi
// mAddressEntityFirst = new AddressSearchTextEntity(addressName, addressName, true, convertToLatLonPoint(mFinalChoosePosition));
setMarket(latLng, location.getCity(), addressName);
}
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
protected void onResume() {
super.onResume();
mMapView.onResume();
// aMapEx.onRegister();
}
protected void onPause() {
super.onPause();
mMapView.onPause();
}
protected void onDestroy() {
super.onDestroy();
// 销毁定位
if (mLocationClient != null)
{
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
// if (aMapEx != null) {
// aMapEx.onUnregister();
// }
mMapView.onDestroy();
}
}
————————————————————————————————————————————————————————
activyty_xml
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".cldw.CldwActivity">
<LinearLayout
android:layout_width="@dimen/dp_50"
android:id="@+id/fh"
android:layout_height="@dimen/dp_50">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_15"
android:layout_marginLeft="@dimen/dp_15"
android:src="@mipmap/path" />
</LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/local_car_icon"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/wz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#3b3b3b"
android:textSize="@dimen/sp_16"
android:text="车辆定位"
android:layout_marginTop="@dimen/dp_15"
android:layout_gravity="center"
/>
<com.amap.api.maps.MapView
android:layout_marginTop="@dimen/dp_10"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map">
</com.amap.api.maps.MapView>
</LinearLayout>