android开发笔记之高德地图使用

前言

最近在给别的部门做项目,发现了他们在应用中使用了高德地图来定位,好吧,一个人实在是无聊,那让我们看看别人是怎么使用高德地图来定位吧,让我们揭开那层薄薄面纱,一睹女神的芳容吧。

参考资料

1.Android Studio 中实现高德定位并获取相应信息
https://www.cnblogs.com/zhangqie/p/6438400.html
2.Android 高德地图定位
http://blog.csdn.net/qq_32368129/article/details/72244337
3.Android Studio获取SHA1值
http://blog.csdn.net/u012400885/article/details/68945498
4.高德地图定位官网说明
http://lbs.amap.com/api/android-location-sdk/locationsummary

应该来说,如果你看完上面的资料,恭喜你小伙子,高德地图开发,你已经入门了。

现在项目使用情况

那么我们先简单的看看此项目中到底使用了高德地图中的什么信息呢?

在EffectWaterMark.java (app\src\main\java\com\myos\camera\mode)文件的方法generateTimeAndLoctionBmp中,添加了地址信息(包括city,distric,street二个信息)。

String city = extra.getString(CameraLocationManager.LOCATION_LEVEL_CITY);
String district = extra.getString(CameraLocationManager.LOCATION_LEVEL_DISTRICT);
String street = extra.getString(CameraLocationManager.LOCATION_LEVEL_STREET);

其使用高德地图的api的方法也是官网提供的,如下:
第一步:在build.gradle文件中,添加库:

compile "com.amap.api:location:3.6.1"

第二步:在AndroidManifest.xml文件中添加对应的权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="16caa22bf22984714944c862cb580516"/>
<service android:name="com.amap.api.location.APSService"></service>

第三步:在下面的二个文件中封装了定位的api:

LocationClient.java (app\src\main\java\com\myos\camera\utils)
CameraLocationManager.java (app\src\main\java\com\myos\camera\activity)

第四步:就是上面说的使用高德地图来定位,给图片添加了位置信息的水印。

我的Demo

好吧,有了上面的基础,我准备自己来做一个Demo:

第一步:准备好开发要的资料
应用的包名:android.com.debugdemo
应用的名称:debugdemo
AndroidStudio的SHA1值:28:26:7F:62:8B:F0:B0:4D:94:4B:1E:BB:1E:BC:48:EC:10:2B:79:6C

方法如下:

keytool -list -v -keystore ./.android/debug.keystore
Enter keystore password:  
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: androiddebugkey
Creation date: Feb 28, 2015
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 1fe7c62b
Valid from: Sat Feb 28 10:11:35 CST 2015 until: Mon Feb 20 10:11:35 CST 2045
Certificate fingerprints:
         MD5:  F9:55:3C:3B:28:06:2F:74:F6:34:44:59:BB:99:E8:DC
         SHA1: 28:26:7F:62:8B:F0:B0:4D:94:4B:1E:BB:1E:BC:48:EC:10:2B:79:6C
         SHA256: A1:B0:06:B5:81:66:FF:F6:59:F7:98:B7:2B:00:8D:ED:92:06:7D:F4:E5:83:D9:FD:70:D7:B5:C1:B1:4D:96:77
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F2 EA E6 BC F1 45 20 94   08 02 7A F1 DC A9 47 B1  .....E ...z...G.
0010: 39 EB EE 06                                        9...
]
]
*******************************************
*******************************************
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore ./.android/debug.keystore -destkeystore ./.android/debug.keystore -deststoretype pkcs12".

然后去高德地图的官网注册账号,申请key值。

第二步:在build.gradle文件中,添加库

compile "com.amap.api:location:3.6.1"
compile 'com.amap.api:3dmap:latest.integration'

第三步:在AndroidManifest.xml文件中添加对应的权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="16caa22bf22984714944c862cb580516"/>
<service android:name="com.amap.api.location.APSService"></service>

第四步:添加布局文件
activity_test_location.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_test_location"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="android.com.debugdemo.TestLocation">

    <TextView
        android:id="@+id/location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <com.amap.api.maps.MapView
        android:id="@+id/mapView"
        android:layout_below="@id/location"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

第五步:实现逻辑

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
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.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestLocation extends AppCompatActivity implements LocationSource, AMapLocationListener{

    private static final String TAG = "TestLocation";

    private TextView location = null;

    private MapView mapView;
    private AMap aMap;
    private AMapLocationClient mLocationClient = null;
    private AMapLocationClientOption mLocationOption = null;
    private OnLocationChangedListener mListener = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG,"onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_location);
        init();
        // 创建地图
        mapView.onCreate(savedInstanceState);
    }

    private void init() {
        Log.i(TAG,"init()");
        location = (TextView) findViewById(R.id.location);
        mapView =(MapView) findViewById(R.id.mapView);
        if (aMap == null) {
            // 显示地图
            aMap = mapView.getMap();
        }

        aMap.getUiSettings().setZoomControlsEnabled(false);
        // 设置地图默认的指南针是否显示
        aMap.getUiSettings().setCompassEnabled(true);
        // 设置定位监听
        aMap.setLocationSource(this);
        // 设置默认定位按钮是否显示
        aMap.getUiSettings().setMyLocationButtonEnabled(true);
        // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
        aMap.setMyLocationEnabled(true);
        aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);

        // 初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        // 设置高德地图定位回调监听
        mLocationClient.setLocationListener(this);
        // 初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        // 高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息
        // 设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        // 低功耗定位模式:不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位);
        //设置定位模式为AMapLocationMode.Battery_Saving,低功耗模式。
        //mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
        // 仅用设备定位模式:不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,自 v2.9.0 版本支持返回地址描述信息。
        // 设置定位模式为AMapLocationMode.Device_Sensors,仅设备模式。
        //mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
        // SDK默认采用连续定位模式,时间间隔2000ms
        // 设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
        mLocationOption.setInterval(3000);
        // 设置定位同时是否需要返回地址描述
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        // 设置是否强制刷新WIFI,默认为强制刷新。每次定位主动刷新WIFI模块会提升WIFI定位精度,但相应的会多付出一些电量消耗。
        // 设置是否强制刷新WIFI,默认为true,强制刷新。
        mLocationOption.setWifiActiveScan(true);
        // 设置是否允许模拟软件Mock位置结果,多为模拟GPS定位结果,默认为false,不允许模拟位置。
        // 设置是否允许模拟位置,默认为false,不允许模拟位置
        mLocationOption.setMockEnable(false);
        // 设置定位请求超时时间,默认为30秒
        // 单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
        mLocationOption.setHttpTimeOut(50000);
        // 设置是否开启定位缓存机制
        // 缓存机制默认开启,可以通过以下接口进行关闭。
        // 当开启定位缓存功能,在高精度模式和低功耗模式下进行的网络定位结果均会生成本地缓存,不区分单次定位还是连续定位。GPS定位结果不会被缓存。
        // 关闭缓存机制
        mLocationOption.setLocationCacheEnable(false);
        // 设置是否只定位一次,默认为false
        mLocationOption.setOnceLocation(false);
        // 给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        // 启动高德地图定位
        mLocationClient.startLocation();
    }



    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        Log.i(TAG,"onLocationChanged()");
        // 解析AMapLocation对象
        // 判断AMapLocation对象不为空,当定位错误码类型为0时定位成功
        if (aMapLocation != null) {
            Log.i(TAG,"onLocationChanged()--aMapLocation.getErrorCode():"+aMapLocation.getErrorCode());
            if (aMapLocation.getErrorCode() == 0) {
                int locationType = aMapLocation.getLocationType(); // 获取当前定位结果来源,如网络定位结果,详见定位类型表
                double latitude= aMapLocation.getLatitude(); // 获取纬度
                double longitude = aMapLocation.getLongitude(); // 获取经度
                float accuracy = aMapLocation.getAccuracy(); // 获取精度信息
                String address = aMapLocation.getAddress(); // 地址,如果option中设置isNeedAddress为false,则没有此结果,
                                                            // 网络定位结果中会有地址信息,GPS定位不返回地址信息。
                String country = aMapLocation.getCountry(); // 国家信息
                String province = aMapLocation.getProvince(); // 省信息
                String city = aMapLocation.getCity(); // 城市信息
                String district = aMapLocation.getDistrict(); // 城区信息
                String street = aMapLocation.getStreet(); // 街道信息
                String streetNum= aMapLocation.getStreetNum(); // 街道门牌号信息
                String cityCode = aMapLocation.getCityCode(); // 城市编码
                String adCode = aMapLocation.getAdCode(); // 地区编码
                String aoiName= aMapLocation.getAoiName(); // 获取当前定位点的AOI信息
                String buildingId = aMapLocation.getBuildingId(); // 获取当前室内定位的建筑物Id
                String floor= aMapLocation.getFloor(); // 获取当前室内定位的楼层
                int gpsAccuracyStatus = aMapLocation.getGpsAccuracyStatus(); //获取GPS的当前状态
                // 获取定位时间
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date(aMapLocation.getTime());
                df.format(date);

                Log.i(TAG,"onLocationChanged()---"+"\n"
                +"--locationType:"+locationType +"\n"
                +"--latitude:"+latitude+"\n"
                +"--longitude:"+longitude+"\n"
                +"--accuracy:"+accuracy+"\n"
                +"--address:"+address+"\n"
                +"--country:"+country+"\n"
                +"--province:"+province+"\n"
                +"--city:"+city+"\n"
                +"--district:"+district+"\n"
                +"--street:"+street+"\n"
                +"--streetNum:"+streetNum+"\n"
                +"--cityCode:"+cityCode+"\n"
                +"--adCode:"+adCode+"\n"
                +"--aoiName:"+aoiName+"\n"
                +"--buildingId:"+buildingId+"\n"
                +"--floor:"+floor+"\n"
                +"--gpsAccuracyStatus:"+gpsAccuracyStatus+"\n"
                +"--date:"+date);

                // 设置缩放级别
                aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
                // 将地图移动到定位点
                aMap.moveCamera(CameraUpdateFactory.changeLatLng(
                        new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
                // 点击定位按钮 能够将地图的中心移动到定位点
                mListener.onLocationChanged(aMapLocation);

                location.setText(address);
            } else {
                // 定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
                Log.e("HLQ_Struggle", "location Error, ErrCode:"
                        + aMapLocation.getErrorCode() + ", errInfo:"
                        + aMapLocation.getErrorInfo());
            }
        }
    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {
        Log.i(TAG,"onPointerCaptureChanged----hasCapture:"+hasCapture);
    }

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        Log.i(TAG,"activate()");
        mListener = onLocationChangedListener;
    }

    @Override
    public void deactivate() {
        Log.i(TAG,"deactivate()");
        mListener = null;
    }


    @Override
    protected void onResume() {
        Log.i(TAG,"onResume()");
        super.onResume();
        // 重新绘制加载地图
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        Log.i(TAG,"onPause()");
        super.onPause();
        // 暂停地图的绘制
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        Log.i(TAG,"onDestroy()");
        super.onDestroy();
        // 销毁地图
        mapView.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.i(TAG,"onSaveInstanceState()");
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
}

第六步:效果图

这里写图片描述

第七步:日志信息

12-23 11:13:09.716 25314-25314/android.com.debugdemo I/TestLocation: onCreate()
12-23 11:13:09.878 25314-25314/android.com.debugdemo I/TestLocation: init()
12-23 11:13:10.345 25314-25314/android.com.debugdemo I/TestLocation: activate()
12-23 11:13:10.450 25314-25314/android.com.debugdemo I/TestLocation: onResume()
12-23 11:13:10.458 25314-25314/android.com.debugdemo D/WindowClient: Add to mViews: DecorView@779044a[TestLocation], this = android.view.WindowManagerGlobal@da78b42
12-23 11:13:10.464 25314-25314/android.com.debugdemo D/ViewRootImpl[TestLocation]: hardware acceleration is enabled, this = ViewRoot{ea8c6ac android.com.debugdemo/android.com.debugdemo.TestLocation,ident = 1}
12-23 11:13:10.468 25314-25314/android.com.debugdemo V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = ViewRoot{ea8c6ac android.com.debugdemo/android.com.debugdemo.TestLocation,ident = 1}, this = DecorView@779044a[TestLocation]
12-23 11:13:10.521 25314-25532/android.com.debugdemo D/OpenGLRenderer: CanvasContext() 0xa184c000 initialize window=0xa1828c00, title=android.com.debugdemo/android.com.debugdemo.TestLocation
12-23 11:13:11.268 25314-25314/android.com.debugdemo I/TestLocation: onLocationChanged()
12-23 11:13:11.268 25314-25314/android.com.debugdemo I/TestLocation: onLocationChanged()--aMapLocation.getErrorCode():0
12-23 11:13:11.270 25314-25314/android.com.debugdemo I/TestLocation: onLocationChanged()---
                                                                     --locationType:5
                                                                     --latitude:22.538421
                                                                     --longitude:113.996149
                                                                     --accuracy:35.0
                                                                     --address:广东省深圳市南山区香山东街香山东街1H3栋靠近华侨城东部工业区
                                                                     --country:中国
                                                                     --province:广东省
                                                                     --city:深圳市
                                                                     --district:南山区
                                                                     --street:香山东街
                                                                     --streetNum:香山东街1H3                                                                     --cityCode:0755
                                                                     --adCode:440305
                                                                     --aoiName:中航沙河工业区(侨城东路)
                                                                     --buildingId:
                                                                     --floor:
                                                                     --gpsAccuracyStatus:-1
                                                                     --date:Sat Dec 23 11:13:10 GMT+08:00 2017
12-23 11:13:17.086 25314-25314/android.com.debugdemo I/TestLocation: onLocationChanged()
12-23 11:13:17.086 25314-25314/android.com.debugdemo I/TestLocation: onLocationChanged()--aMapLocation.getErrorCode():0
12-23 11:13:17.088 25314-25314/android.com.debugdemo I/TestLocation: onLocationChanged()---
                                                                     --locationType:5
                                                                     --latitude:22.538421
                                                                     --longitude:113.996149
                                                                     --accuracy:35.0
                                                                     --address:广东省深圳市南山区香山东街香山东街1H3栋靠近华侨城东部工业区
                                                                     --country:中国
                                                                     --province:广东省
                                                                     --city:深圳市
                                                                     --district:南山区
                                                                     --street:香山东街
                                                                     --streetNum:香山东街1H3                                                                     --cityCode:0755
                                                                     --adCode:440305
                                                                     --aoiName:中航沙河工业区(侨城东路)
                                                                     --buildingId:
                                                                     --floor:
                                                                     --gpsAccuracyStatus:-1
                                                                     --date:Sat Dec 23 11:13:16 GMT+08:00 2017

备注

如果你开发中遇到返回值不为0,也就是说返回值错误的情况,导致不能获取到位置信息,那请查看高德地图的官网说明:
http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/?

对应解决,谢谢!!

猜你喜欢

转载自blog.csdn.net/hfreeman2008/article/details/78878730
今日推荐