【问题标题】:java.lang.SecurityException: "passive" location provider requires ACCESS_FINE_LOCATION permission on API level 26java.lang.SecurityException:“被动”位置提供程序需要 API 级别 26 的 ACCESS_FINE_LOCATION 权限
【发布时间】:2019-02-12 11:03:30
【问题描述】:

我有 android 应用程序,我们最近从 API 级别 22 转移到了 API 级别 26。

我已检查该应用是否具有 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限之一。

我发现但无法解决的一个问题是它给出了一个异常,例如 “java.lang.SecurityException:“被动”位置提供程序需要 ACCESS_FINE_LOCATION 权限”

我的 Android 清单文件有:

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

我也遇到了这种异常:

Process: edu.syr.ischool.orange.indoormap3, PID: 12666
    java.lang.SecurityException: "passive" location provider requires ACCESS_FINE_LOCATION permission.
        at android.os.Parcel.readException(Parcel.java:2005)
        at android.os.Parcel.readException(Parcel.java:1951)
        at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:802)
        at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1220)
        at utils.CheckinUtils.checkLocation(CheckinUtils.java:100)
        at utils.CheckinUtils.resume(CheckinUtils.java:247)

也是我的 checkinUtil --> checkLocation 方法

 if (ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        locationManager = (LocationManager) activity.getSystemService(serviceString);
        Location lastKnow =  locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

我已经检查了其中任何一个的许可,如 https://developer.android.com/reference/android/location/LocationManager#getLastKnownLocation(java.lang.String) 所记录的那样

仍然,它为 ACCESS_FINE_LOCATION 提供了一个异常,但由于它通过了​​ if 条件并提供了安全异常,因此它应该具有 ACCESS_COARSE_LOCATION 权限。那么为什么应用会崩溃呢?

【问题讨论】:

  • 应用程序在上述日志中崩溃?
  • 可以使用运行时权限吗
  • @UmangBurman ,是的,应用程序在上述日志中崩溃。还有 Location lastKnow = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);这一行是 CheckinUtils.java:100
  • Nilesh,请查看答案一次。并尝试
  • 您的 if 表达式不正确,因为它目前需要拒绝 both 权限才能发生return

标签: java android android-permissions android-location android-api-levels


【解决方案1】:

据我所知, 您只是检查是否授予权限。

如果您的应用程序/代码未在未授予权限的情况下结束,请确保通过调用...来请求权限...

ActivityCompat.requestPermissions(this, permissionsStringArray,requestCodeInt);

在检查自我权限时,请尝试使用ContextCompat 而不是ActivityCompat

【讨论】:

    【解决方案2】:

    解决方案:

    代替这一行:

    if (ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    

    这样写:

    if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    

    您正在获取 Android 的内置权限,这可能是错误。

    您必须从 Manifest 那里获得您提到的许可。

    所以不是android.Manifest.permission.ACCESS_FINE_LOCATION,应该只是Manifest.permission.ACCESS_FINE_LOCATION

    【讨论】:

      【解决方案3】:

      Android 清单文件应该是这样的:

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-feature android:name="android.hardware.location.gps" />
      

      您可以在这里找到更多详细信息Request User Permissions 并使用您的 java 代码而不是: Location lastKnow = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);如下

        try {
          Location lastKnow1 = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
          Location lastKnow2 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
          Location lastKnow3 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
          if(lastKnow1 != null){
             --- your code ---
          } if(lastKnow2 != null){
             --- your code ---
          } if(lastKnow3 != null){
             --- your code ---
          } else {
             --- Toast ---
          }
        } catch (Exception e) {
                  e.printStackTrace();
                }
      

      通过使用上述代码,您将永远不会遇到异常问题。 ** 快乐编码 **

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        • 2011-09-21
        • 2019-11-13
        • 1970-01-01
        相关资源
        最近更新 更多