简单Android示例 + ArcGis 显示地图

536 阅读2分钟

简单Android示例 + ArcGis 显示地图

本文概述:

  • 本文介绍了如何使用ArcGis 官方教程编写简单安卓示例,实现地图显示功能;文章提供了完整编写思路,以及读者在复现代码时可能遇到的问题及其解决办法

    1656041775881.png

  • 参考链接:developers.arcgis.com/android/map…

环境准备:

编译器版本及所用语言

  • android studio 版本信息

    1656033772225.png

  • 编程语言:JDK版本信息 1656033904162.png

配置ArcGis 所需环境

  • 添加Maven仓库:Android Studio更新后在settings.gradle中添加依赖

    1656033996624.png

  • 添加ArcGis Android 运行时依赖

    //添加ArcGis Android运行时依赖
    implementation 'com.esri.arcgisruntime:arcgis-android:100.14.0'
    
  • 添加网络权限

    <!--    添加网络权限-->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-feature
            android:glEsVersion="0x00020000"
            android:required="true" />
    
  • 此时点击Gradle按钮,因为网络原因可能导致相关jar包无法下载,使得无法正常导入包

    • 导入成功:

      1656035778323.png

获取ArcGis 开发秘钥:后期需要使用ArcGis 服务则需要申请账号

  • 链接:developers.arcgis.com/api-keys/

  • 查看并保存秘钥:

    1656037157386.png

  • 在项目中编写代码,将秘钥封装起来

    • 封装示意:

      1656041145568.png

    • 调用代码:

      // location services
      ArcGISRuntimeEnvironment.setApiKey(BuildConfig.API_KEY);
      
    • 存放位置:这种秘钥一般放在哪里?

      • 新建一个类保存成类属性还是怎么做:是可以这样干的,

        • 现在的秘钥一般都是需要电脑的SSH 信息,这个是唯一的

编写代码:

  • 工程结构示意:

  • 添加res文件:在Android 开发中一般不采用字面量进行直接赋值

    1656036218996.png

  • 编写布局代码:activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    ​
        <!-- MapView -->
        <com.esri.arcgisruntime.mapping.view.MapView
            android:id="@+id/mapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </com.esri.arcgisruntime.mapping.view.MapView>
    ​
    </RelativeLayout>
    
  • MainActivity代码

    package mapandscenes.displaymap;
    ​
    import android.os.Bundle;
    ​
    import androidx.appcompat.app.AppCompatActivity;
    ​
    import com.cdqiantuo.arcgissdklearn.R;
    import com.esri.arcgisruntime.ArcGISRuntimeEnvironment;
    import com.esri.arcgisruntime.mapping.ArcGISMap;
    import com.esri.arcgisruntime.mapping.BasemapStyle;
    import com.esri.arcgisruntime.mapping.Viewpoint;
    import com.esri.arcgisruntime.mapping.view.MapView;
    ​
    public class MainActivity extends AppCompatActivity {
    ​
        private MapView mMapView;
    ​
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    ​
            ArcGISRuntimeEnvironment.setLicense("runtimelite,1000,rud4449636536,none,NKMFA0PL4S0DRJE15166");
    ​
    ​
            // 需要使用API密钥或命名用户进行身份验证才能访问基图和其他
            // location services
            ArcGISRuntimeEnvironment.setApiKey(BuildConfig.API_KEY);
    ​
            // inflate MapView from layout
            mMapView = findViewById(R.id.mapView);
            // create a map with the a topographic basemap
            ArcGISMap map = new ArcGISMap(BasemapStyle.ARCGIS_TOPOGRAPHIC);
            // set the map to be displayed in this view
            mMapView.setMap(map);
            mMapView.setViewpoint(new Viewpoint(34.056295, -117.195800, 10000));
        }
    ​
        @Override
        protected void onPause() {
            mMapView.pause();
            super.onPause();
        }
    ​
        @Override
        protected void onResume() {
            super.onResume();
            mMapView.resume();
        }
    ​
        @Override
        protected void onDestroy() {
            mMapView.dispose();
            super.onDestroy();
        }
    }
    
  • 运行截图:

    1656041794748.png

异常出现及处理手段:2 files found with path 'META-INF/DEPENDENCIES'.

  • 参考链接:blog.csdn.net/qq_46234209…

  • 异常截图:

    1656037855975.png

  • 异常原因:在配置文件中对第三方库引入多次,导致冲突

  • 解决手段:删掉多余的就行了

    1. 根据异常信息(2 files found with path 'META-INF/DEPENDENCIES'.)定为冲突的位置: 'META-INF/DEPENDENCIES'

      packagingOptions {
          exclude 'META-INF/DEPENDENCIES'
      }
      
    2. 根据异常信息定位出错的配置文件

      1656042629115.png

    3. 将上面的解决代码添加到相应的配置文件中

      android {
          //方便定位文件
          compileSdk 32
          
          ……
      ​
          //处理SDK 冲突
          packagingOptions {
              exclude 'META-INF/DEPENDENCIES'
          }
      }