sdk 22 和 25 之间的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限有啥区别吗?

Posted

技术标签:

【中文标题】sdk 22 和 25 之间的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限有啥区别吗?【英文标题】:Is there any difference between ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions between sdk 22 and 25?sdk 22 和 25 之间的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限有什么区别吗? 【发布时间】:2019-08-02 12:25:45 【问题描述】:

我试图通过在 androidManifest.xml 中声明它来从 GPS 或网络提供商获取当前位置,为此我正在使用这些权限,

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

我在运行时验证权限,

ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)

ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED

它适用于我的 Android SDK 版本 22,而在 SDK 版本 25 中,虽然权限是在 AndroidManifest.xml 中声明的,但它不会在运行时反映。

我检查了这些权限是否被授予,

adb shell dumpsys 包 com.abc.xyz

当我尝试使用 adb shell 授予权限时,我在 SDK-25 上运行的应用未授予权限,

adb shell pm grant com.abc.xyz android.Manifest.permission.ACCESS_COARSE_LOCATION

我怀疑 Android 是从 SDK 版本 25 授予这些权限的(如果我错了,请纠正我)。通过谷歌搜索,我无法弄清楚 SDK 版本之间的权限级别/严重性如何变化。

请帮我了解一下。

【问题讨论】:

ACCESS_FINE_LOCATION 涵盖两者。如果你有ACCESS_FINE_LOCATION,那么你就不需要ACCESS_COARSE_LOCATION。\ 阅读developer.android.com/guide/topics/location/… 澄清。 【参考方案1】:

在所有版本的 Android 上,您的应用都需要在其应用清单中声明其所需的正常权限和危险权限,如声明权限中所述。但是,根据系统版本和应用的目标 SDK 级别,该声明的效果会有所不同:

如果您应用的目标 SDK 为 22 或更低版本:如果您在 manifest,用户必须在安装时授予权限 应用程序;如果他们不授予权限,则系统根本不会安装该应用程序。 如果您的应用的目标 SDK 为 23 或更高版本:应用必须在清单中列出权限,并且必须在应用运行时请求它需要的每个危险权限。用户可以授予或拒绝每个权限,并且应用程序可以在受限的情况下继续运行 即使用户拒绝权限请求。 你可以参考这个Link

【讨论】:

您可以查看上面提到的 Android 开发者文档链接【参考方案2】:

试试这个。

 private boolean RequestPermissions() 

    int camera = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA);
    int storage = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    List<String> listPermissionsNeeded = new ArrayList<>();
    if (camera != PackageManager.PERMISSION_GRANTED) 
        listPermissionsNeeded.add(CAMERA);
    
    if (storage != PackageManager.PERMISSION_GRANTED) 
        listPermissionsNeeded.add(WRITE_EXTERNAL_STORAGE);
        listPermissionsNeeded.add(READ_EXTERNAL_STORAGE);

    
    if (!listPermissionsNeeded.isEmpty()) 
        ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray
                (new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
        return false;
    

    return true;

这是检查是否需要权限的功能,如果权限不可用,它将向用户询问。

【讨论】:

真的需要向用户请求吗?如何检查 Android 何时对 SDK 版本施加此类限制? 我在哪里可以查看这些信息?我无法通过 Android 开发者文档找到它。 在清单中执行此操作并编写上行代码进入java文件,你很高兴。【参考方案3】:

您应该记住的另一件事是,ACCESS_FINE_LOCATION 为您提供更好、更准确的位置,而ACCESS_COARSE_LOCATION 为您提供不太准确的位置。

【讨论】:

【参考方案4】:

ACCESS_FINE_LOCATION 包括 ACCESS_COARSE_LOCATION。但是,有一个问题:

ACCESS_COARSE_LOCATION 为您提供最后已知的位置,这是电池友好的https://developer.android.com/training/location/retrieve-current.html#setup

但是,如果您需要像 Pokemon Go 这样的实时/实时位置,请使用 ACCESS_FINE_LOCATION 它为您提供实时/实时位置。

【讨论】:

以上是关于sdk 22 和 25 之间的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限有啥区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过将 sdk 定位到 22 来发布我们的应用程序而不询问运行时权限是不是很好

SDK版本

使用 yocto sdk 交叉编译 pistache

Lync 客户端 SDK 控件的 UI 是不是有任何更改?

[转]关于sdk更新Android SDK Tools 25.3.1版本后使用sdk manager闪退

Skype for Business UCMA SDK