【问题标题】:onRequestPermissionsResult returns immediately with denied permissiononRequestPermissionsResult 立即返回拒绝权限
【发布时间】:2016-02-25 16:36:38
【问题描述】:

我的 Android 应用需要请求位置服务权限。我这样做:

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

但是在这个被调用之后,onRequestPermissionsResult 立即返回权限被拒绝:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ACCESS_COARSE_LOCATION: {

        }
    }
}

权限在清单中列出:

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

我还清除了缓存,以防止用户之前的任何拒绝都影响到这一点。

我希望弹出一个对话框,请求用户授予或拒绝位置服务的权限,但它没有显示。

【问题讨论】:

  • 我也有同样的问题,但我的权限拼写正确。这种行为的任何其他原因? @AndroidDev
  • 我们还在等待答案...@AndroidDev

标签: android permissions


【解决方案1】:

变化:

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

到:

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

该权限适用于“粗略”的位置数据(即,不是细粒度的),而不是“课程”的位置数据(例如,一些大学课程的举办地)。

【讨论】:

  • 奇怪的是,我遇到了另一个 SO 帖子,它也表明拼写错误,所以我确实检查了拼写,但它仍然超出了我的范围。 :-(
  • @AndroidDev:可能会更糟。您可以拼写为COERSE。 :-)
【解决方案2】:
private int PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 100;  
private void checkPermission() {
     if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
             != PackageManager.PERMISSION_GRANTED) {
          requestPermissions(newString[{Manfest.permission.ACCESS_COARSE_LOCATION},
                  PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
      } else {
          doShowLocation();
      }
  }

  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions,
          int[] grantResults) {
      if (requestCode == PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION
              && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          showContacts();
     }
  }

【讨论】:

  • 我正在这样做。为了简单起见,我把它从我的帖子中删除了。但是这段代码是在最新版本的 Marshmallow 上运行的。
  • 有很多事情要注意,还要放置 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
【解决方案3】:

onRequestPermissionsResult 甚至在权限对话框出现之前就可以返回拒绝权限的另一种情况是,当您在 android manifest 中声明了一些其他权限并在运行时询问其他一些权限时。例子: 你已经声明了

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

在 android 清单文件中。但是你试图得到

Manifest.permission.SEND_SMS

在运行时权限。因此,为 READ_SMS 设置运行时权限将毫无问题。

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2013-10-13
    相关资源
    最近更新 更多