【问题标题】:Runtime permission (requestPermissions) is not working运行时权限 (requestPermissions) 不起作用
【发布时间】:2017-12-27 09:42:23
【问题描述】:

我必须在运行时检查 Fragment 中的权限以获取位置。 这是一个检查权限的函数。

    public void weather() {
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getActivity());

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

             requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 123);

            return;
        }
        mFusedLocationClient.getLastLocation()
                .addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {

                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                            syncData(latitude, longitude);

                        }
                    }
                });
        return;

    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 123) {
        weather();
    }
}

问题是我的代码像循环一样卡在其中。它不会授予权限,并且每次 if 检查都返回 true 并且我的代码像覆盖权限和 if 语句之间的循环一样来回切换。还有一件事,我们还需要清单中的这两个权限吗?

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

         requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 123);

        return;
    }

【问题讨论】:

  • 我不太确定,您可以尝试添加 ActivityCompat 作为前缀,如 ActivityCompat.checkSelfPermission 和 ActivityCompat.requestPermissions 并尝试吗?
  • 在低于 Marshmallow 的 Android 版本上无法正常工作!
  • if (requestCode == 123) {中的神奇数字123从何而来?
  • @M.ArslanKhan 试试 FragmentCompat.requestPermissions 吗?
  • 使用 Rxpermission 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'

标签: android permissions


【解决方案1】:

试试这个

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String permissions[],
                                       @NonNull int[] grantResults) {
    if (requestCode == 123) {
        if (grantResults.length == 1 &&
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            weather();

        } else {
            Toast.makeText(getActivity(), "Permission denied", oast.LENGTH_SHORT).show();
        }
    }
}

【讨论】:

    【解决方案2】:

    在 onRequestPermissionsResult 中尝试以下条件

    if (requestCode == 123 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            weather();
        }
    

    并且您可以删除和条件ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED,因为它属于与 ACCESS_FINE_LOCATION 相同的权限组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多