安卓高德地图定位篇-(1)

来源:互联网 发布:mac os ie内核浏览器 编辑:程序博客网 时间:2024/06/04 19:46

先看效果图:

这里写图片描述

STEP1:
先去高德开放平台注册账号,这个不用多说吧
网址:http://lbs.amap.com/
之后再去控制台-应用管理找到自己的key,如下图所示

这里写图片描述

STEP2:
回到AS 这里也可以去下载架包导入 我直接引入的
网址:http://lbs.amap.com/api/android-sdk/download
在module-build.gradle里引入即可,在点击右上角Sync Now即可

dependencies {          compile fileTree(include: ['*.jar'], dir: 'libs')          //定位          compile 'com.amap.api:location:latest.integration'          //地图          compile 'com.amap.api:3dmap:latest.integration'}

STEP3:布局文件 activity_map_location

<?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="com.helloworld.gather.activity.MapLocationActivity">    <!--引用的一个头,布局可以删除-->    <include        layout="@layout/activity_app_title"/>    <!--代码提示不出来,最好复制-->    <com.amap.api.maps.MapView        android:id="@+id/map"        android:layout_width="match_parent"        android:layout_height="@dimen/dip_0"        android:layout_weight="1"/>    <!--显示当前位置信息-->    <TextView        android:id="@+id/tv_location"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@android:color/white"        android:drawableLeft="@drawable/icon_location"        android:drawablePadding="@dimen/dip_10"        android:gravity="center_vertical"        android:padding="@dimen/dip_10"        android:text="@string/loading"        android:textColor="@color/colorPrimary"        android:textSize="@dimen/sp_15"/></LinearLayout>

STEP4:权限类

import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;public class LocationUtils {  /**     * 初始化定位     */    public static AMapLocationClient initLocation(Context context, AMapLocationClientOption locationOption, AMapLocationListener locationListener) {        //初始化client        AMapLocationClient locationClient = new AMapLocationClient(context.getApplicationContext());        //设置定位参数        locationClient.setLocationOption(locationOption);        // 设置定位监听        locationClient.setLocationListener(locationListener);        return locationClient;    }    /**     * 定位参数     */    public static AMapLocationClientOption getDefaultOption() {       AMapLocationClientOption mOption = new AMapLocationClientOption();        //可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);        //可选,设置是否gps优先,只在高精度模式下有效。默认关闭        mOption.setGpsFirst(false);        //可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效        mOption.setHttpTimeOut(25000);        //可选,设置定位间隔。默认为2秒        mOption.setInterval(2000);        //可选,设置是否返回逆地理地址信息。默认是true        mOption.setNeedAddress(true);        //可选,设置是否单次定位。默认是false        mOption.setOnceLocation(false);        //可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用        mOption.setOnceLocationLatest(false);        //可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);        //可选,设置是否使用传感器。默认是false        mOption.setSensorEnable(false);        //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差        mOption.setWifiScan(true);        //可选,设置是否使用缓存定位,默认为true        mOption.setLocationCacheEnable(true);        return mOption;    }}

STEP 5:清单文件 AndroidManifest.xml 权限贴不出来不知道为什么

    <!-- 高德地图 -->    <meta-data        android:name="com.amap.api.v2.apikey"        android:value="eb415daf7a068ed6483c4fc064c9d97c"/>   <service android:name="com.amap.api.location.APSService"/>

STEP:6 MainActivity 返回信息:
http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation

import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;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.MapView;import com.amap.api.maps.model.MyLocationStyle;import com.helloworld.gather.R;import com.helloworld.gather.util.LocationUtils;import com.helloworld.gather.util.Tools;import com.helloworld.gather.widget.PermissionsUtils;public class MapLocationActivity extends AppCompatActivity implements View.OnClickListener, AMapLocationListener {    private static final int PERMISSON_REQUESTCODE = 0;    private TextView  tv_location;    private MapView mMapView;    private AMap aMap;    //判断权限是否打开    private boolean isNeedCheck = true;    private MyLocationStyle myLocationStyle;    private static final String TAG = "MapLocationActivity";    //声明AMapLocationClient类对象    public AMapLocationClient mLocationClient = null;    //声明AMapLocationClientOption对象    public AMapLocationClientOption mLocationOption = null;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_map_location);        findViewById(R.id.ic_back).setOnClickListener(this);        mMapView = (MapView) this.findViewById(R.id.map);        tv_location = (TextView) this.findViewById(R.id.tv_location);        // 此方法须重写,虚拟机需要在很多情况下保存地图绘制的当前状态        mMapView.onCreate(savedInstanceState);        initLocation();        //自己选择是否添加        //判断当前设备版本号是否为4.4以上,如果是,则通过调用setTranslucentStatus让状态栏变透明        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            setTranslucentStatus(true);        }    }/**     * 设置状态栏透明     *     * @param on     */    @TargetApi(19)    private void setTranslucentStatus(boolean on) {        Window win = getWindow();        WindowManager.LayoutParams winParams = win.getAttributes();        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;        if (on) {            winParams.flags |= bits;        } else {            winParams.flags &= ~bits;        }        win.setAttributes(winParams);    }    private void initLocation() {        if (aMap == null) {            aMap = mMapView.getMap();        }        /TODO 缩放级别3-19,不支持自定义 要监听否则无效        aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {            @Override            public void onMapLoaded() {                aMap.moveCamera(CameraUpdateFactory.zoomTo(16));            }        });        //指南针        aMap.getUiSettings().setCompassEnabled(true);        //显示默认的定位按钮        aMap.getUiSettings().setMyLocationButtonEnabled(true);        //显示实时交通状况(默认地图)        //aMap.setTrafficEnabled(true);        //地图模式-标准地图:MAP_TYPE_NORMAL、卫星地图:MAP_TYPE_SATELLITE        aMap.setMapType(AMap.MAP_TYPE_NORMAL);        initLocationStyle();        //动态设置权限        if (isNeedCheck) {            if (PermissionsUtils.checkPermissions(this, PERMISSON_REQUESTCODE, PermissionsUtils.locationPermissions)) {                initaion();            }        } else {            initaion();        }    }    private void initaion() {        //基本的定位参数        mLocationOption = LocationUtils.getDefaultOption();        mLocationClient = LocationUtils.initLocation(this, mLocationOption, this);        //启动定位        mLocationClient.startLocation();    }    private void initLocationStyle() {        //实现定位蓝点        //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);        //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)        //如果不设置myLocationType,默认也会执行此种模式。        myLocationStyle = new MyLocationStyle();        //设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。        aMap.setMyLocationEnabled(true);        //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。        //单位:毫秒,默认值:1000毫秒,如果传小于1000的任何值将按照1000计算。        //myLocationStyle.interval(2000);        //只定位一次。        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);        //定位一次,且将视角移动到地图中心点。        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);        //连续定位、且将视角移动到地图中心点,定位蓝点跟随设备移动。(1秒1次定位)        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW) ;        //连续定位、且将视角移动到地图中心点,地图依照设备方向旋转,定位点会跟随设备移动。(1秒1次定位)        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);        //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)默认执行此种模式。        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);        //以下三种模式从5.1.0版本开始提供        //连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);        //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER);        //连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER);        //设置定位蓝点的icon图标方法,需要用到BitmapDescriptor类对象作为参数。        //myLocationStyle.myLocationIcon(R.mipmap.ic_launcher);        //设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。        //myLocationStyle.showMyLocation(true);        //设置定位蓝点精度圆圈的边框颜色的方法。[会叠加不建议设置]        //myLocationStyle.strokeColor(R.color.colorAccent);        //设置定位蓝点精度圆圈的填充颜色的方法。        //myLocationStyle.radiusFillColor(R.color.colorAccent);        //设置定位蓝点精度圈的边框宽度的方法。        //myLocationStyle.strokeWidth(20f);        aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.ic_back:                this.finish();                break;        }    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        if (requestCode == PERMISSON_REQUESTCODE) {            if (!PermissionsUtils.verifyPermissions(grantResults)) {                //没打开权限 跳转至设置界面                Tools.startAppSettings(this);                isNeedCheck = false;            } else {                initLocation();            }        }    }    @Override    public void onDestroy() {        super.onDestroy();        //销毁地图        if (mMapView != null) {            mMapView.onDestroy();        }    } @Override    public void onResume() {        super.onResume();        //重新绘制加载地图        if (mMapView != null) {            mMapView.onResume();        }    }    @Override    public void onPause() {        super.onPause();        //暂停地图的绘制        if (mMapView != null) {            mMapView.onPause();        }    }    @Override    public void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        if (mMapView != null) {            mMapView.onSaveInstanceState(outState);        }    }    private String cityName, AdCode, cityCode, province, poiName, street, district;    private double latitude, longitude;    @Override    public void onLocationChanged(AMapLocation amapLocation) {        if (amapLocation.getErrorCode() == 0) {            //更多返回看(文档:http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation)            latitude = amapLocation.getLatitude();//获取纬度            longitude = amapLocation.getLongitude();//获取经度            province = amapLocation.getProvince();//省信息            cityName = amapLocation.getCity();//城市信息            district = amapLocation.getDistrict();//城区信息            street = amapLocation.getStreet();//街道信息            cityCode = amapLocation.getCityCode();//城市编码            AdCode = amapLocation.getAdCode();//地区编码            poiName = amapLocation.getPoiName();//获取当前位置的POI名称            Log.e(TAG, "onLocationChanged: " + cityName);            Log.e(TAG, "onLocationChanged: " + AdCode);            Log.e(TAG, "onLocationChanged: " + cityCode);            Log.e(TAG, "onLocationChanged: " + province);            Log.e(TAG, "onLocationChanged: " + poiName);            Log.e(TAG, "onLocationChanged: " + latitude);            Log.e(TAG, "onLocationChanged: " + street);            Log.e(TAG, "onLocationChanged: " + longitude);            Log.e(TAG, "onLocationChanged: " + district);            Log.e(TAG, "onLocationChanged: " + amapLocation.getAddress());            Log.e(TAG, "onLocationChanged: " + amapLocation.getStreetNum());            Log.e(TAG, "onLocationChanged: " + amapLocation.getLocationType());            Log.e(TAG, "onLocationChanged: " + amapLocation.getLocationDetail());            //显示当前的位置            tv_location.setText(amapLocation.getAddress());            //停止定位后,本地定位服务并不会被销毁            mLocationClient.stopLocation();            //销毁定位客户端,同时销毁本地定位服务。            mLocationClient.onDestroy();        } else {            //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。            Log.e(TAG, "定位失败, 错误码:"                    + amapLocation.getErrorCode() + "\n"                    + " 错误信息:"                    + amapLocation.getErrorInfo() + "\n"                    + "APK SHA1值为:" + Tools.getSHA1(this));            String str = amapLocation.getErrorInfo();            String[] split = str.split(" ");            //截取第一个空格之前的错误日志            Toast.makeText(this,split[0],Toast.LENGTH_SHORT).show();            //停止定位后,本地定位服务并不会被销毁            mLocationClient.stopLocation();            //销毁定位客户端,同时销毁本地定位服务。            mLocationClient.onDestroy();        }    }}

STEP:7 SHA1码的获取

这里写图片描述

获取APK当前签名文件的SHA1:

 /**     * 获取APK当前签名文件的SHA1    */    public static String getSHA1(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;    }    /**     * 跳转至设置界面方法     */    public static void startAppSettings(Context context) {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        intent.setData(Uri.parse("package:" + context.getPackageName()));        context.startActivity(intent);    }

STEP:8 一般到这里就结束了,如果定位失败可以到这个网址链接查看错误码说明:http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/

最后注意APP SHA1不要填错 否则会定位到 非洲去…

这里写图片描述

原创粉丝点击