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?
我试图通过在 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 package com.abc.xyz
当我尝试使用 adb shell 授予权限时,我在 SDK-25 上运行的应用程序未授予权限,
adb shell pm grant com.abc.xyz
android.Manifest.permission.ACCESS_COARSE_LOCATION
我怀疑 Android 从 SDK 版本 25 授予了这些权限(如果我错了请纠正我)。仅通过谷歌搜索,我无法弄清楚 SDK 版本之间的权限 level/severity 是如何变化的。
请帮我了解一下。
试试这个。
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 级别而异:
如果您应用的目标 SDK 为 22 或更低:如果您在您的
清单,用户必须在安装时授予权限
应用程序;如果他们不授予权限,则系统根本不会安装该应用程序。
如果您应用的目标 SDK 为 23 或更高版本:应用必须在清单中列出权限,并且必须在应用处于 运行ning 时请求它需要的每个危险权限。用户可以授予或拒绝每个权限,应用程序可以继续 运行 有限
即使用户拒绝权限请求。
你可以参考这个Link
您还应该记住的另一件事是,ACCESS_FINE_LOCATION
为您提供了更好、更准确的位置,而 ACCESS_COARSE_LOCATION
为您提供了不太准确的位置。
ACCESS_FINE_LOCATION 包括 ACCESS_COARSE_LOCATION。但是,有一个问题:
ACCESS_COARSE_LOCATION 为您提供电池友好的最后已知位置 https://developer.android.com/training/location/retrieve-current.html#setup
但是,如果您需要像 Pokemon Go 这样的实时/实时位置,请使用 ACCESS_FINE_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 package com.abc.xyz
当我尝试使用 adb shell 授予权限时,我在 SDK-25 上运行的应用程序未授予权限,
adb shell pm grant com.abc.xyz android.Manifest.permission.ACCESS_COARSE_LOCATION
我怀疑 Android 从 SDK 版本 25 授予了这些权限(如果我错了请纠正我)。仅通过谷歌搜索,我无法弄清楚 SDK 版本之间的权限 level/severity 是如何变化的。
请帮我了解一下。
试试这个。
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 级别而异:
如果您应用的目标 SDK 为 22 或更低:如果您在您的
清单,用户必须在安装时授予权限
应用程序;如果他们不授予权限,则系统根本不会安装该应用程序。
如果您应用的目标 SDK 为 23 或更高版本:应用必须在清单中列出权限,并且必须在应用处于 运行ning 时请求它需要的每个危险权限。用户可以授予或拒绝每个权限,应用程序可以继续 运行 有限
即使用户拒绝权限请求。
你可以参考这个Link
您还应该记住的另一件事是,ACCESS_FINE_LOCATION
为您提供了更好、更准确的位置,而 ACCESS_COARSE_LOCATION
为您提供了不太准确的位置。
ACCESS_FINE_LOCATION 包括 ACCESS_COARSE_LOCATION。但是,有一个问题:
ACCESS_COARSE_LOCATION 为您提供电池友好的最后已知位置 https://developer.android.com/training/location/retrieve-current.html#setup
但是,如果您需要像 Pokemon Go 这样的实时/实时位置,请使用 ACCESS_FINE_LOCATION 它为您提供实时/实时位置。