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

时间:2019-03-12 05:13:42

标签: android android-manifest android-permissions android-location

我试图通过在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授予com.abc.xyz   android.Manifest.permission.ACCESS_COARSE_LOCATION

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

请帮助我了解一下。

4 个答案:

答案 0 :(得分:2)

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

如果应用的目标SDK为22或更低版本:如果您在自己的应用中列出了危险权限 清单,则用户在安装 应用程式;如果他们没有授予该权限,则系统根本不会安装该应用程序。

如果您的应用程序的目标SDK为23或更高版本:该应用程序必须在清单中列出权限,并且该应用程序在运行时必须请求它需要的每个危险权限。用户可以授予或拒绝每个权限,并且该应用可以在有限的情况下继续运行 即使用户拒绝许可请求,也无法使用。

您可以参考此Link

答案 1 :(得分:1)

尝试一下。

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

此功能可检查是否需要许可,如果许可不可用,它将询问用户。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

ACCESS_FINE_LOCATION包括ACCESS_COARSE_LOCATION。但是,有一个陷阱:

ACCESS_COARSE_LOCATION为您提供了最近知道的位置,该位置对电池友好https://developer.android.com/training/location/retrieve-current.html#setup

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