SuperMap iMobile for Android许可使用和问题解决

作者:xinxin

使用SuperMap iMobile for Android需要对应的许可,其分为使用许可和正式许可。下面主要分享怎么使用试用许可、激活正式许可和许可不可用的一些解决方法。
####1、 试用许可
配置iMobile的试用许可比较简单,步骤如下:
1) 首先,用邮箱在超图官网上https://www.supermapol.com/web/pricing/triallicense申请移动端的试用许可,申请许可界面如下:
这里写图片描述
2) 信息填完后点提交,弹出申请成功的界面,该试用许可在Android、IOS平台通用,且不绑定设备,如下图:
这里写图片描述
3) 将申请到的有效期90天的试用许可SuperMap iMobile Trial.slm文件拷贝到移动设备sdcard的某个路径下(如/sdcard/SuperMap/license/目录下);
4) 在工程代码中先获取设备的根目录,然后在设置许可具体路径,代码如下:
String rootPath = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
Environment.setLicensePath(rootPath + “/SuperMap/license/”) ;
只要代码中设置的许可目录和设备中存储许可的目录一致即可,这样试用许可就配置好了,可以正常开发了。
####2、 正式许可
在使用正式许可前需要许可激活,许可激活分为在线激活和离线激活。
(1) 在线激活
a. 用户和超图销售签订购买合同后,通过销售渠道根据合同中的购买许可个数出一个许可序列号发给用户;
b. 用许可序列号在线激活许可,如果这个许可序列号里面有20个正式许可,那只能在20台移动设备上用这个序列号在线激活,即在移动设备上在线激活一个,序列号中的许可少一个;
c. 实现在线激活代码如下,在线激活时只能写已经买了的模块,否则序列号中由于没有该模块会造成在线激活失败;

public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        
		//设置存放许可文件的路径
		String rootPath = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
		Environment.setLicensePath(rootPath + "/SuperMap/License");
		Environment.initialization(this);
        
		//设置申请许可的模块
		ArrayList modules = new ArrayList();
		modules.add(Module.Core_Runtime);
		modules.add(Module.Navigation_Runtime);
		modules.add(Module.Realspace_Runtime);

		//设置许可激活回调
		LicenseManager.getInstance().setActivateCallback(new LicenseActivationCallback() {
			
			@Override
			public void activateSuccess(LicenseStatus newLicenseStatus) {
				
				Toast.makeText(context, "许可激活成功", Toast.LENGTH_LONG).show();
				
			}
			
			@Override
			public void activateFailed(String errorMsg) {
				
				Toast.makeText(context, "许可激活失败", Toast.LENGTH_LONG).show();
				
			}
		});
		
		//在线激活设备,传入用户序列号和需要申请的模块列表
		LicenseManager.getInstance().activateDevice("用户序列号", modules);
   }

d. 在线激活的正式许可会在上面代码中设置的路径中生成,在工程开发的时候设置该许可路径即可。
PS:用户在写代码在线激活时要确定自己买了什么模块,不能在代码中多写模块,否则激活失败,其次序列号的不能写错。
(2) 离线激活
a. 用户通过代码Environment. getDeviceID()获取移动设备硬件的识别码,该识别码是一串16位的数字和大写字母构成的;
b. 将该硬件设备的识别码通过销售渠道得到一个对应的正式许可文件.slm;
c. 用户拿到这个正式许可后拷贝到生成硬件识别码的那台移动设备上,只有放在那台设备上才能使用,即要一一对应;
d. 在工程代码中环境初始化时设置许可的路径即可。
PS:生成的移动设备硬件的识别码是有16位数字和大写字母构成的,否则生成的正式许可是错误的。
####3、 许可在线与离线激活区别
(1) 从6R到9D版本都可以用离线激活正式许可,而从7C版本开始支持在线许可激活;
(2) 正式许可激活的时候需要开启WiFi,保证可以联网(用流量也可以);离线激活的正式许可在工程中第一次使用时需要开启WiFi,Android设备7.0以下版本可以不联网,7.0及以上版本需要联网;
(3) 在线许可激活可以先买许可,在买移动设备,然后相应的设备上激活;离线许可激活需要先买移动设备,得到对应硬件识别码,然后根据识别码买许可,所以建议大家用在线激活方式。
####4、 许可不可用
(1) 试用许可不可用
在使用试用许可遇到许可不可用时从以下方面去排查,解决的概率很大。
a. 试用许可是否已过期,判定方法可以将它用txt打开查看里面的StartDate(开始时间)和ExpiredData(过期时间)的具体时间是否已过期;
b.如果能确定是刚申请不久的试用许可还报许可过期,那就要查看测试设备的系统时间是否正常,即查看是否是当天的时间,如果不是在设备中设置好;
c. 如果设备中含有许可,但是它还是报没有许可文件,就要查看试用许可文件放在测试设备中的路径和工程中Environment.setLicensePath()设置的是否一致;
d.如果有人遇到同一个试用许可拷贝到两个测试设备中测试同一个工程,一个运行正常,一个报许可不可用时,先排查b和c中的步骤,然后将运行不正常的那个设备中的试用许可删除,然后重新拷贝一份进去,这个很少见,但也会在拷贝的时候出问题;
e.有些7.0以上的移动设备在Environment.setLicensePath()时会报获取不到设置的路径,虽然设备中的文件在AndroidManifest.xml中设置了读取权限,但是在有些7.0设备还是无法读取文件路径,这时需要动态设置文件读取的权限,设置代码如下:

package com.imobiletest.bufferanalystbygemotry;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class PermissionActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
        requestPermisson();
    }

    @TargetApi(23)
    private void requestPermisson() {
        // 版本判断
        if (Build.VERSION.SDK_INT >= 23) {
            // 检查是否拥有权限
            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.ACCESS_FINE_LOCATION};
            String permission = null;
            int id = 0;
            boolean isBreak = false;
            int checkCallPhonePermission = 0;
            for (int i = 0; i < permissions.length; i++) {
                permission = permissions[i];
                checkCallPhonePermission = checkSelfPermission(permission);
                if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(permissions, id);
                    isBreak = true;
                    break;
                }
            }
            if(!isBreak)
                startMain();
        }
    }

    @TargetApi(23)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        // TODO Auto-generated method stub
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        startMain();

    }

    private void startMain(){
        Intent intent = new Intent();
        intent.setClass(getApplicationContext(), MainActivity.class);
        startActivity(intent);
        finish();
    }
}

(2) 在线许可激活
a. 在线激活时需要联网,功能模块要写和许可序列号要正确,否则激活会失败;
b. 许可存储在设备中的路径和工程中Environment.setLicensePath()设置的许可路径是否一致;
c. 由于移动端许可激活后台服务器内部做了一次迁移,用低版本的data.jar包或者license.jar包激活会失败,建议用8.11及以上版本的jar包激活;
d. 也有可能是出的许可序列号或者许可激活后台出了问题,这时就需要超图出许可和移动端的研发来排查,可以找超图售后的工程师咨询。
(3) 离线许可激活
a. 获取的设备硬件识别码不对造成出的正式许可也错误,最基本的判断该识别码是16位有数字和大写字母构成的;
b. 许可存储在设备中的路径和工程中Environment.setLicensePath()设置的许可路径是否一致;
c. 在工程第一次运行时,没有将WiFi开启或者Android设备7.0及以上版本不能联网造成报没有许可;
d. 由于许可后台原因造成出的正式许可有问题,这时需要咨询超图的售后工程师。
备注:为了方便用户使用,在技术资源中心(support.supermap.com.cn)网页的移动GIS示例代码中有:
1)获取设备硬件识别码的工程代码和apk;
2)在线许可激活的工程代码和apk;
3)验证正式许可是否正常的工程代码和apk;
具体地址链接:
http://support.supermap.com.cn/product/CodeLibrary.aspx?PRODUCT_TYPE=4#pro_name
网页截图如下:
这里写图片描述

在计算机编程领域,"before initialization"(初始化之前)是指在某个程序或对象初始化之前发生的事件或操作。 在程序执行过程中,初始化阶段是非常关键的。在对象被创建或程序被调用之前,需要对其进行初始化,以确保其能正常运行。因此,"before initialization"一般涉及到一些在初始化之前必须要处理的事情。 在面向对象的编程语言中,对象的初始化通常发生在构造函数中。在调用构造函数之前,可能需要做一些准备工作,例如初始化成员变量或设置默认值。这些准备工作就是"before initialization"的一个例子。 在使用某些编程框架或库时,也有可能在初始化之前需要执行一些操作。比如,在Web开发中,可以在数据库连接之前,进行一些配置,如读取配置文件或初始化日志模块等。这些操作都是在初始化之前进行的。 从软件开发的角度来看,"before initialization"也可以指在程序运行之前的准备工作。这包括编译代码、检查错误、设置环境变量等等。这些操作的目的是确保程序能够正确运行,并且避免潜在的错误或异常。 总之,无论是在对象初始化、编程框架配置还是程序准备阶段,"before initialization"都代表着在某个实体或环境初始化之前必须要处理的事情。只有完成了这些准备工作,程序或对象才能够在后续的运行中正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值