快速入门for AndroidStudio

最后更新时间:2021年6月17日

APP GIS 数据准备

在移动GIS开发应用中,地图数据组织与配置是第一步,非常关键,地图数据配置好后才能进行显示和操作。

MapGIS 10.5三端数据同源,统一内核,针对移动端应用使用HDB数据库方式存储管理二、三维地图数据,即拿即用。MapGIS Mobile 10.5全面支持在线地图和离线地图模式,在线地图实现了和PC端数据服务器的完美对接,支持接入OGC服务、第三方公共地图服务等;离线地图则实现本地移动端地图数据的加载,不需在线GIS服务器的支持(即脱离MapGIS IGServer服务器)。

>>移动端的地图数据组织与配置

说明:在进行移动GIS应用开发前,需要根据应用需求制定应用数据组织方案,即在线地图或离线地图,然后相应准备地图数据并进行配置。

当前入门示例以离线地图——武汉市的矢量地图文档(WuHan.mapx)为例,将此地图文档的整个数据文件一起拷贝到移动端设备(如真机或模拟器)的sdcard根目录下,路径为:/sdcard/MapGISSample/Map/MapShow/WuHan.mapx。即将【MapGISSample】文件夹整个数据文件一起拷贝,包含离线数据库文件、地图文档文件、地图基本库(符号库、颜色库、字体库),以确保地图正常显示。

040拷贝离线地图文件.png

创建第一个“Hello World”项目

Android Studio是目前主流的Android开发集成开发环境。下面从零开始,在Android Studio中创建一个全新的“Hello World”项目,实现一个简单的应用程序,旨在帮助大家初次了解和学习在Android Studio集成环境下的Android开发,为大家演示Android Studio中最为重要的一部分功能特性。

1

新建Android Studio项目

启动Android Studio,选择【Start a new Android Studio project】,进入新建项目界面,进行新项目的基本配置,设置应用程序名称、项目存储路径,设置好后点击【Next】进入下一步骤;如果已经打开Android Studio主界面,也可以通过点击【File】->【New】->【New Project】新建项目。

041新建AS项目.png

APP项目的基本配置项:

042AS项目设置.png    

2

设置运行的目标设备与SDK

完成项目基本设置后,下一步需设置运行的目标设备与SDK。如下图所示,勾选程序运行的设备类型为手机开发“Phone and Tablet”,默认的最低SDK版本(API 15)。

043选择设备与SDK.png

其中,程序运行的设备类型为: Phone and Tablet:手机和平板 ; Wear:穿戴设备; TV:电视; Android Auto:车载设备; Android Things:智能硬件设备,用于各消费者、零售业以及行业应用的联网设备。

提示:选择设备类型下面即设置项目所能兼容的最低Android SDK版本,在低于该版本的安卓机上无法运行该程序。一般默认即可,如有需要可自行修改,如此处选择API 15:Android 4.0.3(IceCreamSandwich)。若不知道如何选择最低版本,可以点击【Help me choose】,弹出的窗口中显示了运行各个版本Android的移动设备分布,如下图所示。点击API级别可以查看相应版本的Android中引入的功能列表。

044ASAPI版本分布图表.png    

3

选择项目界面布局

设置运行的目标设备与SDK后,下一步要为此应用选择一个适合的APP界面模板。 处于学习阶段可选择一个空白的布局即“Empty Activity”,然后单击【Next】,进行Activity的基本配置;然后设置Activity的名称(默认MainActivity),界面布局文件的名称(默认activity_main),设置好之后单击【Next】创建项目。

045AS选择界面.png
046ASActivity设置.png

提示:如果是Android Studio安装后第一次创建项目,则会出现此界面,下载需要的组件,点击【Finish】,然后还需要联网下载Gradle,等待下载完成。

047AS下载组件.png
048AS下载Gradle.png    

4

完成Android项目创建

上一步完成后进入项目创建过程,待程序创建、编译完成之后,即可看到Android Studio的编码界面了,如下图所示,其中包括项目文件、控件、界面布局、属性等模块。

049AS程序界面.png

提示:如果使用的Android Studio版本在3.1和3.2之间,在工程构建时可能会有如下报错: “Error:java.util.concurrent.ExecutionException:com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details”;解决方法:在项目的gradle.properties文件里面,添加“android.enableAapt2=false”这一句,重新构建即可解决。

5

项目调试运行

在Android Studio中开发编写APP后,从工具栏单击【Run】,选择【Run’app’】或【Debug’app’】项,在弹出 Choose Device 窗口,选择【Choose a running device】单选按钮,选择创建的模拟器(从当前启用的模拟器列表或未启用的模拟器列表中选择),单击【OK】按钮即可,此时Android Studio将APP安装到模拟器中并自动运行。

0410运行或调试运行app.png
0411AS选择配置的模拟器运行.png
0412HelloWorld模拟器运行效果.png

实现第一个GIS 功能的APP(2D)

入门示例源码下载实现方式1(启动页进入主界面) 实现方式2(点击跳转进入主界面)

基于MapGIS Mobile for Android的二次开发库进行GIS移动端应用的二次开发,在创建的Android项目中引用其二次开发库(即Libs目录下的.so与.jar文件),直接调用相关控件和接口实现移动GIS功能。

以实现基本的离线地图显示功能为例,在Android Studio中开发的具体步骤如下:

1

新建Android工程

启动Android Studio,参考创建“Hello World”项目的方法,新建一个名为“MyFirstMap”的Empty Activity 的Android应用项目;

0413新建AS的GIS项目.png    

2

引用二次开发库

MapGIS Mobile for Android的二次开发库,即将SDK包libs里的所有jar包与so库拷贝配置到新建项目中。

   (1)添加jar包

常用方法

第一步:拷贝Jar包 首先,切换工程目录结构为“Project”模式,将二次开发库的相应功能jar包拷贝到工程的“app\libs”目录下(如拷贝所有功能jar包);

0414AS拷贝jar包.png

第二步:导入Jar包 然后,选中目录结构中的项目或APP,右键选择“Open Module Settings”或者直接点击右上角功能菜单中的对应按钮,打开“Project Structure”对话框,再切换到“Dependencies”,然后通过点击“+”号为app模块添加“Jar Dependency”,将所需要的二次开发库相应功能jar包导入进来,自动加入依赖。

0414AS导入jar包1.png 0414AS导入jar包2.png 0414AS导入jar包3.png 0414AS导入jar包4.png

其他方法

在拷贝Jar包后,右键单击待导入的Jar包,在弹出的菜单中选择“Add As Library”,弹出如下对话框,此对话框的作用就是指定Library要添加到哪一个module(模块)中;

0415AS选择Module.png

当前工程只有app这一个模块,所以直接点击“OK”即可。等待项目同步更新完成,查看当前module中的“build.gradle”脚本文件,发现其中在dependencies标签中增加了jar的依赖,到此完成jar的导入。

   (2)导入so库

导入so库的方式和导入jar不一样,原因是Android Studio默认从不同的路径读取这两种类型开发库。默认从相应模块(例如app module)下的src/main/jniLibs目录中查找so库。

常用方法为:首先同样将SDK中libs目录下的armeabi、armeabi-v7a、arm64-v8a文件夹拷贝到模块的libs目录下,如果已有这些目录,则直接将*.so库文件复制到对应的目录中。(配置中可指定适配的架构)

0417AS添加so库文件.png

然后打开对应module下的build.gradle脚本文件,如果没有sourceSets标签,添加如下代码:

sourceSets {
    main {   jniLibs.srcDirs = ['libs']   }
}

此配置的作用即是告诉程序查找so文件的路径。添加完成后同步工程即可。

0418AS配置build.gradle文件.png    

3

设置移动端设备资源使用权限

一般开发APP时,由于APP通常会使用存储卡、网络、相机、定位等资源,因此需要为应用添加移动终端设备资源的使用权限,在AndroidManifest.xml(类似于系统配置文件)中编写对应权限标签。

0419设置AS应用程序权限.png

根据应用的实际需求添加对应的应用程序权限。例如,此程序用于实现地图显示功能,需要进行MapGIS环境初始化、授权操作,加载离线地图,所以需要应用具备读/写手机存储的权限、联网权限、读取手机状态的权限。

<!-- 允许应用程序向外部存储写入数据,如SD卡上写文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许应用程序读取外部存储数据 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 允许应用程序只读访问手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许应用程序访问网络,可能产生GPRS流量 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许应用程序获取WiFi网络的信息,WiFi信息会用于网络定位功能中 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许应用程序访问有关网络的信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许应用程序改变WiFi状态 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 允许应用程序访问精确位置,通过GPS进行定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许应用程序访问近似位置,通过网络进行定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<!-- 允许应用程序震动,用于草图编辑器功能 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 允许应用程序开启悬浮框 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

特别提示:需注意的是,在应用程序的targetSdkVersion版本大于等于23,手机的Android系统版本大于等于6.0时,对于读写手机存储、读取手机状态等危险权限,需要在Java代码中通过代码来动态申请权限。

针对V10.5.0.10版本,建议将targetSdkVersion设置为28及以下版本,暂不支持targetSdkVersion 29及以上版本(将在后续更新的版本中支持)。若手机的Android系统版本大于等于10时,暂时也将targetSdkVersion设置为28及以下版本。

针对V10.5.2.10版本,已经支持targetSdkVersion 29及以上版本,但需要注意以下相关配置:

1.后台获取位置信息的权限变更

问题描述:Android 10以后,后台应用要获取位置信息需要动态申请权限

解决方式:如果使用targetSdkVersion 29以上版本,则需加上如下权限:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

2.兼容文件分区存储

问题描述:Android 10以后,文件存储采用沙箱模式,应用只能看到本应用专有的目录

解决方式:以兼容模式运行,在Mainfiests中设置requestLegacyExternalStorage属性为true

<application android:requestLegacyExternalStorage="true" ... >

3.http网络连接

问题描述:使用http连接时提示“网络连接失败”

解决方式: (1)先在 res下新建一个xml目录,然后创建一个名为:network_config.xml 文件(名字自定),内容如下:

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

(2)然后在Mainfiests appliction标签下配置该属性:

android:networkSecurityConfig="@xml/network_config"

动态申请手机权限一般放在APP启用页面或首页实现。例如,新建一个启动页面(WelcomeActivity),编写相关代码参考如下:


    //应用程序权限
    private static final int MY_PERMISSIONS_REQUEST_CODE = 1;
    private String[] permissionArr=new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE
    };


    /**
     * 检查权限,没有授权即请求授权
     * @param permissionArray
     */
    public void checkPermissions(String[] permissionArray){
        //检查所有的权限,如果所有权限具备,则初始化MapGIS开发环境
        if (hasGetAllPermission(permissionArr)) {
            //初始化MapGIS开发环境
            initMapGISEnvironment();
        }
        //不是所有权限都具备,则继续检查请求
        else {
            for (String permission:permissionArray){
                if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                    //没有授权
                    requestPermissions(permission);
                }
            }
        }
    }

    /**
     * 检验是否所有需要的权限都已申请,只有当所有权限都授予之后,才能进行MapGIS的环境初始化
     */
    public boolean hasGetAllPermission(String[] permissionArray){
        List needPermission=new ArrayList();
        for(String permission:permissionArr){
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                needPermission.add(permission);
            }
        }
        //如果所有权限都已具备,则返回true,否则返回false
        if (needPermission.size()==0) {
            return true;
        }
        else return false;
    }

    /**
     * 请求权限
     * @param permission
     */
    public void requestPermissions(String permission){
        ActivityCompat.requestPermissions(this,new String[]{permission},MY_PERMISSIONS_REQUEST_CODE);
    }

    /**
     * 请求权限回调
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == MY_PERMISSIONS_REQUEST_CODE){
            if (grantResults.length > 0){
                //权限没有授予
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
                    switch (permissions[0]){
                        case Manifest.permission.WRITE_EXTERNAL_STORAGE:
                            showMyDialog("此程序需要存储的读写权限,请点击设置前往权限模块授予。\n未授予权限程序无法正常工作");
                            break;
                        case Manifest.permission.READ_PHONE_STATE:
                            showMyDialog("此程序需要电话权限,请点击设置前往权限模块授予。\n未授予权限程序无法正常工作");
                            break;
                        default:
                            break;
                    }
                }
                //权限已授予
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //如果权限授予了,则重新判断所有权限,没有授予的继续请求
                    checkPermissions(permissionArr);
                }
            }
        }
    }

    /**
     * 弹出自定义对话框:提示权限的重要性,并引导用户前往程序的应用管理界面手动开启权限
     * @param message
     */
    private void showMyDialog(String message){
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("权限申请");
        builder.setMessage(message);
        builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //打开系统中应用设置的界面
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.setData(Uri.parse("package:" + getPackageName()));
                startActivity(intent);

                finish();
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //如果取消,则退出应用
                finish();
            }
        });
        builder.setCancelable(false);//点击返回键和空白区域不取消对话框
        builder.show();
    }

代码说明:动态申请手机权限,弹框请求用户授权,当具备所须的所有权限后再调用initMapGISEnvironment()方法(即下一步骤实现的方法)进行MapGIS环境初始化与授权请求验证,通过之后再进入主页面(MainActivity)。

4

环境初始化与授权请求

要使用MapGIS移动平台提供的功能,导入开发库后,还需要初始化MapGIS环境、请求移动端授权,这样GIS功能才能得以使用。移动开发授权功能对应的API程序包为com.zondy.mapgis.environment,使用环境类(Environment)的接口方法实现。

必须在获取手机相关权限后进行MapGIS环境初始化与移动端授权请求,然后才能使用MapGIS移动端相关功能接口。例如,在APP启动页(WelcomeActivity)进行MapGIS环境初始化与授权,实现initMapGISEnvironment()。具体操作为:展开工程中的src/main/java目录,打开“WelcomeActivity.java”文件,在initMapGISEnvironment()中调用Environment类的initialize()方法进行环境初始化,然后调用requestAuthorization()方法请求授权。代码如下:

    import com.zondy.mapgis.environment.Environment;

     /**
     * 初始化MapGIS开发环境
     */
    public void initMapGISEnvironment() {

        /*
         * 构建环境目录路径:
         * 此程序环境目录路径为/storage/emulated/0/MapGISSample/
         * 所以数据需要拷贝到手机存储的根目录下
         */
        String strRootPath = android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/";

        /*
         * 环境初始化:
         * 要求:必须执行,必须在调用MapGIS Mobile for Android SDK各组件之前调用
         * 执行工作:会自动建立根目录结构,程序所需要的文件、缓存等数据会存放到此目录中
         */
        com.zondy.mapgis.environment.Environment.initialize(strRootPath, this);

        /*
         * 请求授权:
         * 要求:必须执行,MapGIS移动开发平台采用授权机制
         * 只有通过授权之后,才能使用MapGIS相关功能及控件
         */

        com.zondy.mapgis.environment.Environment.requestAuthorization(this, new Environment.AuthorizeCallback() {
            @Override
            public void onComplete() {
                System.out.println("授权完成");

                //当授权完成时,跳转到主界面
                startActivity(new Intent(WelcomeActivity.this,MainActivity.class));

            }
     });

代码说明:调用initialize()进行MapGIS环境初始化,会自动建立MapGIS系统环境目录结构;然后再调用requestAuthorization()请求MapGIS移动授权验证,当程序执行到requestAuthorization方法的回调中即表明已经成功授权,即可跳转到主页面,在主页面使用MapGIS Mobile for Android SDK的各组件功能。

特别提示:必须先进行手机授权,具备手机授权后进行MapGIS环境初始化与移动端授权请求,移动端授权验证通过后才能使用MapGIS移动端相关GIS功能接口

5

新增地图控件并编码实现地图显示

在APP主界面中新增地图控件并编码实现地图显示功能。例如,在APP主界面的布局文件(activity_main.xml)中加载地图控件,然后在主页面的Java文件(MainActivity.java)中实现离线地图加载功能。

(1)页面布局(例如res/layout/activity_main.xml)——加载地图控件 在工程中展开res/layout目录,打开activitymain.xml文件,初始化加载一个MapView视图(com.zondy.mapgis.map.view.mapview.MapView)并设置其ID,即在activitymain.xml文件中新增加载MapView视图的代码。

0420AS添加MapView控件.png

<com.zondy.mapgis.map.view.mapview.MapView
    android:id="@+id/mapview_id"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</com.zondy.mapgis.map.view.mapview.MapView>

代码解析:地图控件(com.zondy.mapgis.map.view.mapview.MapView),作为一个地图容器,用于装载显示地图,可通过其ID获得此地图容器对象。

(2)代码编写(例如src下的MainActivity.java文件)——地图控件中加载地图数据

在工程中展开src的目录,打开MainActivity.java文件,先获取移动设备SD卡上放置离线地图数据文件的路径,然后通过地图视图对象调用loadFromFile/loadFromFileAsync接口加载离线地图。

0421AS加载地图代码.png

方式一:同步加载离线地图

    import com.zondy.mapgis.map.view.mapview.MapView;

    //定义地图视图对象    
    private MapView mapView = null;
    //离线地图文档文件路径
    private String offlineMapPath = android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Map/MapShow/WuHan/WuHan.mapx";

    //获取地图容器
    mapView = (MapView) findViewById(R.id.mapview_id);
   
    //加载地图文档-同步方法(离线地图文档路径)
    mapView.loadFromFile(offlineMapPath);

代码解析:在MainActivity.java的onCreate方法中编写同步加载地图的具体实现代码,主要接口为loadFromFile,此为同步加载地图的统一接口,参数为地图文件的路径。

方式二:异步加载离线地图

    import com.zondy.mapgis.map.view.mapview.MapView;
    import com.zondy.mapgis.map.Map;
    import com.zondy.mapgis.geometry.Rect;

    //定义地图视图对象    
    private MapView mapView = null;
    //定义地图对象
    private Map map = null;

    //离线地图文档文件路径
    private String offlineMapPath = android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Map/MapShow/WuHan/WuHan.mapx";

    //获取地图容器
    mapView = (MapView) findViewById(R.id.mapview_id);
   
    //加载地图文档-异步方法(离线地图文档路径)
    mapView.loadFromFileAsync(offlineMapPath);

    //异步加载地图回调监听
    mapView.setMapLoadListener(new MapView.MapViewMapLoadListener() {
        //开始加载事件
        @Override
        public void mapViewWillStartLoadingMap(MapView arg0, String arg1) {
            Toast.makeText(MainActivity.this, "开始加载地图", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void mapViewDidFinishLoadingMap(MapView arg0, String arg1) {
            Toast.makeText(MainActivity.this, "地图加载完成", Toast.LENGTH_SHORT).show();
            //缩放地图到指定范围
            //Rect rect = new Rect(12705276.572663, 3542912.332349, 12746062.170780, 3607262.942711);
            Map map = mapView.getMap();
            Rect rect = null;
            if(map != null)
                rect = map.getViewRange();
            mapView.zoomToRange(rect, false);
        }

        @Override
        public void mapViewDidFailLoadingMap(MapView arg0, String arg1) {
            Toast.makeText(MainActivity.this, "地图加载失败", Toast.LENGTH_SHORT).show();
        }
    });

代码解析:在MainActivity.java的onCreate方法中编写异步加载地图的具体实现代码,主要接口为loadFromFileAsync,此为异步加载地图的统一接口,参数为地图文件的路径。其中,异步加载地图通过调用setMapLoadListener()进行地图加载回调监听,可在完成地图加载时设置地图初始显示范围。

6

调试运行APP

将项目安装到模拟器或者手机上,并运行。在“MyFirstMap”项目中,单击菜单栏上的“Run”|“Run ‘app’”,在弹出的对话框中选中目标设备(模拟器或真机),单击“OK”按钮,即可将项目安装到移动设备上,并显示运行之后的界面。

0422AS运行设备选择.png

提示:若初次运行基于MapGIS Mobile开发的app,将在app中弹出对话框进行授权认证,许可认证后的移动端设备再次运行使用此app则不会再弹框认证。

0423地图显示功能.png

至此,第一个基于MapGIS Mobile 10.5的二维地图显示的Android App开发完毕。

实现第一个GIS 功能的APP(3D)

入门示例源码下载实现方式(启动页进入主界面)

实现3D功能的GIS APP应用,与实现2D功能的步骤相似,前4个步骤(新建Android工程 、引用二次开发库、设置移动端设备资源使用权限、环境初始化与授权请求)完全一样,可直接参考。接下来讲解后续不相同的步骤。

1

新增场景控件并编码实现地图显示

(1)页面布局(res/layout/activity _ main.xml)——加载地图控件 在工程中展开res/layout目录,打开activity _ main.xml文件,初始化加载一个SceneView视图(com.zondy.mapgis.android.sceneview.SceneView)并设置其ID,即在activity_main.xml文件中新增加载SceneView视图的代码。

AS添加SceneView控件.png

<com.zondy.mapgis.android.sceneview.SceneView
    android:id="@+id/sceneView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.zondy.mapgis.android.sceneview.SceneView>

代码解析:场景控件(com.zondy.mapgis.android.sceneview.SceneView),作为一个容器,用于装载显示三维场景,可通过其ID获得此场景容器对象。

(2)代码编写(src下的MainActivity.java文件)——地图控件中加载地图数据

在工程中展开src的目录,打开MainActivity.java文件,先获取移动设备SD卡上放置地图数据文件的路径,进行环境初始化,然后调用云授权请求的接口,在其回调中通过加载三维场景。

AS加载场景代码.png

    //定义场景视图、场景
    private SceneView sceneView;
    private Scene scene;

    //实例化三维矢量图层
    VectorLayer3D mVectorLayer3D = new VectorLayer3D();
    //为图层设置名称
    mVectorLayer3D.setName("离线矢量数据");
    //为图层设置驱动类型(OGR数据驱动.用于离线矢量数据的读取)
    mVectorLayer3D.setDriverType(DriverType.Driver_Type_OGR);
    //为图层设置URL
    mVectorLayer3D.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MyFirstScene/" + "Scene/haiyang/haiyang.shp");

    //实例化场景、三维矢量图层
    scene = new Scene();
    //为场景添加图层
    scene.addLayer(mVectorLayer3D);

    //实例化场景视图对象
    sceneView = findViewById(R.id.sceneView);
    //设置无光模式
    sceneView.setSunLightingMode(SunLightingMode.NONE);
    //为场景视图设置场景
    sceneView.setSceneAsync(scene, new SceneView.SceneFinishCallback() {
        @Override
        public void onDidFinish(boolean b) {
            if (b) {
                //场景加载成功
            } else {
                //场景加载失败
            }
        }
    });

代码解析:在MainActivity.java的onCreate方法中编写加载三维场景的具体实现代码。

2

调试运行APP

将项目安装到模拟器或者手机上,并运行。在“MyFirstScene”项目中,单击菜单栏上的“Run”|“Run ‘app’”,在弹出的对话框中选中目标设备(模拟器或真机),单击“OK”按钮,即可将项目安装到移动设备上,并显示运行之后的界面。

0422AS运行设备选择.png

提示:若初次运行基于MapGIS Mobile开发的app,将在app中弹出对话框进行授权认证,许可认证后的移动端设备再次运行使用此app则不会再弹框认证。

场景显示功能1.jpg 场景显示功能2.jpg

至此,第一个基于MapGIS Mobile 10.5的三维场景显示的Android App开发完毕。

APP调试运行

程序编写完成之后,我们可以将程序安装在实际设备(智能手机、PDA等)或者Android模拟器上查看运行效果。下面介绍在Android Studio自带模拟器、真机、第三方模拟器上运行程序的操作流程。

方式一:模拟器AVD

模拟器AVD,即Android虚拟设备,是一套模拟器配置方案,它允许大家设定出与实际情况相符的Android设备型号。这就让开发者在多种多样的设备平台上运行并测试应用程序变得更为轻松。在Android虚拟设备功能的支持下,大家可以为Android模拟器指定需要模拟的硬件与软件组合。

1

配置模拟器AVD

如何配置使用Android Studio的模拟器AVD?

(1)打开“AVD Manager”模拟器管理器:可在工具栏点击此工具 直接打开,也可点击菜单栏的“Tools”下的“AVD Manager”打开,会弹出模拟器管理界面,如果之前没创建过虚拟设备,则会提示创建模拟器;

0424打开AVDManager.png
0425AVDManager管理界面.png

(2)点击【Create Virtual Device】进入硬件选择界面,选择设备类型为【Phone】即手机,然后可根据需要,从屏幕大小、分辨率、密度等方面考虑选择合适的设备类型,选择好之后点击【Next】;

0426硬件选择.png

提示:Nexus是Google公司的品牌,Nexus系列产品是Google公司研发的以原生Android为操作系统的智能手机、平板电脑等电子数码产品。

(3)选择系统镜像:若没有已下载的镜像,需要选择合适的系统镜像下载,点击【Download】,弹出许可协议认证界面,选择【Accept】接受许可,然后点击【Next】开始下载模拟器、系统镜像;下载完成之后,会返回选择系统镜像的界面,选择已经下载过的系统镜像,点击【Next】进入下一步;

提示:系统镜像中包括应用需要的插件库,如Google API。必须有系统镜像,应用才能运行。

0427选择系统镜像.png
0428许可认证.png
0429下载镜像.png

(4)验证配置:验证配置展示了模拟器的一些相关信息,可以设置模拟器的名称、修改模拟器为横屏或者竖屏,确认之后点击【Finish】即可,这样一个模拟器就创建完成了;

0430选择下载好的镜像.png
0431验证配置.png

(5)创建完成之后,在模拟器管理界面会显示现有的模拟器,点击如下图所示的“启动”按钮,即可打开模拟器。

0432启动模拟器.png
0433模拟器启动界面.png

特别提示:如果在启动模拟器的时候发现无法启动,提示一些错误信息,通常考虑两方面问题,即电脑没有安装Intel HAXM软件或者没有启用虚拟技术,可网上搜索方法解决,此略。

2

运行安装APP

在模拟器创建成功之后,即可运行程序并安装应用。

在程序没有错误、编译通过的基础上,运行程序,安装应用,弹出选择部署设备的界面,其中显示了已经创建的模拟器,点击【OK】进行安装;等待程序构建完成,安装之后,即可看当前应用程序运行的效果。

0434AS运行程序.png
0411AS选择配置的模拟器运行.png
0412HelloWorld模拟器运行效果.png

方式二:真机(移动设备)

由于模拟器无法达到100%的真正模拟效果,例如相机、重力感应、横竖屏切换等。另外,若PC机配置不高,使用自带的AVD来调试应用,可能会导致运行卡顿,无法满足运行调试的需求。此时可以使用真机,即Android终端设备来安装调试。真机的性能较高、速度快,运行之后就是真实的效果,因此在条件满足的情况下使用真机运行可能有更好的效果。

下面介绍在Android Studio环境下如何将Android应用程序安装、运行在一个Android操作系统的真实设备上,以手机为例。

1

连接配置真机环境

手机连接、设置包括如下三个步骤:

(1)连接手机:使用USB线连接手机和你开发项目的PC机,连上之后一般会自动安装驱动(若没有自动安装可借助第三方手机助手或者手动安装对应驱动)。

(2)打开USB调试功能:对于不同Android版本、不同定制Android版本的手机,方法不一样,但是最终目的就是找到USB调试功能并开启:低于Android 4.2版本的手机, “设置->应用程序->USB调试”,或者“设置->开发人员选项->USB调试”开启;Android 4.2及更高版本的手机上,开发者选项默认是隐藏的,先进入“设置”,找到“关于手机”,连续点击“版本号”(英文名Build number)7次,即可开启“开发人员选项”模块,勾选“USB调试”等设置项即可。

(3)设置USB连接方式:开启USB调试之后,设置手机连接电脑的USB模式为能够传输文件的方式即可,如“传输文件”或者“多媒体传输”等。

0435USB调试功能.png

手机连接好之后,在Android Studio的Android Monitor(3.0之前)或者Logcat(3.0之后)中会自动检测到设备。

0436查看手机是否连接.png    

2

连接安装APP

手机设置完成之后,即可运行安装。真机的操作方法与模拟器类似,即在弹出选择部署设备的界面时选择刚连接的真机设备。

方式三:第三方模拟器

有时Android SDK自带的模拟器性能较低,可能会比较卡顿;或者使用USB连接真机时,有可能会出现无法识别手机或者USB连接不稳定等问题。此时,可以使用第三方模拟器。目前出现了很多优秀的模拟器,例如Genymotion、Droid4X(海马玩)、BlueStacks(蓝叠)、逍遥等等。安装在PC端,可以很好地模拟手机的操作系统、视觉界面、操作习惯,并且运行速度较快、性能稳定,能基本上达到和真实手机接近的体验效果,便于Android开发人员测试程序,应用范围也较广。

在此以Droid4X(海马玩)为例,讲解如何使用第三方模拟器安装、运行Android程序,其他应用类似。

1

安装配置第三方模拟器

在开发环境中安装第三模拟器如Droid4X,并打开Droid4X模拟器软件,采用竖屏界面,可自行设置界面分辨率。

0437海马玩模拟器.png    

2

连接安装APP

在Android Studio中运行APP,使用第三方模拟器的操作步骤与自带的模拟器AVD、真机基本相同,即在弹出选择部署设备的界面时选择海马玩模拟器即可。