赞
踩
好几月了,博客一直没有动静。因为项目太大,太忙了,终于可以空出几天透透气哩。
广东最近天气不是很好,一个星期连续来了两个台风。虽然说下雨天缓解了天气的闷热,但是连续好多天下雨,让整个人都没那么精神,沉闷沉闷滴。哈哈,还是阳光明媚好,
心情也好,整个人都好。
今天讲讲一个最近有人问我的一个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掉。问题也就解决了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。