由于本人使用的是android studio,所以就以android studio为例。

一、申请密钥、添加依赖以及添加权限

1、在工程顶级 build.gradle 文件中加入:

maven{url "https://oss.sonatype.org/content/groups/public"
}

2、module build.gradle 文件中添加依赖库名称:

implementation 'com.tencent.map:tencent-map-vector-sdk:4.3.5'

3、申请开发秘钥,具体可参考开发文档,此处就不演示。
https://lbs.qq.com/android_v1/guide-project-setup.html

4、在AndroidManifest.xml中添加权限。

 <uses-permission android:name="android.permission.INTERNET"/><!--检查网络可用性--><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.WRITE_EXTERNAL_STORAGE"/><!--获取 device id 辨别设备--><uses-permission android:name="android.permission.READ_PHONE_STATE"/>

5、在application中输入开发秘钥。

<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".activity.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><meta-data android:name="TencentMapSDK" android:value="你的开发秘钥" /></application>

以下是定位图片效果展示:

二、代码展示

1、单独实现定位功能。
创建一个MyMapActivity继承BaseActivity,并实现一些父类。
由于代码中有详细的注释,这里就不一一解释了。

public class MyMapActivity extends BaseActivity implements TencentLocationListener, LocationSource, TencentMapGestureListener {@BindView(R.id.mv)MapView mv;private TencentLocationManager mLocationManager;private TencentMap mTencentMap;private TencentLocationRequest mRequest;private OnLocationChangedListener mLocationChangedListener;//将经纬度定义为全局变量,方便导航功能使用//为了方便导航,此处经纬度我写固定的。可以视情况而定。private double mLatitude = 23.112159;  private double mLongitude = 113.329768;  private Location mLocation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_map);ButterKnife.bind(this);initView();checkPermission();}//检测权限private void checkPermission() {if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//申请权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 222);//自定义的code}}private void initView() {mLocation = getLocation(this);mLocationManager = TencentLocationManager.getInstance(this);//创建定位请求mRequest = TencentLocationRequest.create();mTencentMap = mv.getMap();//地图上设置定位数据源mTencentMap.setLocationSource(this);//设置当前位置可见mTencentMap.setMyLocationEnabled(true);mTencentMap.addTencentMapGestureListener(this);mLocationManager.requestSingleFreshLocation(null, this, Looper.getMainLooper());}public Location getLocation(Context context) {LocationManager locMan = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);Location location = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);if (location == null) {location = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);}return location;}/*** 腾讯定位SDK位置变化回调** @param tencentLocation* @param i* @param s*/@Overridepublic void onLocationChanged(TencentLocation tencentLocation, int i, String s) {BJLog.i("onLocationChanged:" + tencentLocation.getAddress() + " i:" + i + " s:" + s);if (i == TencentLocation.ERROR_OK && mLocationChangedListener != null) {Location location = new Location(tencentLocation.getProvider());//设置经纬度location.setLatitude(tencentLocation.getLatitude());location.setLongitude(tencentLocation.getLongitude());//设置精度,这个值会被设置为定位点上表示精度的圆形半径location.setAccuracy(tencentLocation.getAccuracy());//设置定位标的旋转角度,注意 tencentLocation.getBearing() 只有在 gps 时才有可能获取location.setBearing((float) tencentLocation.getBearing());//将位置信息返回给地图mLocationChangedListener.onLocationChanged(location);}}@Overridepublic void onStatusUpdate(String s, int i, String s1) {}@Overridepublic void activate(OnLocationChangedListener onLocationChangedListener) {//这里我们将地图返回的位置监听保存为当前 Activity 的成员变量mLocationChangedListener = onLocationChangedListener;}@Overridepublic void deactivate() {//当不需要展示定位点时,需要停止定位并释放相关资源mLocationManager.removeUpdates(this);mLocationManager = null;mLocationManager = null;mLocationManager = null;}@Overridepublic boolean onDoubleTap(float v, float v1) {return false;}@Overridepublic boolean onSingleTap(float v, float v1) {return false;}@Overridepublic boolean onFling(float v, float v1) {return false;}@Overridepublic boolean onScroll(float v, float v1) {return false;}@Overridepublic boolean onLongPress(float v, float v1) {return false;}@Overridepublic boolean onDown(float v, float v1) {return false;}@Overridepublic boolean onUp(float v, float v1) {return false;}@Overridepublic void onMapStable() {}//创建地图视图之后,需要跟应用绑定生命周期,以保障地图在应用的不同生命周期中,能够正确地处理显示和刷新逻辑@Overrideprotected void onStart() {super.onStart();mv.onStart();}@Overrideprotected void onResume() {super.onResume();mv.onResume();}@Overrideprotected void onStop() {super.onStop();mv.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();mv.onDestroy();}
}

2、若想要实现导航功能,就拿我们经常使用的百度地图、高德地图、腾讯地图而言吧。
首先自定义一个Dialog并设置为全局变量。(这并不是唯一的方法,仅供参考)

private Dialog mMapDialog;

注:个人建议把自定义Dialog单独写出来,不要放在Activity中,在此为了方便阅读,就放一起了。

3、定义一个initShareDialog()方法,弹出选择地图的窗口。

private void initShareDialog() {// 可以使用这个: ll_dynamicDetail_bottommMapDialog = new Dialog(this, R.style.dialog_bottom_full);mMapDialog.setCanceledOnTouchOutside(true); //手指触碰到外界取消mMapDialog.setCancelable(true);             //可取消 为trueWindow window = mMapDialog.getWindow();      // 得到dialog的窗体window.setGravity(Gravity.BOTTOM);window.setWindowAnimations(R.style.share_animation);View shareView = View.inflate(this, R.layout.dialog_maps, null); //获取布局视图TextView tvBaidu = shareView.findViewById(R.id.tv_baidu);TextView tvTengxun = shareView.findViewById(R.id.tv_tengxun);TextView tvGaode = shareView.findViewById(R.id.tv_gaode);TextView tvCancel = shareView.findViewById(R.id.tv_cancel);Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);//百度地图if (isAvilible(this, "com.baidu.BaiduMap")) {tvBaidu.setVisibility(View.VISIBLE);}//高德地图if (isAvilible(this, "com.autonavi.minimap")) {tvGaode.setVisibility(View.VISIBLE);}//腾讯地图if (isAvilible(this, "com.tencent.map")) {tvTengxun.setVisibility(View.VISIBLE);}tvBaidu.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {Intent intent_baidu = Intent.getIntent("intent://map/direction?" +"destination=latlng:" + mLatitude + "," + mLongitude +"|name:我的终点" +        //终点"&mode=driving&" +          //导航路线方式"&src=appname#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");startActivity(intent_baidu); //启动调用mMapDialog.dismiss();} catch (Exception e) {e.printStackTrace();}}});tvGaode.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//将功能Scheme以URI的方式传入dataUri uri = Uri.parse("androidamap://navi?sourceApplication=appname&poiname=fangheng&lat=" + mLatitude + "&lon=" + mLongitude + "&dev=1&style=2");intent.setData(uri);//启动该页面即可startActivity(intent);mMapDialog.dismiss();}});tvTengxun.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//将功能Scheme以URI的方式传入dataUri uri = Uri.parse("qqmap://map/routeplan?type=drive&to=我的终点&tocoord=" + mLatitude + "," + mLongitude);intent.setData(uri);startActivity(intent);mMapDialog.dismiss();}});tvCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mMapDialog.dismiss();}});//若手机没有百度地图、高德地图、腾讯地图,则提示用户安装。if (!isAvilible(this,"com.tencent.map")&& !isAvilible(this, "com.baidu.BaiduMap")&& !isAvilible(this, "com.autonavi.minimap")){Toast.makeText(this, "手机没有地图软件,请安装后重试!", Toast.LENGTH_SHORT).show();return;}WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);window.setContentView(shareView, params);window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);//设置横向全屏mMapDialog.show();}

4、在定义一个isAvilible()方法,判断手机中是否有某个程序的包。

private boolean isAvilible(Context context, String packageName) {//获取packagemanagerfinal PackageManager packageManager = context.getPackageManager();//获取所有已安装程序的包信息List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);//用于存储所有已安装程序的包名List<String> packageNames = new ArrayList<>();//从pinfo中将包名字逐一取出,压入pName list中if (packageInfos != null) {for (int i = 0; i < packageInfos.size(); i++) {String packName = packageInfos.get(i).packageName;packageNames.add(packName);}}//判断packageNames中是否有目标程序的包名,有TRUE,没有FALSEreturn packageNames.contains(packageName);}

5、在initView()中加入以下代码,点击定位表便可实现。

     //SDK版本4.3.5新增内置定位标点击回调监听mTencentMap.setMyLocationClickListener(new TencentMap.OnMyLocationClickListener() {@Overridepublic boolean onMyLocationClicked(LatLng latLng) {initShareDialog();return true;}});

下面是导航实现效果。

6、在style文件中样式:

 <!-- 对话框样式 --><style name="dialog_bottom_full" parent="android:style/Theme.Dialog"><item name="android:windowBackground">@android:color/transparent</item><item name="android:windowNoTitle">true</item><item name="android:windowIsFloating">true</item><item name="android:windowContentOverlay">@null</item><item name="android:scrollHorizontally">true</item></style>
 <!--弹出框动画--><style name="share_animation" parent="android:Animation"><item name="android:windowEnterAnimation">@anim/dialog_enter</item><item name="android:windowExitAnimation">@anim/dialog_exit</item></style>

7、Dialog的样子:dialog_maps

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/round_share_bg"android:paddingLeft="15dp"android:paddingRight="15dp"><TextViewandroid:id="@+id/tv_baidu"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="百度地图"android:textColor="@color/color333"android:textSize="18sp"android:visibility="gone"/><TextViewandroid:id="@+id/tv_gaode"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="高德地图"android:textColor="@color/color333"android:textSize="18sp"android:visibility="gone"/><TextViewandroid:id="@+id/tv_tengxun"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="腾讯地图"android:textColor="@color/color333"android:textSize="18sp"android:visibility="gone"/><TextViewandroid:id="@+id/tv_cancel"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="取消"android:textColor="@color/dialog_submit_color"android:textSize="18sp"/></LinearLayout>

以上就是定位与导航功能的实现,若有讲得不好的地方,还请大佬们指出改正。

在安卓开发中,使用腾讯地图实现定位与导航功能相关推荐

  1. 在H5中使用腾讯地图,实现定位,距离计算,实时搜索,地址逆解析

    在H5中使用腾讯地图,实现定位,距离计算,实时搜索,地址逆解析 1.创建应用 2.下载微信sdk包 3.安装`vue-jsonp` 4.使用 获取当前位置信息,逆解析地址 路线规划,距离计算 实时搜索 ...

  2. 安卓开发中非常炫的效果集合

    安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始从网上收集各种特效资源.下面给大家一些我喜欢的把,附代码,喜欢的看源代码,然后加到自己项目去把!! 一个开源项目网站 ...

  3. Android安卓开发中图片缩放讲解

    安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法: 方法1:按固定比例进行缩放 在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们 ...

  4. Android Studio安卓开发中使用json来作为网络数据传输格式

    如果你是在安卓开发中并且使用android studio,要使用json来作为数据传输的格式,那么下面是我的一些经验. 一开始我在android studio中导入那6个包,那6个包找了非常久,因为放 ...

  5. vue中使用百度地图为啥是空白_vue中使用腾讯地图(尝试篇)

    引入 在index.html文件中引入腾讯地图js文件,XXX为你申请的key 注意事项:为显示地图的元素设置宽高 单个标注点 js: 在mounted生命周期或者从后台接口获得信息后调用初始化地图方 ...

  6. 安卓开发中的USB转串口通讯

    安卓开发中的USB转串口通讯 本文使用GitHub上开源的"hoho.android.usbserial"USB串口库.该库基于"Android USB Host API ...

  7. html5页面中添加腾讯地图api

    html5页面中添加腾讯地图api: 点击地图出现详细的地图: 这是一个基于微信端的地图处理方案. 先看看html架构: <a id="aToMap" href=" ...

  8. 安卓开发中的重力感应传感器

    2019独角兽企业重金招聘Python工程师标准>>> 安卓开发中拥有多种传感器,google提供了11种传感器供应用层使用:加速度.磁力.方向.陀螺仪.光线.压力(返回当前压强). ...

  9. vue中使用腾讯地图选择地址

    腾讯地图选择地址引发的一系列问题 2019/12/14更新 修复了自治区/直辖市无法选择的bug(比如上海之类的城市) 采用更加友好的方式来选择地址 新的文章链接:vue中使用腾讯地图选择地址(二) ...

最新文章

  1. Python 谁是小偷? 嫌疑人A、B、C、D的笔录如下,其中三人为真,一人为假:
  2. 24张IT工程师技能图谱,这些你都会吗?
  3. C函数数组元素初始化
  4. linux上git克隆命令,Git clone命令用法
  5. ios 图片居中裁剪_[ iOS Shortcuts / Workflow ] 分享一个给照片批量加「底部居中偏上」水印的捷径,可适应不同水印的尺寸...
  6. math.trunc_带有Python示例的math.trunc()方法
  7. 通信协议规格_小米和阿里巴巴定义智能家居通信协议“蓝牙Mesh”
  8. java set的作用,Java的自学之路-构造方法 的作用以及与set方法的区别
  9. ETL调度开发(5)——连接数据库运行数据库命令子程序
  10. 移动APP测试用例设计的关注点
  11. wangEditor 上传附件
  12. 检索网络方向的学生选修先行课为计算机网络,等价的关系代数表达式,其执行效率也是一样的。...
  13. 香港消委会:大部分航空公司超卖机票无赔偿细则
  14. alios下载_AliOS Studio下载
  15. 数据分析实战项目2:优衣库销售数据分析
  16. ajax 异步刷新表格
  17. js一键批量打印_web页面的单页打印以及批量打印实现方法
  18. 07_建造者模式(方式一)
  19. 全志科技/汇顶科技/兆易创新营收与存储器涨价潮有啥关系?
  20. python代码电影人物关系_以腾讯5000部电影为例,告诉你Python数据分析该怎么做...

热门文章

  1. 广西民族大学相思湖学院计算机考试,广西民族大学相思湖学院教务处,教务管理系统...
  2. DCOS之监控技术选型(中)
  3. Mqtt开发java开发-消息服务mns中的一些坑
  4. IMEI码一点通;你想知道关于申请、使用TAC/IMEI的问题都在这。
  5. 表的概念(Oracle)
  6. Warning: L6305W: Image does not have an entry point. (Not specified or not set due to multi
  7. 【Labview学习】——如何实现软件的中/英文切换
  8. android加入图片命名规则
  9. 赢鸡:2010年2月网络经典段子集锦
  10. 国内ChatGPT的镜像网站分享