快速简单高德地图接入

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


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值