开发 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对象后,就可以往地图上添加点线面等覆盖物。 

返回顶部 示例中心 常见问题 智能客服 公众号
二维码