简单的显示高德SDK中的3D地图

身为一个安卓小白,前几天试了一下高德SDK,踩了几个蠢蠢的坑,秉承着别让其他小白也踩到,我就写一篇怎么简单的实现高德SDK显示地图与小蓝点的教程。

获得key

1、先注册一个高德开发者的账号,上传认证后打开控制台,点击左侧列表->应用管理->我的应用

点击界面y右上角的创建新应用
这两项可以随便写

点击创建后,界面会出现一个你新建应用的项目,点击右上角的加号添加一个key。

创建key的界面如图,名字可以随便写,选择Android平台,接下来看如何获得到SHA1与包名。

特别注意:这里你创建的每个项目都有一个唯一的SHA1码,在这里填写后,在别的项目中用这个key就会出错,所以只能一个key对应一个项目。高德在你创建key时也会提醒你的。
现在新建一个新项目吧
Android Studio中点击界面中最右边的gradel按钮

在弹出的列表中选择app->android->signingReport,双击运行

运行结果中有一行SHA1,就是他了,复制粘贴

之后一定要把运行状态弄回去,在屏幕上边中间,把它改回app,要不之后会一直运行这个(这个我找了半天原因原谅我的白痴嘤嘤嘤)

之后就只剩下包名了,你可以在创建项目的时候就把包名复制上,或者打开AndroidManifest.xml 最上面一行就有了。

创建完毕后,你就可以在界面里看到生成的key啦!是不是很简单呢。

导入SDK包

这里借助高德自己的开发文档也十分不错,小白我当时也是看的开发文档结合自己的问题百度,最后做成的。开发文档在控制台里看右上角就有啦
附带一个传送门:高德开发文档
因为我是用AS实现的,如果是Eclipse也可以去看开发文档

下面就是下载地图与定位的SDK包啦,一共是两个包,5.0后的地图包支持了直接显示小蓝点,所以也可以不用下载定位包(因为本教程是超简单的那种,还不需要定位包)总共要配置两种文件,一种是jar包,一种是so文件

地图下载传送门
定位下载传送门

这里我选的都是一键下载。也可以在这个界面里点进地图SDK或定位SDK,再在左侧列表中点击入门指南,里面会有SDK下载地址的。

下载好后解压,你的文件应该是这样的

每个压缩包都会有demo和相应文档,咱们现在只看要导入的文件即可。

定位文件中,只需要这个jar包

地图文件中,咱们先只看3d的压缩包,解压出来是这样的

好了,现在先把jar包导入到libs里吧,看AS左边的列表,我这里默认是Android,所以看不见libs,选择Project就看见啦

libs文件夹在这里,app里的那个文件夹,jar包复制粘贴进去即可。

此时jar包是这样的

右键jar包选择Add As Library…,他就会自动sync啦,而且是一次把libs里面的包都导入进去

怎么看导没导入呢,导入后包的左边会有一个小箭头就是导入啦,接下来在Android里找到两个build.gradle(Project里也可以找到,但是Android里找比较方便),可以看到两个gradle一个是Project:xxx,一个是Module:app,小白我只知道后者经常用于添加依赖(嘤嘤嘤),但是千万不要把两者搞混了啊

在app的build.gradle文件中拉到最下面的dependencies里有这样一条语句,这就是把libs里的jar包都添加了依赖的意思,接下来咱们解决so文件(就是剩下的一堆文件夹)
implementation fileTree(include: ['*.jar'], dir: 'libs')
还是用列表的Project模式,app->src->main里创建一个文件夹叫jniLibs,把文件夹都复制粘贴进去

接下来声明权限

在配置文件(AndroidManifest)中 把高德开发文档中的权限复制粘贴(嘿嘿嘿)与application平行关系。

//地图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" />

然后在application里面设置key

<meta-data android:name="com.amap.api.v2.apikey" android:value="开发者申请的key"></meta-data>
<meta-data android:name="com.amap.api.v2.apikey"

配置好的配置文件差不多是这样的

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.project.mapagain"><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"><meta-data android:name="com.amap.api.v2.apikey"android:value="f325222f2ba783e370ebc76d5e1c63f3"></meta-data><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><!--允许程序打开网络套接字--><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" /></manifest>

接下来初始化地图容器吧

在layout中加入MapView控件,代码大体是这样的

<?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"tools:context=".MainActivity"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

在MainActivity中声明、实例化控件、重写一下生命周期,把地图都加进去,然后AMap用来显示地图

package com.project.mapagain;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.PersistableBundle;import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;public class MainActivity extends AppCompatActivity {private MapView mapView = null;private AMap aMap = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mapView = (MapView) findViewById(R.id.map);//保存地图状态mapView.onCreate(savedInstanceState);if(aMap == null) {//显示地图aMap = mapView.getMap();}}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overridepublic void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {super.onSaveInstanceState(outState, outPersistentState);mapView.onSaveInstanceState(outState);}
}

接下来显示地图了吗?(小白这次竟然直接出来了,不科学),如果没有出来,试试这样操作
在res文件夹中创建一个xml文件夹,里面创建一个xml文件,里面内容如下

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true" />
</network-security-config>


然后在配置文件中声明

android:networkSecurityConfig="@xml/network_security_config"


在运行一下,看看有没有了呢
如果显示地图了,大概会是这样的

显示定位蓝点

5.0版本后,不用定位SDK也可以实现定位蓝点了,来试一下吧,这里直接粘代码了,这里我又加了一个TextView用来显示经纬度,记得添加动态权限申请哦(代码里加了)

package com.project.mapagain;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
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.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.MyLocationStyle;public class MainActivity extends AppCompatActivity {private MapView mapView;private TextView textView;private AMap aMap = null;private UiSettings mUiSettings;private AMapLocationClient mapLocationClient = null;private AMapLocationClientOption mapLocationClientOption = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mapView = (MapView) findViewById(R.id.map);textView = (TextView) findViewById(R.id.text);//保存地图状态mapView.onCreate(savedInstanceState);startLocation();mapLocationClientOption = new AMapLocationClientOption();mapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);mapLocationClientOption.setInterval(2000);mapLocationClientOption.setMockEnable(true);mapLocationClient = new AMapLocationClient(this);mapLocationClient.setLocationListener(locationListener);mapLocationClient.setLocationOption(mapLocationClientOption);mapLocationClient.startLocation();initMap();}AMapLocationListener locationListener = new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if(null != aMapLocation) {if(aMapLocation.getErrorCode() == 0) {textView.setText(aMapLocation.getLongitude()+ "\n"+ aMapLocation.getLatitude() + "\n"+ aMapLocation.getAddress());} else {textView.setText("错误");}}}};private void initMap() {if(aMap == null) {aMap = mapView.getMap();}MyLocationStyle myLocationStyle;myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。aMap.setMyLocationEnabled(true);//放大地图aMap.moveCamera(CameraUpdateFactory.zoomTo(13));mUiSettings = aMap.getUiSettings();mUiSettings.setCompassEnabled(true);mUiSettings.setScaleControlsEnabled(true);}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overridepublic void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {super.onSaveInstanceState(outState, outPersistentState);mapView.onSaveInstanceState(outState);}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {} else {Toast.makeText(this, "禁止了定位权限", Toast.LENGTH_SHORT).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}private void startLocation() {if(Build.VERSION.SDK_INT >= 23) {int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);if(checkPermission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);return;} else {}} else {}}
}

简单的效果图就是这样哒(原谅俺打满马赛克啦)

Android - 简单的显示高德SDK中的3D地图相关推荐

  1. Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)

    日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...

  2. 在Map 3D显示管理器中更改当前地图的名字

    By Daniel Du 当前地图在显示管理器中默认的名字是"Default",如果你想通过程序更改地图的名字,可以用下面的代码来实现.你需要使用Display Manager A ...

  3. android拍照模糊,解决Android拍照并显示在ImageView中变模糊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public class ImageThumbnail { public static int reckonThumbnail(int oldWidth, ...

  4. 由神秘到简单 教你在网页中添加微软地图

    自Google推出地图服务以后,微软和百渡也相继推出地图服务.地图成为目下网络流行的时尚,如果你想追赶它,那么来吧,我将会帮助你学会使用微软的Virtual Earth Map Control,为你的 ...

  5. Android接入高德地图SDK,Android高德SDK 地图篇一:集成高德SDK

    Android高德SDK 地图篇一:集成高德SDK 大家好,这是系列博文的第一篇: 系列博文会完成以下功能 一. 地图篇:利用高德SDK实现滴滴出行的效 二. 导航篇:利用高德SDK实现滴滴司机端的效 ...

  6. android打包jar包给unity使用接入高德sdk,实现定位。

    https://blog.csdn.net/unity_http/article/details/79929454 https://blog.csdn.net/why1happy/article/de ...

  7. Android去掉百度地图sdk中卫星地图里的白色道路

    最近开发一个APP,需要去掉百度地图sdk中的卫星地图里面的白色道路,没有去掉之前: 如上图各种白色道路割裂了卫星地图进行图层绘制的时候不太美观,于是就百度了如何去掉道路,并且也提交了工单询问百度地图 ...

  8. 移动端地图技术分享 百度高德SDK

    移动端地图技术分享 字数4797 阅读8121 评论7 喜欢16 http://www.jianshu.com/p/41179be5893a 该文章属于<简书 - 刘小壮>原创,转载请注明 ...

  9. 高德地图api调用demo_一 (1)高德SDK的使用

    1 申请高德SDK 需要填写SHA1安全码&包名 文档解决方案 https://lbs.amap.com/faq/top/hot-questions/249 package name 获取bu ...

最新文章

  1. C++成员变量的初始化顺序问题
  2. Crossing Rivers UVA - 12230 概率与期望
  3. apache php value,apache-2.2 – 错误启动Apache“php value”
  4. php解析乱码字符串,PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
  5. linux内存free低,Linux上的内存使用情况与`free`不匹配
  6. java 控制台刷屏 dll_Java刷屏问题,下面是我编的代码,请大神帮忙解决下,谢谢...
  7. java getclass方法_JAVA-初步认识-第十一章-object类-Getclass方法
  8. Uncaught SyntaxError - unexpected end of input
  9. ORA-20446: The owner of the job is not registered ORA-06512: at SYSMAN.MGMT
  10. php列表框怎么用,PHP+Mysql+jQuery查询和列表框选择操作实例讲解
  11. 计算机组成原理————P1 软硬件发展
  12. 2018 CodeM复赛:B. 软件包管理器(二分)
  13. JAVA中super和this关键字的区别
  14. 编译telepresence:没有规则可制作目标“tinywrap/ActionConfig.cxx”,由“telepresence-ActionConfig.o” 需求。
  15. html5svg在线编辑器,五款超实用的开源SVG工具
  16. 那些让人忍不住推荐的思维导图软件
  17. Qt实践2: 简易计算器
  18. java 去除图片背景_java如何去除图片中的白色背景
  19. 【青少年编程】【二级】小瓢虫找妈妈
  20. 升级最快双核 小米1S手机开箱多图赏析

热门文章

  1. MySQL_15_MySQL底层SQL查询成本计算
  2. 亲测javaWeb的Excel的文件导入
  3. Java定时任务技术分析
  4. SQL Server数据库开发
  5. IntelliJ IDEA单元测试入门
  6. SystemInfo.deviceUniqueIdentifier
  7. TensorFlow学习笔记(一)---graph,op,tensor,Session,Variables,Tensorboard
  8. 8,verilog基本逻辑运算
  9. UDT:基于UDP的可靠传输协议
  10. 【Nios II】以SOPC开发流程完成流水灯以及串口输出实验