1.导入SDK
链接:https://pan.baidu.com/s/1vdoPXmsZ4CuVfV_J144zuw 密码:fvv2
里面有定位 地图 获取屏幕中心经纬度 距离测量
用的是EventBus传值
2.添加权限
<!-- 用于访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 这个权限用于允许程序在手机屏幕关闭后后台进程仍然运行 -->
<user-permission android:name="android.permission.WAKE_LOCK" />
3.加入你的application里面
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你的key" />
<service android:name="com.amap.api.location.APSService" />
4.到EventBus包
implementation 'de.greenrobot:eventbus:3.0.0-beta1'
5.主函数
public class MapActivity extends BaseActivity implements
GeocodeSearch.OnGeocodeSearchListener,
AMap.OnCameraChangeListener,
DistanceSearch.OnDistanceSearchListener, LocationSource {
private MapView mapView;
private AMap aMap;
private boolean tag=false;
private GeocodeSearch geocodeSearch;
private OnLocationChangedListener mListener;
private boolean isFirstLoc=false;
private double latitu2,longitu2;
public double latitu1=0.0;
public double longitu1=0.0;
private DistanceSearch distanceSearch;
private DistanceSearch.DistanceQuery distanceQuery;
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
/**
* 声明定位回调监听器
*/
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);//定位时间
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
amapLocation.getAoiName();//获取当前定位点的AOI信息
lat = amapLocation.getLatitude();
lon = amapLocation.getLongitude();
Log.v("pcw", "lat : " + lat + " lon : " + lon);
Log.v("pcw", "Country : " + amapLocation.getCountry() + " province : " + amapLocation.getProvince() + " City : " + amapLocation.getCity() + " District : " + amapLocation.getDistrict());
// 设置当前地图显示为当前位置
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 15));
MarkerOptions markerOptions = new MarkerOptions();
aMap.addMarker(markerOptions);
// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置
if (isFirstLoc==true) {
//设置缩放级别
aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude())));
//点击定位按钮 能够将地图的中心移动到定位点
mListener.onLocationChanged(amapLocation);
isFirstLoc = false;
}
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
//声明mLocationOption对象
public AMapLocationClientOption mLocationOption = null;
private double lat;
private double lon;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_activity);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);//必须要写
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
init();
aMap.setOnCameraChangeListener(this);
}
/**
* * 初始化AMap对象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
}
//构造一个默认的位置
LatLng latLng = new LatLng(latitu1,longitu1);
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,11));
// 是否显示定位按钮
aMap.getUiSettings().setMyLocationButtonEnabled(true);
aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);
//设置定位监听
aMap.setLocationSource(this);
// 是否可触发定位并显示定位层
aMap.setMyLocationEnabled(true);
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));// 自定义定位蓝点图标*/
myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));// 自定义精度范围的圆形边框颜色
myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));//圆圈的颜色,设为透明的时候就可以去掉园区区域了
aMap.setMyLocationStyle(myLocationStyle);
//地理搜索类
geocodeSearch = new GeocodeSearch(this);
geocodeSearch.setOnGeocodeSearchListener(this);
setUpMap();
}
private void setUpMap() {
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(true);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
/**
* 方法必须重写
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必须重写
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onStop() {
super.onStop();
mLocationClient.stopLocation();//停止定位
//关闭后台定位,参数为true时会移除通知栏,为false时不会移除通知栏,但是可以手动移除
if(android.os.Build.VERSION.SDK_INT >= 26){
mLocationClient.disableBackgroundLocation(true);
}
}
/**
* 方法必须重写
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必须重写
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
mLocationClient.onDestroy();//销毁定位客户端。
}
public void affirm(View view){
tag=true;
//逆地理编码
getAddressByLatlng(new LatLng(latitu1,longitu1));
getAddressByLatlng(new LatLng(latitu2,longitu2));
chelian();
Intent i=new Intent();
setResult(0,i);
finish();
}
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
RegeocodeAddress regeocodeAddress = regeocodeResult.getRegeocodeAddress();
ArrayList<String> arr = new ArrayList<>();
if (tag == true) {
arr.add(regeocodeAddress.getProvince());
arr.add(regeocodeAddress.getCity());
arr.add(regeocodeAddress.getDistrict());
arr.add(regeocodeAddress.getTownship());
arr.add(regeocodeAddress.getFormatAddress());
arr.add(regeocodeAddress.getNeighborhood());
EventBus.getDefault().post(arr);
}
Log.d("aaaaa", "onRegeocodeSearched: " + regeocodeAddress.getDistrict());
}
//
@Override
public void onCameraChange(CameraPosition cameraPosition) {
LatLng target = cameraPosition.target;
if(latitu1==0.0){
latitu1=target.latitude;
longitu1=target.longitude;
}
latitu2=target.latitude;
longitu2=target.longitude;
Log.d("aaaaa", "onCameraChange111: "+target.latitude+"-----"+target.longitude);
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
}
@Override
public void onGeocodeSearched(GeocodeResult result, int rCode) {
}
private void getAddressByLatlng(LatLng latLng) {
//逆地理编码查询条件:逆地理编码查询的地理坐标点、查询范围、坐标类型。
LatLonPoint latLonPoint = new LatLonPoint(latLng.latitude, latLng.longitude);
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 500, GeocodeSearch.GPS);
//异步查询
geocodeSearch.getFromLocationAsyn(query);
}
public void chelian(){
distanceSearch = new DistanceSearch(this);
distanceSearch.setDistanceSearchListener(this);
distanceQuery = new DistanceSearch.DistanceQuery();
LatLonPoint start = new LatLonPoint(latitu1, longitu1);
LatLonPoint dest = new LatLonPoint(latitu2, longitu2);
//设置起点和终点,其中起点支持多个
List<LatLonPoint> latLonPoints = new ArrayList<LatLonPoint>();
latLonPoints.add(start);
distanceQuery.setOrigins(latLonPoints);
distanceQuery.setDestination(dest);
//设置测量方式,支持直线和驾车
distanceQuery.setType(DistanceSearch.TYPE_DRIVING_DISTANCE);
//请求经纬度的距离
distanceSearch.calculateRouteDistanceAsyn(distanceQuery);
}
//得到距离 返回结果成功或者失败的响应码。1000为成功,其他为失败
@Override
public void onDistanceSearched(DistanceResult result, int i) {
if(i==1000){
List<DistanceItem> distanceResults = result.getDistanceResults();
for (int j = 0; j <distanceResults.size() ; j++) {
Log.d("aaaaa", "onDistanceSearched: "+distanceResults.get(j).getDistance()+"米");
}
}
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
isFirstLoc=true;
}
@Override
public void deactivate() {
mListener = null;
}
}
7.主布局
<RelativeLayout
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"
tools:context=".pub.MapActivity">
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/coordicon"
android:layout_centerInParent="true"/>
<Button
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="@string/pub_but"
android:textColor="@color/white"
android:background="@drawable/usercenter_register_button"
android:onClick="affirm"
android:layout_marginBottom="7dp"
/>
</RelativeLayout>
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"
tools:context="yizhong.com.xtzhangbinbin.jpq.app.Main2Activity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="bb"
android:onClick="bb"/>
</LinearLayout>
9.如果你写到这里运行没有实现定位成功的话 一定要注意你的包名
这里的包名只能是下面图的包名
下面我在送大家一个查询SHA1的方法直接在你的项目中运行得到返回值就行了
//获取SHA1安全码
public static String sHA1(Context context) {
try {
PackageInfo info = context.getPackageManager().getPackageInfo(
context.getPackageName(), PackageManager.GET_SIGNATURES);
byte[] cert = info.signatures[0].toByteArray();
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(cert);
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < publicKey.length; i++) {
String appendString = Integer.toHexString(0xFF & publicKey[i])
.toUpperCase(Locale.US);
if (appendString.length() == 1)
hexString.append("0");
hexString.append(appendString);
hexString.append(":");
}
String result = hexString.toString();
return result.substring(0, result.length()-1);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
直接在main函数中运行这个方法将返回值打印一下 复制到高德官网上就行了