【问题标题】:"gps" location provider requires ACCESS_FINE_LOCATION permission for android 6.0“gps”位置提供者需要 ACCESS_FINE_LOCATION 权限以用于 android 6.0
【发布时间】:2016-02-25 05:29:37
【问题描述】:

在 android 清单文件中,我添加了以下 gps 访问位置的权限

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

我正在使用位置管理器类进行如下位置更新

 private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
 private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
 locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    MIN_TIME_BW_UPDATES,
                    MIN_DISTANCE_CHANGE_FOR_UPDATES, 
                    this
                );

但是上面一行给出了一个例外说明

"gps" location provider requires ACCESS_FINE_LOCATION permission

这件事只发生在 targetSDKVersion 23(即 android 6.0)上,我也在 android 5.1 中测试过,效果很好。

请帮忙!!。在此先感谢。

【问题讨论】:

  • 您是否将 stackoverflow.com/a/16691500/1615430
  • 是的,我按照清单节点的要求做得很好。注意这里的问题只存在于 android 6.0

标签: android


【解决方案1】:

从 6.0 开始,某些权限被视为“危险”(FINE_LOCATION 就是其中之一)。

为了保护用户,他们必须在运行时获得授权,以便用户知道这是否与他的行为有关。

要做到这一点:

 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

它将显示一个对话框,用户将在其中选择是否自动让您的应用使用位置信息。

然后使用此函数获取用户答案:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
        return;
        }
            // other 'case' lines to check for other
            // permissions this app might request
    }
}

如果用户接受一次,那么您的应用程序会记住它,您将不再需要发送此 DialogBox。请注意,如果他决定,用户可以稍后禁用它。然后在请求位置之前,您必须测试是否仍然授予权限:

public boolean checkLocationPermission()
{
    String permission = "android.permission.ACCESS_FINE_LOCATION";
    int res = this.checkCallingOrSelfPermission(permission);
    return (res == PackageManager.PERMISSION_GRANTED);
}

这一切都在 Android 文档中进行了解释:http://developer.android.com/training/permissions/requesting.html

【讨论】:

  • 不错的详细答案,太棒了!也会尝试一下,还没有检查过 Android Marshmellow。我想这会破坏对许多应用程序的兼容性,因此它们不会在使用以前版本的设备上快速推出?
  • 我最近在我正在开发的应用程序上尝试它时自己并没有考虑到这一点 :) 我想在此更新之前授予的危险权限将保持授予,即使它们是安装时授予。
  • 请注意,用户现在可以决定在应用程序 android 设置中禁用该权限。
  • 感谢您的回答。但我只想补充一点,Manifest.permission *应该小心选择Manifest。因为在我的 android studio 上,我得到了 3 个或更多 Manifest 文件。
  • 为什么不需要 ACCESS_COARSE_LOCATION?
【解决方案2】:

试试这个代码

private void marshmallowGPSPremissionCheck() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                && getActivity().checkSelfPermission(
                Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && getActivity().checkSelfPermission(
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
                            Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSION_LOCATION);
        } else {
            //   gps functions.
        }
    }

也添加这个......

@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] grantResults) {
        if (requestCode == MY_PERMISSION_LOCATION
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //  gps functionality
        }
    }

【讨论】:

  • 这里的 getActivity() 是什么?实际发生了什么??请您解释一下
  • 这家伙的代码一定是在片段中,或者类似的东西。您可以使用 getActivity() 来获取上下文,以防您在扩展 Fragment 而不是 Activity 的类中。
  • 这段代码对你有用吗?如果您在活动中使用它,请删除 getActivity()。这段代码实际上是在运行时检查 location 的权限。
【解决方案3】:

自版本 6 起,我们对 android 权限进行了一些更改。您必须在使用它们时同意权限,而不是在安装应用程序时。如果您使用 buildtools 版本 23,可能会出现一些问题。检查this link 了解。转到设备设置>应用并选择您的应用,然后手动接受权限并检查您的问题是否已解决。

【讨论】:

    【解决方案4】:

    我最近也遇到过这个问题。在 Android 6.0 中,您需要在应用程序中使用它们时明确请求所需的权限。如果您不这样做,则位置权限将被自动拒绝。

        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(thisActivity,
                        Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
    
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                    Manifest.permission.ACCESS_FINE_LOCATION)) {
    
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
    
            } else {
    
                // No explanation needed, we can request the permission.
    
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_FINE_LOCATION);
    
                // MY_PERMISSIONS_REQUEST_FINE_LOCATION is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }
    

    更多信息在这里:http://developer.android.com/training/permissions/requesting.html

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      相关资源
      最近更新 更多