仅适用于 Android 6 的安全异常
Posted
技术标签:
【中文标题】仅适用于 Android 6 的安全异常【英文标题】:Security Exception only on Android 6 【发布时间】:2016-01-08 21:42:19 【问题描述】:java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
该应用在 android 版本 5(Lollipop)上运行良好,但在 Android 版本 6 上出现安全异常。
【问题讨论】:
【参考方案1】:这是因为根据 android 6.0 的新权限模型,这些权限是危险权限。
需要在运行时请求危险权限,并且每次使用前都应检查。
您必须将您的实现更改为adapt new permission model。
【讨论】:
如果您的目标是 API 23+,通常这应该是必要的。不过,我们在 Android 6 上也遇到过此类异常。猜测 Android 的后备实现中存在错误。【参考方案2】:关于你的活动:
private static final int REQUEST_FINE_LOCATION=0
...
loadPermissions(Manifest.permission.ACCESS_FINE_LOCATION,REQUEST_FINE_LOCATION);
实施:
private void loadPermissions(String perm,int requestCode)
if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED)
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, perm))
ActivityCompat.requestPermissions(this, new String[]perm,requestCode);
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
switch (requestCode)
case REQUEST_FINE_LOCATION:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
// granted
else
// no granted
return;
【讨论】:
在loadPermissions()
函数中,不应该有一个else
子句(当checkSelfPermission()
返回PackageManager.PERMISSION_GRANTED
你在哪里做你的许可方面的事情?onRequestPermissionsResult()
只会被调用在调用requestPermissions()
之后,所以在我描述的情况下什么都不会发生。
只是主要思想一个例子,也许在某些情况下你已经编写了“else”实现。以上是关于仅适用于 Android 6 的安全异常的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.UnsatisfiedLinkError CameraDetector 仅适用于 ARMv7 设备
获取适用于 Android 的 Google Places API 密钥
iframe 安全错误 - 仅适用于 iOS 版 Chrome [重复]
Android - spotShadowAlpha 仅适用于线性布局