开发 Android 轻量版地图SDK 开发指南 创建地图 显示地图

显示地图 最后更新时间: 2023年11月10日

使用地图SDK之前,需要在 AndroidManifest.xml 文件中进行相关权限设置,确保地图功能可以正常使用。

第一步,配置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" /> 
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

然后,设置高德Key

在application标签中加入如下内容:

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

点我获取Key

点我查看Key注册时必要数据SHA1和包名的获取方法

第二步,向工程中添加地图开发包

将jar包放入libs目录下,依次添加依赖。

dependencies {
 implementation files("libs/Android_Lite3DMap_SDK_V1.1.0_20210201.jar")
		//...
}

或者直接使用引入libs下所有jar包的方式:

dependencies {
 implementation fileTree(dir: "libs", include: ["*.jar"])
		//...
}

第三步,初始化地图容器

首先,准备WebView

WebView 是Android系统提供的View,也可以是用户自定义的WebView如UCWebView,用于在 Android View 中放置地图。 WebView 是地图容器。用 WebView 加载地图的方法与 Android 提供的其他 View 一样。

注意:以下示例均用Android系统的WebView来实现,其他自定义WebView可以参考实现。

具体的使用步骤如下:

<com.amap.maps.jsmap.demo.webview.MyWebView
 android:id="@+id/webview"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

为了保证功能正常运行,WebView需要打开部分开关。在项目中MyWebView集成自WebView,可以把开平封装到MyWebView内部。

public class MyWebView extends WebView {
 public MyWebView(Context context) {
 this(context, null);
 }
 public MyWebView(Context context, AttributeSet attrs) {
 super(context, attrs);
 initBridgeWebView(context, attrs);
 }
 public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 initBridgeWebView(context, attrs);
 }
 @SuppressLint("SetJavaScriptEnabled")
 private void initBridgeWebView(Context context, AttributeSet attrs) {
 WebSettings settings = getSettings();
 //允许使用js
 settings.setJavaScriptEnabled(true);
 settings.setDomStorageEnabled(true);
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
 //设置适应Html5
 settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
 }
 // 设置WebView属性,能够执行Javascript脚本
 settings.setDefaultTextEncodingName("utf-8");
 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
 setWebContentsDebuggingEnabled(true);
 }
 // android 4.1
 //允许webview对文件的操作
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
 settings.setAllowUniversalAccessFromFileURLs(true);
 }
 settings.setAllowFileAccess(true);
 // android 4.1
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
 settings.setAllowFileAccessFromFileURLs(true);
 }
 settings.setAllowContentAccess(true);
 settings.setDatabaseEnabled(true);
 // 允许bolb请求过不了
 settings.setAllowFileAccessFromFileURLs(true);
 // 允许本地的缓存
 settings.setAllowUniversalAccessFromFileURLs(true);
 setWebChromeClient(new WebChromeClient());
 }
}

然后,创建IAMapWebView桥接

IAMapWebView.java 中包含了SDK内部需要用到WebView的接口,这一步非常重要,如果不实现地图将无法展示。

public class MAWebViewWrapper implements IAMapWebView {
 private final WebView webView;
 private WebViewClient mapWebViewClient;
 public MAWebViewWrapper(final WebView webView) {
 this.webView = webView;
 if (this.webView != null) {
 this.webView.setWebViewClient(
 new WebViewClient() {
 @TargetApi(Build.VERSION_CODES.N)
 @Override
 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
 if (mapWebViewClient != null) {
 boolean flag = mapWebViewClient.shouldOverrideUrlLoading(view, request);
 if (flag) {
 return true;
 }
 }
 return super.shouldOverrideUrlLoading(view, request);
 }
 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
 @Override
 public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
 if (mapWebViewClient != null) {
 WebResourceResponse flag = mapWebViewClient.shouldInterceptRequest(view, request);
 if (flag != null) {
 return flag;
 }
 }
 return super.shouldInterceptRequest(view, request);
 }
 @Override
 public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
 if (mapWebViewClient != null) {
 WebResourceResponse flag = mapWebViewClient.shouldInterceptRequest(view, url);
 if (flag != null) {
 return flag;
 }
 }
 return super.shouldInterceptRequest(view, url);
 }
 }
 );
 }
 }
 @Override
 public void evaluateJavascript(String jsCallSig, ValueCallback<String> callback) {
 if (this.webView != null) {
 this.webView.evaluateJavascript(jsCallSig, callback);
 }
 }
 @Override
 public void loadUrl(String toString) {
 if (this.webView != null) {
 this.webView.loadUrl(toString);
 }
 }
 @Override
 public void addAMapJavascriptInterface(IAMapJsCallback object, String javascriptInterfaceName) {
 if (this.webView != null) {
 this.webView.addJavascriptInterface(object, javascriptInterfaceName);
 }
 }
 @Override
 public void setWebViewClient(WebViewClient webViewClient) {
 this.mapWebViewClient = webViewClient;
 }
 @Override
 public int getWidth() {
 if (this.webView != null) {
 return this.webView.getWidth();
 }
 return 0;
 }
 @Override
 public int getHeight() {
 if (this.webView != null) {
 this.webView.getHeight();
 }
 return 0;
 }
 @Override
 public void addView(View v, ViewGroup.LayoutParams params) {
 if (webView != null && v != null) {
 webView.addView(v, params);
 }
 }
}

接着,创建地图控制对象

创建地图时使用AMapWrapper

AMapWrapper aMapWrapper = new AMapWrapper(this, webViewWrapper);

注意:如果为了缩短启动时间,可以在后台先执行到这一步,后续的步骤可以在需要展示地图的时候才执行。

最后,初始化地图并获取AMap对象

aMapWrapper.onCreate();
aMapWrapper.getMapAsyn(new AMap.OnMapReadyListener() {
 @Override
 public void onMapReady(AMap map) {
 //todo
 }
});

至此就可以看到地图展示,并且在onMapReady中拿到了AMap对象后,就可以往地图上添加点线面等覆盖物。

示例中心 常见问题

AltStyle によって変換されたページ (->オリジナル) /