首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >跟我学在高德地图——标注我的位置

跟我学在高德地图——标注我的位置

作者头像
全栈程序员站长
发布于 2022-08-25 13:21:48
发布于 2022-08-25 13:21:48
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

这里使用的SDK为AMap_Location_V2.5.0_20160526.jar 没有接触过高德地图的同学,请参考 加载一张高德地图

1.获取我的位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.pansoft.oilgas.gaodenavigation;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

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 java.text.SimpleDateFormat;
import java.util.Date;

public class QueryCurrentLocationActivity extends AppCompatActivity implements AMapLocationListener { 
   
    private AMapLocationClientOption mLocationOption = null;
    private AMapLocationClient mLocationClient = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLocationClient = new AMapLocationClient(this);
//初始化定位参数
        mLocationOption = new AMapLocationClientOption();
//设置定位监听
        mLocationClient.setLocationListener(this);
/*设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式*/
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000);
//设置定位参数
mLocationClient.setLocationOption(mLocationOption);
/* 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求,在定位结束后,在合适的生命周期调用onDestroy()方法 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除启动定位*/
        mLocationClient.startLocation();

    }

    @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);//定位时间
            } else {
                //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                Log.e("AmapError", "location Error, ErrCode:"
                        + amapLocation.getErrorCode() + ", errInfo:"
                        + amapLocation.getErrorInfo());
            }
        }
    }


}

ok,执行以下!

不好了,缺少定位权限,是没有在AndroidManifest文件中声明定位权限吗?不是,是Android6.0中将用户权限分为普通权限和危险权限,这里定位权限属于危险权限,需要在使用的时候进行动态申请。 对Android6定位权限不熟悉的同学请参考

Android6.0权限申请模型

2.动态申请定位权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public void requestLocationPermission(){
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},REQ_LOCATION);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==REQ_LOCATION){
            if(grantResults!=null&&grantResults.length>0){
                if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
                    mLocationClient.startLocation();
                }else{
                    Toast.makeText(QueryCurrentLocationActivity.this,"缺少定位权限,无法完成定位~",Toast.LENGTH_LONG).show();
                }
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

3.展示获取到的位置数据

定义一个DialogFragment展示数据,不熟悉DialogFragment的同学请参考 AltertDialog在DialogFragment中的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.pansoft.oilgas.gaodenavigation;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

import com.amap.api.location.AMapLocation;


public class ShowLocationFragment extends DialogFragment { 
   
    public static final String KEY_MSG = "location msg";
    private AMapLocation currentLocation;
    public ShowLocationFragment() {
        // Required empty public constructor
    }

    public static ShowLocationFragment newInstance(AMapLocation currentLocation) {
        ShowLocationFragment fragment = new ShowLocationFragment();
        Bundle args = new Bundle();
        args.putParcelable(KEY_MSG,currentLocation);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            currentLocation =getArguments().getParcelable(KEY_MSG);
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());

        builder.setTitle("当前位置信息");
        builder.setMessage(currentLocation.getCity()+"\n"
        +currentLocation.getAddress()+"\n"
        +"当前经纬度: "+currentLocation.getLatitude()+","+currentLocation.getLongitude()+"\n"
        );
        builder.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });
     return builder.create();
    }
}

在onLocationChange成功获取数据后,调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     ShowLocationFragment showFragment=ShowLocationFragment.newInstance(amapLocation);
               showFragment.show(getFragmentManager(),"xxxx");

展示数据

ok,初见成效!

4.在地图上标注我的位置

在原来代码的基础上,添加地图MapView 不熟悉的同学,请参考 加载一张高德地图

在onCreate中添加,获取我的位置的相关部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   // show my location
        aMap.setLocationSource(this);
        aMap.getUiSettings().setMyLocationButtonEnabled(true);
        aMap.setMyLocationEnabled(true);
        aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_FOLLOW);

在QueryCurrentLocationActivity 中实现LocationSource接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        this.onLocationChangedListener=onLocationChangedListener;

    }
  @Override
    public void deactivate() {
        if(mLocationClient!=null){
            mLocationClient.stopLocation();
            mLocationClient.onDestroy();
        }
    }

在定位成功后——onLocationChanged内刷新位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    if(onLocationChangedListener!=null){
                    onLocationChangedListener.onLocationChanged(amapLocation);
                }

ok!

5.完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.pansoft.oilgas.gaodenavigation;

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
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.LocationSource;
import com.amap.api.maps.MapView;

import java.text.SimpleDateFormat;
import java.util.Date;

public class QueryCurrentLocationActivity extends AppCompatActivity implements AMapLocationListener,LocationSource { 
   
    private AMapLocationClientOption mLocationOption = null;
    private AMapLocationClient mLocationClient = null;
    private final int REQ_LOCATION=0x12;
    private MapView mapView;
    private AMap aMap;
    private OnLocationChangedListener onLocationChangedListener;
    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        this.onLocationChangedListener=onLocationChangedListener;
    }
    @Override
    public void deactivate() {
        if(mLocationClient!=null){
            mLocationClient.stopLocation();
            mLocationClient.onDestroy();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mapView=new MapView(this);
        setContentView(mapView);
        aMap=mapView.getMap();
        mapView.onCreate(savedInstanceState);

        mLocationClient = new AMapLocationClient(this);
//初始化定位参数
        mLocationOption = new AMapLocationClientOption();
//设置定位监听
        mLocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000);
//设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
/* 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求 在定位结束后,在合适的生命周期调用onDestroy()方法 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除 启动定位*/

        requestLocationPermission();
    }
    public void requestLocationPermission(){
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},REQ_LOCATION);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==REQ_LOCATION){
            if(grantResults!=null&&grantResults.length>0){
                if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
                   mLocationClient.startLocation();


                }else{
                    Toast.makeText(QueryCurrentLocationActivity.this,"缺少定位权限,无法完成定位~",Toast.LENGTH_LONG).show();
                }
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (amapLocation != null) {
            if (amapLocation.getErrorCode() == 0) {
                if(onLocationChangedListener!=null){
                    onLocationChangedListener.onLocationChanged(amapLocation);
                }
            } else {
                //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                Log.e("AmapError", "location Error, ErrCode:"
                        + amapLocation.getErrorCode() + ", errInfo:"
                        + amapLocation.getErrorInfo());
            }
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
        if(mLocationClient!=null){
            mLocationClient.stopLocation();
            mLocationClient.onDestroy();
        }
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143216.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发之高德地图实现定位
在应用开发中,地图开发是经常需要使用的“组件”,Google Map虽然有官方教程,无奈用不起来,原因你懂的~~那么国内比较出名的是就是百度地图和高德地图,由于个人喜好,所以选择了高德地图LBS,废话
YungFan
2018/04/24
2.6K0
Android开发之高德地图实现定位
Android 高德地图API(详细步骤+源码)一
为了丰富对地图、定位的了解,在写了百度、腾讯的地图定位之后,终于到了高德地图了。我个人平时日常使用最多的定位软件就是高德地图。所以这篇文章,就带你来初步了解使用。
晨曦_LLW
2021/02/20
8.3K8
Android 高德地图API(详细步骤+源码)一
Android 高德地图API(详细步骤+源码)四
首先要搞清楚什么是路线规划,比如有两个地点,A和B。从A到B有多种方路线和交通工具可以选择,这就是路线规划。
晨曦_LLW
2021/03/04
3.6K0
Android 高德地图API(详细步骤+源码)四
Flutter中使用amap_location获取地理位置信息
本文所介绍的获取地理位置信息的Flutter插件是基于高德地图的,所以前期需要针对高德平台做一些准备工作。
越陌度阡
2021/01/13
3K0
Android 高德地图API(详细步骤+源码)二
我删除了TextView,改变了外部的父布局,进入到MainActivity中。按照下图进行改变,你可以将无用的代码删除掉。
晨曦_LLW
2021/02/20
3.7K0
Android 高德地图API(详细步骤+源码)二
Lifecycle解决了什么问题,以及它的基本用法
  我首先来举个大家都比较常见的例子:我们在android开发的时候,经常需要在页面的onCreate()方法中对组件进行初始化,在onPause()方法中停止组件,而在页面的onDestroy()方法中对组件进行资源回收工作。这样的工作非常繁琐,会让页面和组件间的耦合度变高。但这些工作又不得不做,因为可能会引起内存泄漏。
故乡的樱花开了
2023/10/22
3600
Lifecycle解决了什么问题,以及它的基本用法
Android必知必会-带列表的地图POI周边搜索
版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出处,否则禁止转载。 https://micro.blog.csdn.net/article/details/51519223
他叫自己MR.张
2019/07/01
1.6K0
安卓应用安全指南 5.5.1 处理隐私数据 示例代码
在准备应用的隐私政策时,你可以使用“协助创建应用隐私政策的工具” [29]。 这些工具以 HTML 格式和 XML 格式输出两个文件 - 应用隐私策略的摘要版本和详细版本。 这些文件的 HTML 和 XML 内容符合 MIC SPI 的建议,包括搜索标签等特性。 在下面的示例代码中,我们将演示此工具的用法,并使用由这个工具产生的 HTML 文件来展示程序隐私策略。
ApacheCN_飞龙
2022/12/01
2.2K0
基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇5:手机应用开发)
本系统共分为九个模块:系统导航、用户登录、扫码绑定、设备定位、设备状态、历史查询、设备控制、画像分析和系统设置。每个模块对应其各自的功能,通过设备的定位、设备的实时状态及设备控制能够全方位监控路灯的耗能量及使用情况。画像分析也可对某地方或某用户进行大数据AI分析得到监测数据,并且能够实时向用户推送用电情况,并为其用户进行合理的用电安排及方案。
不脱发的程序猿
2021/01/20
8700
百度地图SDK使用[通俗易懂]
在main 目录下新建jniLibs文件夹,并将百度地图给的sdk里剩下的so文件导入
全栈程序员站长
2022/09/07
6250
百度地图SDK使用[通俗易懂]
Android MVVM框架搭建(八)高德地图定位、天气查询、BottomSheetDialog
  在上一篇文章中完成了对个人用户信息的修改,同时讲述了对弹窗数据的处理,权限的使用,本文将在App中接入一个地图SDK,同时完成天气的查询,完成后的效果如下图所示:
晨曦_LLW
2021/12/27
2K0
Android MVVM框架搭建(八)高德地图定位、天气查询、BottomSheetDialog
Android高德之旅(1)基础地图
这个系列之前在CSDN上就发了,不过刚开始就因为公司项目忙搁置了,现在转移阵地到简书,希望这次能坚持把这个系列做完。
大公爵
2018/09/05
9560
Android高德之旅(1)基础地图
高德定位SDK_高德地图api使用教程
1.LocationManagerProxy 获取当前Context 创建一个LocationManagerProxy 变量 mAMapLocManager = LocationManagerProxy.getInstance(this);
全栈程序员站长
2022/09/19
1.7K0
百度map android sdk3.5实现定位 并跳转的指定坐标,加入标记
// 定义地图状态zoom表示缩放级别3-18 MapStatus mMapStatus = new MapStatus.Builder().target(cenpt) .zoom(14).build(); // 定义MapStatusUpdate对象。以便描写叙述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory .newMapStatus(mMapStatus); // 改变地图状态 // 开启定位图层 mMapView.getMap().setMapStatus(mMapStatusUpdate);
全栈程序员站长
2022/07/07
6880
安卓开发_慕课网_百度地图_实现方向传感器
学习内容来自“慕课网” 这里学习百度地图方向传感器功能 就是当转动手机的时候,地图上显示个人所在位置的图标的箭头变动 学习接自前两篇 安卓开发_慕课网_百度地图 安卓开发_慕课网_百度地图_实现定位 思路: 传感器随着定位的开始而开启,随着定位的结束而结束 传感器获得位置的移动而更新方向 代码在前两篇的基础上修改 一、讲原本坐标的图标改成箭头图标 二、引入方向传感器 首先增添MainActivity.java中的自定义图标和方向传感器代码 看红色字体的部分 1 package com.example.m
听着music睡
2018/05/18
7640
Arcgis For Android之GPS定位实现
翻开以前做的东西,看了看,很多从逻辑上比较乱,对之做了修改,完成后实现的效果为: MapActivity源代码如下: package com.lzugis.map; import java.io.File; import java.util.Iterator; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.location.Gps
牛老师讲GIS
2018/10/23
1.9K0
Android使用百度地图定位并显示手机位置后使用前置摄像头“偷拍”
拿到这个需求后,对于摄像头的使用不太熟悉,于是我先做了定位手机并在百度地图上显示的功能
LoveWFan
2018/08/07
1.5K0
Android使用百度地图定位并显示手机位置后使用前置摄像头“偷拍”
在viewPager里使用高德地图
因为viewpager的预加载机制,使得联网应用会多出内存以及网络的使用量,同时,在viewpager下使用高德地图,也会因此出现各种莫名其妙的问题,因此,需要使用懒加载的手段。 实现懒加载,只需继承fragment类然后重写与界面显示相关的方法即可。
用户1665735
2019/02/19
2.4K0
Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
PermissionsDispatcher2.3.2使用 Android6.0权限官网 https://developer.android.com/about/versions/marshmallo
庞小明
2018/03/07
1.7K0
Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
推荐阅读
相关推荐
Android开发之高德地图实现定位
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验