前 言

LBS(基于地理位置服务)是当前移动互联网大部分应用不可或缺的功能,基于地理位置服务的Android平台的开发是主要用于Android系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作。比如说天气预报程序可以根据用户所在的位置自动选择城市,发微博的时候我们可以向朋友晒一下自己的地理位置,不认识路的时候随时打开地图就可以查询路线;如果你出门打车用滴滴或Uber打车,你可以看到附近司机所在的位置,当你创建订单时司机可以获取你所在的位置;当你想查询附近有没有共享单车时你可以打开地图或者共享单车App就能看到车辆显示在地图界面上;如果想获取自己所在位置的周边的服务,我们可以打开地图就能获取到的周边的小吃、银行、医院和电影院等。可以说,LBS在我们日常使用的应用中都会使用到。

需求分析

首先要实现仿钉钉打卡的功能,需要实现以下几个功能和步骤:

  1. 接入地图SDK,这里使用高德地图SDK(也可以使用百度地图SDK);
  2. 显示地图界面并定位到用户所在的位置;
  3. 在地图上添加公司位置和覆盖物,弹窗信息等;
  4. 在地图上设置公司打卡范围和地理围栏;
  5. 判断用户当前的位置是否在打卡的范围内,是打卡成功,否打卡失败。

需求分析完后接下来就进入coding阶段。

接入高德地图SDK

首先将下载的Android地图SDK相关的jar包、so文件拷贝到AS工程的libs目录下,如下图:

然后在AS的内层build.gradle里添加地图SDK相关的依赖

android {........sourceSets {main {jniLibs.srcDir 'libs'}}
}
dependencies {........implementation files('libs/AMap3DMap_6.9.2_AMapLocation_4.7.0_20190709.jar')
}

在清单文件AndroidManifest.xml中添加地图所需的相应权限

    <!--地图SDK(包含其搜索功能)需要的基础权限--><!--允许程序打开网络套接字--><uses-permission android:name="android.permission.INTERNET" /><!--允许程序设置内置sd卡的写权限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--允许程序获取网络状态--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--允许程序访问WiFi网络信息--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--允许程序读写手机状态和身份--><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!--允许程序访问CellID或WiFi热点来获取粗略的位置--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!--用于获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!--用于访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET" /><!--用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!--用于写入缓存数据到扩展存储卡--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--用于申请调用A-GPS模块--><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><!--用于申请获取蓝牙信息进行室内定位--><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

注意:定位权限在Android 6.0 以上系统在定位之前除了在清单文件里添加外必须在Java代码或者Kotlin代码里动态授予,否则应用将会闪退。

在清单文件AndroidManifest.xml中添加高德地图相应的配置信息,Key值和定位服务。

    <application........<meta-dataandroid:name="com.amap.api.v2.apikey"android:value="这里填写申请到的高德地图Key值" /><service android:name="com.amap.api.location.APSService" /></application>

编码实现

加载和显示地图界面

        // 显示地图,必须要写mapView.onCreate(savedInstanceState);//获取地图对象aMap = mapView.getMap();//设置显示定位按钮 并且可以点击UiSettings settings = aMap.getUiSettings();//设置定位监听aMap.setLocationSource(this);// 是否显示定位按钮settings.setMyLocationButtonEnabled(true);// 是否显示地图方向盘settings.setCompassEnabled(true);// 是否可触发定位并显示定位层aMap.setMyLocationEnabled(true);
    /*** 方法必须重写*/@Overrideprotected void onResume() {super.onResume();mapView.onResume();}/*** 方法必须重写*/@Overrideprotected void onPause() {super.onPause();mapView.onPause();}/*** 方法必须重写*/@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}/*** 方法必须重写*/@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}

定位到用户所在的位置,实现定位功能必须要继承高德地图SDK的LocationSource和AMapLocationListener接口。

设置和初始化定位所需的参数

        //初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位回调监听mLocationClient.setLocationListener(this);//初始化定位参数mLocationOption = new AMapLocationClientOption();//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置是否返回地址信息(默认返回地址信息)mLocationOption.setNeedAddress(true);//设置是否只定位一次,默认为falsemLocationOption.setOnceLocation(false);//设置是否强制刷新WIFI,默认为强制刷新mLocationOption.setWifiActiveScan(true);//设置是否允许模拟位置,默认为false,不允许模拟位置mLocationOption.setMockEnable(false);//设置定位间隔,单位毫秒,默认为2000msmLocationOption.setInterval(3000);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();
    //激活定位@Overridepublic void activate(OnLocationChangedListener listener) {mListener = listener;}//停止定位@Overridepublic void deactivate() {mListener = null;}

定位监听回调

    // 定位回调函数@Overridepublic 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();//地区编码// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置if (isFirstLoc) {//设置缩放级别aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//将地图移动到定位点aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude())));//点击定位按钮 能够将地图的中心移动到定位点mListener.onLocationChanged(amapLocation);//添加图钉aMap.addMarker(getMarkerOptions(amapLocation));//获取定位信息StringBuffer buffer = new StringBuffer();buffer.append(amapLocation.getAddress());tv_city.setText(amapLocation.getCity());
//                    buffer.append(amapLocation.getCountry() + "" + amapLocation.getProvince() + "" + amapLocation.getCity() + "" + amapLocation.getProvince() + "" + amapLocation.getDistrict() + "" + amapLocation.getStreet() + "" + amapLocation.getStreetNum());Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();L.i("定位地址:" + buffer.toString());// 记录当前定位的坐标locLatLng = new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude());isFirstLoc = false;}} else {//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ amapLocation.getErrorCode() + ", errInfo:"+ amapLocation.getErrorInfo());}}}

在地图上添加公司位置和覆盖物,弹窗信息等

    // 自定义一个图钉,并且设置图标,当我们点击图钉时,显示设置的信息private MarkerOptions getMarkerOptions(AMapLocation amapLocation) {//设置图钉选项MarkerOptions options = new MarkerOptions();//图标options.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_company));// 记录公司的坐标,这里的公司坐标是随机生成comLatLng = new LatLng(amapLocation.getLatitude() + ((new Random().nextDouble()) / 500),amapLocation.getLongitude() + ((new Random().nextDouble()) / -500));options.position(comLatLng);// 绘制圆圈drawCircle(comLatLng);StringBuffer buffer = new StringBuffer();buffer.append(amapLocation.getAddress());//标题
//        options.title(buffer.toString());options.title("公司:酷公司,用钉钉");//子标题options.snippet("地址:" + amapLocation.getProvince() + amapLocation.getCity() +amapLocation.getDistrict() + amapLocation.getStreet());//设置多少帧刷新一次图片资源options.period(60);return options;}

在地图上设置公司打卡范围和地理围栏,这里设置打卡和地理围栏半径为200米。

    /*** 绘制圆圈** @param latLng*/public void drawCircle(LatLng latLng) {if (circle != null) {circle = null;}circle = aMap.addCircle(new CircleOptions().center(latLng).radius(radius).fillColor(R.color.transparent1).strokeColor(R.color.transparent1).strokeWidth(5));}

判断用户当前的位置是否在打卡的范围内,是打卡成功,否打卡失败。

        if (locLatLng != null && comLatLng != null) {float distance = AMapUtils.calculateLineDistance(locLatLng, comLatLng);L.i("连点之间的距离:" + distance);if (distance <= radius) {// TODO 这里模拟把打卡的信息提交到服务器,服务器并且把打卡成功信息返回给客户端ToastUtil.showToastLong("打卡成功");} else {ToastUtil.showToastLong("当前位置不打卡范围内,打卡失败");}} else {ToastUtil.showToastLong("位置初始化异常,打卡失败");}

这里判断定位用户所在位置坐标和公司位置坐标的距离是否是小于或等于200,是在打卡范围内,否不在打卡范围内。

下面附上完整的代码(或者直接在文章底部下载demo工程源码):

MainActivity.java

public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener {private static final int WRITE_COARSE_LOCATION_REQUEST_CODE = 0;@BindView(R.id.map)MapView mapView;@BindView(R.id.tv_city)TextView tv_city;@BindView(R.id.btn_check_in)TextView btn_check_in;private AMap aMap;//地图对象private Circle circle;private LatLng locLatLng = null; // 定位坐标private LatLng comLatLng = null; // 公司坐标private float radius = 200;//定位需要的声明private AMapLocationClient mLocationClient = null;//定位发起端private AMapLocationClientOption mLocationOption = null;//定位参数private OnLocationChangedListener mListener = null;//定位监听器//标识,用于判断是否只显示一次定位信息和用户重新定位private boolean isFirstLoc = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);// 启动新的线程new TimeThread().start();// 显示地图,必须要写mapView.onCreate(savedInstanceState);initView();initData();}private void initView() {//获取地图对象aMap = mapView.getMap();//设置显示定位按钮 并且可以点击UiSettings settings = aMap.getUiSettings();//设置定位监听aMap.setLocationSource(this);// 是否显示定位按钮settings.setMyLocationButtonEnabled(true);// 是否显示地图方向盘settings.setCompassEnabled(true);// 是否可触发定位并显示定位层aMap.setMyLocationEnabled(true);//定位的小图标 默认是蓝点,其实就是一张图片
//        MyLocationStyle myLocationStyle = new MyLocationStyle();
//        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.icon_point));
//        myLocationStyle.radiusFillColor(R.color.transparent1);
//        myLocationStyle.strokeColor(R.color.transparent1);
//        aMap.setMyLocationStyle(myLocationStyle);// 判断是否为Android 6.0 以上的系统版本,如果是,需要动态添加权限if (Build.VERSION.SDK_INT >= 23) {showPermissions();} else {// 开始定位initLoc();}}private void initData() {}@OnClick({R.id.btn_check_in})void click(View v) {switch (v.getId()) {case R.id.btn_check_in:if (locLatLng != null && comLatLng != null) {float distance = AMapUtils.calculateLineDistance(locLatLng, comLatLng);L.i("连点之间的距离:" + distance);if (distance <= radius) {// TODO 这里模拟把打卡的信息提交到服务器,服务器并且把打卡成功信息返回给客户端ToastUtil.showToastLong("打卡成功");} else {ToastUtil.showToastLong("当前位置不打卡范围内,打卡失败");}} else {ToastUtil.showToastLong("位置初始化异常,打卡失败");}break;default:break;}}// 定位private void initLoc() {//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位回调监听mLocationClient.setLocationListener(this);//初始化定位参数mLocationOption = new AMapLocationClientOption();//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置是否返回地址信息(默认返回地址信息)mLocationOption.setNeedAddress(true);//设置是否只定位一次,默认为falsemLocationOption.setOnceLocation(false);//设置是否强制刷新WIFI,默认为强制刷新mLocationOption.setWifiActiveScan(true);//设置是否允许模拟位置,默认为false,不允许模拟位置mLocationOption.setMockEnable(false);//设置定位间隔,单位毫秒,默认为2000msmLocationOption.setInterval(3000);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}// 定位回调函数@Overridepublic 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();//地区编码// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置if (isFirstLoc) {//设置缩放级别aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//将地图移动到定位点aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude())));//点击定位按钮 能够将地图的中心移动到定位点mListener.onLocationChanged(amapLocation);//添加图钉aMap.addMarker(getMarkerOptions(amapLocation));//获取定位信息StringBuffer buffer = new StringBuffer();buffer.append(amapLocation.getAddress());tv_city.setText(amapLocation.getCity());
//                    buffer.append(amapLocation.getCountry() + "" + amapLocation.getProvince() + "" + amapLocation.getCity() + "" + amapLocation.getProvince() + "" + amapLocation.getDistrict() + "" + amapLocation.getStreet() + "" + amapLocation.getStreetNum());Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();L.i("定位地址:" + buffer.toString());// 记录当前定位的坐标locLatLng = new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude());isFirstLoc = false;}} else {//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ amapLocation.getErrorCode() + ", errInfo:"+ amapLocation.getErrorInfo());}}}// 自定义一个图钉,并且设置图标,当我们点击图钉时,显示设置的信息private MarkerOptions getMarkerOptions(AMapLocation amapLocation) {//设置图钉选项MarkerOptions options = new MarkerOptions();//图标options.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_company));// 记录公司的坐标,这里的公司坐标是随机生成comLatLng = new LatLng(amapLocation.getLatitude() + ((new Random().nextDouble()) / 500),amapLocation.getLongitude() + ((new Random().nextDouble()) / -500));options.position(comLatLng);// 绘制圆圈drawCircle(comLatLng);StringBuffer buffer = new StringBuffer();buffer.append(amapLocation.getAddress());//标题
//        options.title(buffer.toString());options.title("公司:酷公司,用钉钉");//子标题options.snippet("地址:" + amapLocation.getProvince() + amapLocation.getCity() +amapLocation.getDistrict() + amapLocation.getStreet());//设置多少帧刷新一次图片资源options.period(60);return options;}/*** 绘制圆圈** @param latLng*/public void drawCircle(LatLng latLng) {if (circle != null) {circle = null;}circle = aMap.addCircle(new CircleOptions().center(latLng).radius(radius).fillColor(R.color.transparent1).strokeColor(R.color.transparent1).strokeWidth(5));}//激活定位@Overridepublic void activate(OnLocationChangedListener listener) {mListener = listener;}//停止定位@Overridepublic void deactivate() {mListener = null;}/*** 方法必须重写*/@Overrideprotected void onResume() {super.onResume();mapView.onResume();}/*** 方法必须重写*/@Overrideprotected void onPause() {super.onPause();mapView.onPause();}/*** 方法必须重写*/@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}/*** 方法必须重写*/@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}/*** Android 6.0 以上的版本的定位方法*/public void showPermissions() {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED|| ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED) {// 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE}, WRITE_COARSE_LOCATION_REQUEST_CODE);} else {// 开始定位initLoc();}}// Android 6.0 以上的版本申请权限的回调方法@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {// requestCode即所声明的权限获取码,在checkSelfPermission时传入case WRITE_COARSE_LOCATION_REQUEST_CODE:if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 开始定位initLoc();} else {// 没有获取到权限,做特殊处理ToastUtil.showToastLong("获取位置权限失败,请手动开启");}break;default:break;}}class TimeThread extends Thread {@Overridepublic void run() {do {try {Thread.sleep(1000);Message msg = new Message();msg.what = 1;  // 消息(一个整型值)mHandler.sendMessage(msg); // 每隔1秒发送一个msg给mHandler} catch (InterruptedException e) {e.printStackTrace();}} while (true);}}// 在主线程里面处理消息并更新UI界面private Handler mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {switch (msg.what) {case 1:long sysTime = System.currentTimeMillis(); // 获取系统时间CharSequence sysTimeStr = DateFormat.format("HH:mm:ss", sysTime); // 时间显示格式btn_check_in.setText(String.format("上/下班打卡\n%s", sysTimeStr)); // 实时更新时间break;default:break;}return false;}});}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv_city"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/colorPrimaryDark"android:gravity="center_horizontal"android:padding="8dp"android:text="北京市"android:textColor="@android:color/white"android:textSize="18sp" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="30dp"android:gravity="center_horizontal"><TextViewandroid:id="@+id/btn_check_in"android:layout_width="120dp"android:layout_height="120dp"android:background="@drawable/bg_circle"android:gravity="center"android:lineSpacingMultiplier="1.3"android:text="上/下班打卡\n--:--:--"android:textColor="@android:color/white"android:textSize="17sp" /></LinearLayout></RelativeLayout></LinearLayout>

界面运行效果图如下:

apk安装包下载体验地址:

可以扫描以下二维码进行下载安装,或者点击以下链接 http://app.fukaimei.top/gmapdd 进行下载安装体验。

———————— The end ————————

码字不易,如果您觉得这篇博客写的比较好的话,可以赞赏一杯咖啡吧~~


Demo程序源码下载地址一(GitHub)
Demo程序源码下载地址二(码云)

Android开发-使用高德地图SDK实现仿钉钉打卡的功能相关推荐

  1. Android中集成高德地图SDK实现地图定位和导航功能(一)

    一.前期准备工作 1.在高德地图开发者平创建一个自己的项目 名称和应用类型随便填 2.添加Key 1.添加key 2.获取SHA1值 2.1.使用windwos+R 输入cmd 打开控制窗口 输入 w ...

  2. Android中集成高德地图SDK实现地图定位和导航功能(二)

    我们接着上一篇文章开始继续实现android中集成高德地图的SDK实现地图 定位,搜索,导航的功能 如何让地图在手机上实现呢? 1.配置AndroidManifest 中的权限申请 可以参考官方文档 ...

  3. Android开发实现高德地图定位详解

     一. 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的地图SDK和定位S ...

  4. android开发之高德地图不能定位,只显示格子

    android 在引用高德地图组件进行开发的时候,不能定位,只显示格子,如下图所示: 参考了网上的一下大家的解决方案,主要是 (1)检查申请的KEY是否正确.PS:申请方法请参考这篇博客,写的很全很详 ...

  5. Android开发集成高德定位SDK实现定位功能。

    第一步:添加高德定位SDK依赖,导入框架有两种方式,第一种是可以到高德开放平台高德开放平台 | 高德地图API下载相关的jar包,然后将jar包放在项目的libs文件下,然后点击以依赖库的形式添加到项 ...

  6. android开发之高德地图API篇:1、高德地图API之实时定位+轨迹可视化

    TIME:2020年7月6日 高德地图API之实时定位+轨迹可视化 前言: step1.工程的配置 step2.显示地图 step2.实现静态定位: step3.实时定位 step4.实现轨迹可视化: ...

  7. 【Android】接入高德地图SDK

    第一步 申请开发者权限 进入高德地图开放平台https://console.amap.com/dev/index申请认证个人开发者 第二步 创建应用 第三步 下载Android地图SDK 进入http ...

  8. Android开发之高德地图无法显示地图的原因

    公司项目接入高德地图,我也遇到这个问题了,地图怎么都无法显示出来,定位按钮,缩放按钮都有,就是没有地图怎么回事儿呢? 咱们先上图看下 实际上出现这个问题很简单,原因是因为你的so库没有拷全!! 因为我 ...

  9. 高德地图 SDK集成 定位 地理编码 搜索 经纬度获取 功能工具类

    最近项目要集成高德地图,然后可以根据语音输入指令,进行定位和地理编码搜索功能,从而实现获取当前位置经纬度和根据地址获取经纬度的功能 下载文件之只放了libs和主要代码文件 https://downlo ...

最新文章

  1. mysql架构设计书籍推荐_最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这...
  2. Python单引号、双引号和三双引号的区别
  3. Linux常用命令 积累
  4. 苹果自动关机_零下二十度,登山表爆表,苹果冻关机,电霸手机好
  5. 从头认识Spring-1.7 如何通过属性注入Bean?(1)-如何通过属性向对象注入值?...
  6. Hadoop精华问答 | Hadoop 和Spark有什么区别?
  7. 比特币创业公司Circle首获数字货币许可证
  8. app生成(免费自制app软件)
  9. 百度离线地图服务器搭建
  10. HTML5创意设计简历,35张设计师的创意个人简历信息图
  11. 如何使域名跳转到个人博客
  12. VS2017学习C++基础十一(项目实战:小公主养成记)
  13. 阴阳师斗技通用,3000上下冲浪斗技(上)
  14. 机器学习常用数据处理
  15. 一次惨痛的线下机房上云的经历
  16. 达芬奇机器人变身‘模仿达人’,通过看视频模仿手术缝合、穿针、打结等动作...
  17. HDU1273漫步森林
  18. 微信小程序 之 mpvue
  19. softlayer 端口开放
  20. 三国群英传服务器未响应,《三国群英传2》近期服务器不稳定问题说明

热门文章

  1. m3u8直播流视频实时下载小记-HLS(Http Live Streaming)录屏
  2. 如何实现隐藏滚动条但仍可以滚动
  3. unity3d双人控制
  4. python3中datetime库,time库以及pandas中的时间函数区别与详解
  5. android backtrace,2018-12-12 Android backtrace 问题分析
  6. linux下安装mysql8(基于yum安装和mysql安装包离线安装两种方式)
  7. AI算力基础 -- Nvidia TESLA V100 GPU
  8. Python 3.9.0 已正式发布
  9. Java四种线程池使用
  10. 邮件服务器如何搭建?企业邮箱邮件服务器搭建只需几步即可