SuperMap iMobile開發入門(iMobile 10i + AS 3.6)

超圖防坑指南

機緣巧合,報名了超圖的 命題開發組競賽,想着,就像是寫個小作業,就能完成,順便領個小證書啥的(主要是想接觸下超圖軟件,萬一美帝真的有後續操作呢)。 不過, 哎?? 超圖這坑太深了吧!他們的視頻教程做了好多遍,細究了好多的細節(大概就是 仔細看每幀視頻畫面吧),也沒能Debug Successful。在超圖羣裏問了好幾次,最終在 聊大 尚澤兄弟 的協助下完成了HelloMap之SuperMap Version,小兄弟才大二,不過跳坑技能實屬高超,佩服佩服。

文章概要

  1. AS3.6安裝、SuperMap iMobile 10i下載 ,一筆帶過;
  2. HelloMap工程創建 ,必要步驟記錄;
  3. HelloMap示例代碼 ,貼代碼 + 部分講解;
  4. HelloMap完整工程下載 ,提供下載鏈接(GitHub + CSDN);

AS3.6安裝、SuperMap iMobile 10i下載

AS3.6下載鏈接: Android Studio 的下載頁面下載最新版 或者是 下載AS 3.5.2 的 exe

SuperMap iMobile 10i下載鏈接: SuperMap iMobile 10i SP1 for Android(2019-12-31)

SuperMap iMobile 10i試用的License文件: SuperMap Online

HelloMap工程創建

  1. 創建工程
    常規操作

  2. 導入jar包
    這裏導入data和mapping這兩個包就可以了

  3. 導入.so文件
    直接複製了整個文件夾(armeabi-v7a)過來

  4. 配置activity.xml
    添加MapView控件

  5. 配置activity.java
    初始化環境、打開工作空間、關聯地圖控件和工作空間、權限適配

  6. 配置Manifest.xml
    添加網絡權限、讀寫文件權限等

  7. 配置build.gradle
    添加ndk和sourceSets節點,詳細實例代碼見下節
    劃重點:超圖官方教程未進行ndk節點設置,這裏不設置會報錯的,親測!

  8. 數據導入手機
    直接使用USB連接手機後,把示例數據和License文件導入手機根目錄就行

HelloMap示例代碼

build.gradle

// buid.gradle的部分關鍵代碼
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.3"

    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        ...

        ndk {
            abiFilters 'armeabi-v7a'
        }

    }

    buildTypes {
            ...
    }

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

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
        ...
    implementation files('libs/com.supermap.data_v1001.jar')
    implementation files('libs/com.supermap.mapping_v1001.jar')
}

activity.xml

// activity_main的全部代碼
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.supermap.mapping.MapView
            android:id="@+id/mapview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
        </com.supermap.mapping.MapView>
    </RelativeLayout>>

</androidx.constraintlayout.widget.ConstraintLayout>

activity.java

// MainActivity的全部代碼
package com.bestyou.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import com.supermap.data.Environment;
import com.supermap.data.Workspace;
import com.supermap.data.WorkspaceConnectionInfo;
import com.supermap.data.WorkspaceType;
import com.supermap.mapping.MapControl;
import com.supermap.mapping.MapView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        checkPermission();

        //初始化環境
        Environment.setLicensePath("/sdcard/SuperMap/license/");
        Environment.setTemporaryPath("/sdcard/SuperMap/temp/");
        Environment.setWebCacheDirectory("/sdcard/SuperMap/WebCatch");
        Environment.initialization(this);

        setContentView(R.layout.activity_main);

        //打開工作空間
        Workspace workspace = new Workspace();
        WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();
        info.setServer("/sdcard/SuperMap/GeometryInfo/World.smwu");
        info.setType(WorkspaceType.SMWU);
        workspace.open(info);

        //將地圖顯示控件和工作空間關聯
        MapView mapView = findViewById(R.id.mapview);
        MapControl mapcontrol = mapView.getMapControl();
        mapcontrol.getMap().setWorkspace(workspace);

        //打開工作空間中的第1幅地圖
        String mapName = workspace.getMaps().get(0);
        mapcontrol.getMap().open(mapName);
        mapcontrol.getMap().refresh();
    }

    //動態權限適配
    public void checkPermission() {
        boolean isGranted = true;
        if (android.os.Build.VERSION.SDK_INT >= 23) {
            if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                //如果沒有寫sd卡權限
                isGranted = false;
            }
            if (this.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                isGranted = false;
            }
            Log.i("cbs","isGranted == "+isGranted);
            if (!isGranted) {
                this.requestPermissions(
                        new String[]{
                                Manifest.permission.READ_PHONE_STATE,
                                Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS,
                                Manifest.permission.ACCESS_COARSE_LOCATION,
                                Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.READ_EXTERNAL_STORAGE,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        102
                );
            }
        }
    }
    
}

Manifest.xml

 <-- AndroidManifest的全部代碼 -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.bestyou.myapplication">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission
        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <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" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <activity android:name=".MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name">
            
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            
        </activity>
        
    </application>
    
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true">
    </supports-screens>
    
</manifest>

HelloMap完整工程下載

想直接運行下,看看Demo的可直接下載完整工程:

CSDN鏈接: 有下載積分的點這裏下載完整工程.
希望有CSDN積分的大佬能打賞下積分,謝謝~

Github鏈接: 用愛發電.
學生黨去Github就好了~

手機端導入數據完整示例: CSDN下載鏈接.
可直接拷貝到手機的根目錄,即:手機根目錄->SuperMap->其他文件夾(包括示例數據、license、緩存文件夾)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章