首页 / 浏览问题 / 移动GIS / 问题详情
入门示例安卓APP(地图显示)闪退
16EXP 2022年08月19日

使用产品:supermap imobile 10i(2021) for android

操作系统:win10 x64;手机操作系统:OPPO Color OS V7.1 (android 10)

问题详细描述:

按运行(Run)按钮后直接闪退,打不开。代码按照产品入门一步步写的。文件放置路径不太明白。目前放置了两个不同的路径如下:

第一个路径:

/mnt/sdcard/SuperMap/license/SuperMap iMobile Trial LAPTOP-36VURMTA-20220727.slm

/mnt/sdcard/SampleData/GeometryInfo/World.smwu

第二个路径:

/sdcard/SuperMap/license/SuperMap iMobile Trial LAPTOP-36VURMTA-20220727.slm

/sdcard/SampleData/GeometryInfo/World.smwu

另外按调试(Debug)按钮的时候好像总是在Environment.initialization(this);这一步闪退。

运行日志(Error部分):

2022-08-18 23:54:08.528 20125-20125/? E/xample.maptest: Unknown bits set in runtime_flags: 0x28000

2022-08-18 23:54:08.832 20125-20125/com.example.maptest4 E/AndroidRuntime: FATAL EXCEPTION: main

    Process: com.example.maptest4, PID: 20125

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maptest4/com.example.maptest4.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference

        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3535)

        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3674)

        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)

        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:151)

        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:111)

        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2237)

        at android.os.Handler.dispatchMessage(Handler.java:107)

        at android.os.Looper.loop(Looper.java:238)

        at android.app.ActivityThread.main(ActivityThread.java:7890)

        at java.lang.reflect.Method.invoke(Native Method)

        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)

        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:983)

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference

        at com.supermap.data.Environment.encryptionMac(Environment.java:2283)

        at com.supermap.data.Environment.writeFile(Environment.java:2312)

        at com.supermap.data.Environment.checkDevice_New(Environment.java:836)

        at com.supermap.data.Environment.initialization(Environment.java:626)

        at com.example.maptest4.MainActivity.onCreate(MainActivity.java:25)

        at android.app.Activity.performCreate(Activity.java:7989)

        at android.app.Activity.performCreate(Activity.java:7978)

        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)

        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3506)

        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3674) 

        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 

        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:151) 

        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:111) 

        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2237) 

        at android.os.Handler.dispatchMessage(Handler.java:107) 

        at android.os.Looper.loop(Looper.java:238) 

        at android.app.ActivityThread.main(ActivityThread.java:7890) 

        at java.lang.reflect.Method.invoke(Native Method) 

        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 

        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:983) 

2 个回答

您好,根据您的描述,有以下几点要提出

1.是否有申请动态权限呢,如果没有,请在主活动类里面加上

private void requestPermissions() { //Android6.0以上设备设置动态权限
    if (Build.VERSION.SDK_INT >= 23) {
        // 检查是否拥有权限
        String[] permissions = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.CHANGE_WIFI_STATE,
        };
        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;
            }
        }
    }

}

之后在onCreate的第二句调用该方法,同时在AndroidManiFest.xml里面加上权限,比如这些

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

这样应用就可以访问设备文件并识别到许可

2.工程的build.gradle的defaultConfig节点下面有没有加

ndk {
    abiFilters 'armeabi-v7a'
}

这块不加则连接不上动态库

3.如果上述两部还是不能解决问题,注意许可路径需要为许可所在文件夹的名称加上“/”(比如许可在根目录/SuperMap/license这个文件夹下面,那么就是

Environment.setLicensePath(
android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
+"/SuperMap/license/");

),如果路径也对了,建议您更换一下许可

希望可以帮助到您

3,475EXP 2022年08月19日

感谢您的指导;但本人刚刚入门,对安卓开发的基本操作还不太熟悉,对您所述“申请动态权限”部分不太明白应该如何操作,另外两条都没问题。望再次予以指导,深表感谢!问题如下:

1.在“主活动类”里面加上:

private void requestPermissions() { //Android6.0以上设备设置动态权限

    if (Build.VERSION.SDK_INT >= 23) {

        // 检查是否拥有权限

        String[] permissions = {......

这个我不知道该往哪加,是acticity_main.xml还是MainActivity.java还是其他位置啊?

2.在onCreate的第二句调用该方法,这个我也不知道“调用这个方法”该怎么写。

兄弟 你项目里边的buiild gradle 里边的

compileSdk 28
targetSdk 28

你要是最新的studio 应该是一开创建项目的时候是32 改成28 

 然后就是官方人家给你说的该改的都改一下既可以了

之前我也是把该加的都加上了 一运行就是Environment.initialization(this);这一步报空指针  

145EXP 2022年08月19日
对,这步是关键,不然即使上面都做了,运行还是空指针闪退

为什么我改完之后这样了crying

你百度搜一下 我第一次也是这样的 后来下载的啥东西啊 就没事了
...