仅适用于 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 仅适用于线性布局

适用于 android 的 Cordova '本机文件选择器'插件不起作用

segues 仅适用于导航控制器吗? [关闭]