显示地图 最后更新时间: 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>
第二步,向工程中添加地图开发包
将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对象后,就可以往地图上添加点线面等覆盖物。