This article mainly explains how to use the SuperMap iMobile development kit to load maps
Article directory
- 1. Project creation
- 2. Build.gradle environment configuration
- 3. Permission configuration
- 4. SuperMap iMobile environment initialization
- 5. Map loading
- other problems
1. Project creation
- Import iMobile SDK
According to the functional classification, import the required packages into the project libs directory
2. build.gradle environment configuration
- Specify compilation architecture
ndk{<!-- --> abiFilters 'armeabi-v7a' }
- Specify dependency so file
sourceSets {<!-- --> main {<!-- --> jniLibs.srcDirs = ['libs'] } }
- Specify dependent jar files
implementation fileTree(include: ['*.jar'], dir: 'libs')
Complete code
plugins { id 'com.android.application' } android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { applicationId "com.supermap.test" minSdkVersion 24 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk{ abiFilters 'armeabi-v7a' } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } sourceSets { main { jniLibs.srcDirs = ['libs'] } } packagingOptions { exclude 'META-INF/*' exclude 'META-INFTICE' // will not include NOTICE file exclude 'META-INF/LICENSE' // will not include LICENSE file exclude 'META-INF/INDEX.LIST' // will not include INDEX.LIST file } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' }
3. Permission configuration
Add access permissions in AndroidManifest
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_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" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
When the “targetSdkVersion” in the build.gradle file is higher than 22, you also need to configure dynamic permissions
ActivityCompat.requestPermissions( activity, new String[] {<!-- --> Manifest.permission.CAMERA, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.VIBRATE,}, CAMERA_PERMISSION_CODE); }
4. SuperMap iMobile environment initialization
- License Configuration
iMobile requires a license to load maps, but you can go to the SuperMap official website to apply for a trial license, which is valid for 3 months.
//Set the license path, the default license path is ../root directory/SuperMap/License Environment.setLicensePath(PathConfig.License_PATH);
- Initial configuration
Environment.initialization(this);
5. Map loading
- Add controls to xml layout file
<com.supermap.mapping.MapView android:visibility="visible" android:id="@ + id/mapview" android:layout_width="match_parent" android:layout_height="match_parent"/>
- Open map
void openMap(){<!-- --> //Initial workspace mMapView=findViewById(R.id.mapview); mMapControl=mMapView.getMapControl(); mWorkspace=new Workspace(); mMapControl.getMap().setWorkspace(mWorkspace); //Open workspace WorkspaceConnectionInfo info=new WorkspaceConnectionInfo(); info.setType(WorkspaceType.SMWU); info.setServer(PathConfig.SampleData_PATH + "City/Changchun.smwu"); boolean openSuccess=mWorkspace.open(info); if (openSuccess){<!-- --> //Load map String mapName=mWorkspace.getMaps().get(0); mMapControl.getMap().open(mapName); mMapControl.getMap().refresh(); }else {<!-- --> Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show(); } }
- Open data source
void openDatasouce(){<!-- --> //Initial workspace mMapView=findViewById(R.id.mapview); mMapControl=mMapView.getMapControl(); mWorkspace=new Workspace(); mMapControl.getMap().setWorkspace(mWorkspace); //Open data source DatasourceConnectionInfo info=new DatasourceConnectionInfo(); info.setEngineType(EngineType.UDB); info.setServer(PathConfig.SampleData_PATH + "City/Changchun.udb"); Datasource ds=mWorkspace.getDatasources().open(info); if (ds!=null){<!-- --> //Load the data set mMapControl.getMap().getLayers().add(ds.getDatasets().get(0),false); mMapControl.getMap().refresh(); }else {<!-- --> Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show(); } }
Complete code
public class MapActivity extends AppCompatActivity { MapView mMapView; MapControl mMapControl; Workspace mWorkspace; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestPermission(); Environment.setLicensePath(PathConfig.License_PATH); Environment.initialization(this); setContentView(R.layout.activity_map); openMap(); // openDatasouce(); } void requestPermission(){ ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.CAMERA, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.VIBRATE,}, 0); } void openMap(){<!-- --> //Initial workspace mMapView=findViewById(R.id.mapview); mMapControl=mMapView.getMapControl(); mWorkspace=new Workspace(); mMapControl.getMap().setWorkspace(mWorkspace); //Open workspace WorkspaceConnectionInfo info=new WorkspaceConnectionInfo(); info.setType(WorkspaceType.SMWU); info.setServer(PathConfig.SampleData_PATH + "City/Changchun.smwu"); boolean openSuccess=mWorkspace.open(info); if (openSuccess){<!-- --> //Load map String mapName=mWorkspace.getMaps().get(0); mMapControl.getMap().open(mapName); mMapControl.getMap().refresh(); }else {<!-- --> Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show(); } } void openDatasouce(){<!-- --> //Initial workspace mMapView=findViewById(R.id.mapview); mMapControl=mMapView.getMapControl(); mWorkspace=new Workspace(); mMapControl.getMap().setWorkspace(mWorkspace); //Open data source DatasourceConnectionInfo info=new DatasourceConnectionInfo(); info.setEngineType(EngineType.UDB); info.setServer(PathConfig.SampleData_PATH + "City/Changchun.udb"); Datasource ds=mWorkspace.getDatasources().open(info); if (ds!=null){<!-- --> //Load the data set mMapControl.getMap().getLayers().add(ds.getDatasets().get(0),false); mMapControl.getMap().refresh(); }else {<!-- --> Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show(); } } }
Other questions
So library and jar package versions do not match
- Check whether the jar and so version numbers under libs are consistent
- Check whether armeabi-v7a or arm64-v8a is set under build.gradle and whether it is aligned with libs.
- Check that minSdkVersion is greater than or equal to 23, and gradle is greater than or equal to 3.6.0. Required in the application AndroidManifest file
Add android:extractNativeLibs=”true” to the application tag
Failed to open map
- Check whether access permissions are normal
- Check whether only the *.smwu file is copied and not the *.udb, .udd or.udbx file
- Check if there is a map saved in the workspace
Please call com.supermap.data.Environment.initialization() firstly
- Environment.initialization(this) needs to be called before setContentView