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函数中运行这个方法将返回值打印一下 复制到高德官网上就行了