安卓6系统上出现的安全异常问题

13
java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.

这个应用在 Android 5(棒棒糖)版本上运行良好,但在 Android 6 上出现了安全异常。

2个回答

16
这是因为根据Android 6.0的新权限模型,这些权限被视为危险权限。
需要在运行时请求危险权限,并在每次使用之前都应进行检查。
您将不得不更改实现以适应新的权限模型

1
通常情况下,只有当您的目标 API 是 23 或更高版本时,才需要这样做。但是我们在 Android 6 上也遇到了这种异常情况。猜测 Android 的回退实现中存在漏洞。 - ubuntudroid

10

关于您的活动:

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;
        }

    }

}

1
loadPermissions() 函数中,当 checkSelfPermission() 返回 PackageManager.PERMISSION_GRANTED 时,应该有一个 else 子句来执行您的权限相关操作吗?只有在调用 requestPermissions() 后才会调用 onRequestPermissionsResult(),所以在我描述的情况下什么也不会发生。 - c0dehunter
只有主要思想是一个例子,也许在某些情况下你需要编写“else”实现。 - Hpsaturn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接