JNI DETECTED ERROR IN APPLICATION:java.lang.SecurityExceptionandroid--解决JNI安全权限异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qwe0754444/article/details/77650512

           好几月了,博客一直没有动静。因为项目太大,太忙了,终于可以空出几天透透气哩。

           广东最近天气不是很好,一个星期连续来了两个台风。虽然说下雨天缓解了天气的闷热,但是连续好多天下雨,让整个人都没那么精神,沉闷沉闷滴。哈哈,还是阳光明媚好,

心情也好,整个人都好。

          今天讲讲一个最近有人问我的一个android问题。大概是这样子的,小伙子公司主要是做平板项目,而且是定制平板跑他们的android项目。但是,他们之前一直都

使用华为或者联想5.1的android版本。然后最近他们公司想要换设备,换成一种工业平板,很重、很厚那种。因为是工业平板,定制性很强,android系统被阉割得很少。

使用的是android 6.0系统的工业平板,一跑起项目就会崩溃。项目在android5.1平板跑起来完全没问题,关键是没有做任何混淆,文件没被忽略。我就让他把logcat日志

发给我看,我看看什么原因导致程序cash掉。

           我贴上logcat日志,方便看出error

           

            很容易,你可以看到JNI异常,提示的安全异常,一目了然。然后后面提示是权限,因为程序启动,android系统都会去读取设备的一些权限。很快,那哥们知道了这个READ_

PHONE_STATE权限,然后他就去查找了项目中清单文件这个权限,发现已经有这个权限了,感觉很奇怪,为什么还有这个报权限的异常。

            我马上意识到他应该是引用了第三sdk项目中,项目中也应该存在不安全的权限。我想到以前项目引用萤石云,也报了这个异常。因为android6.0以上系统有危险权限

去判断,由用户去选择是否允许授权。当你没有让用去选择允许授权,应用程序将直接被cash掉。谷歌公司认为如果你强制为用户开启权限是不安全的,肯定不让你干啦。

           我具体解决方案是这样子:

           1.首先你调用的第三方sdk初始化,要去动态判断权限

           2.当你不知道在哪里调用权限的时候,你可以只用放到登录界面去判断权限

           3.动态判断完权限,你再去初始化

     if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)   //权限判断
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},    //添加权限
                    1);
        } else {
            initSDK();    //初始化
      }
           这是解决危险权限的问题代码,如果放置到登录界面,就会去提醒用户开启权限,这样android6.0系统就不会cash掉。问题也就解决了。

猜你喜欢

转载自blog.csdn.net/qwe0754444/article/details/77650512
JNI