首页 > 解决方案 > 请求多个权限时Android权限被拒绝

问题描述

我需要在两个单独的请求中向用户询问 GPS 和文件系统权限。

预期行为:应用程序显示对 GPS 权限的请求,在用户做出决定后,应用程序将显示文件系统权限请求并让用户再次决定。

实际行为:仅显示对 GPS 权限的请求,并且文件系统权限被自动拒绝而不显示任何对话框。

目标 Android 版本: 5.0 及更高版本(API 21+)

有人可以告诉我如何解决这个问题吗?先感谢您!

我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    checkLocationPermissions();
    checkLoggingPermissions();

    ...
    ...
}

private void checkLoggingPermissions() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            Log.i(TAG, "Requesting filesystem permissions from user");

            ActivityCompat.requestPermissions(this, new String[]
                    {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE);
        }
        else {
            LoggingService.init();
        }
    }
    else {
        LoggingService.init();
    }
}

private void checkLocationPermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            Log.i(TAG, "Requesting GPS permissions from user");

            ActivityCompat.requestPermissions(this, new String[] {
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.INTERNET
            }, FrontendConstants.PERMISSION_GPS_REQUEST_CODE);
        }
        else {
            locationService = LocationService.getInstance(this);
        }
    }
    else {
        locationService = LocationService.getInstance(this);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] grantResults) {
    if(FrontendConstants.PERMISSION_GPS_REQUEST_CODE == requestCode) {
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, "+++ User accepted GPS permission request");
            locationService = LocationService.getInstance(this);
        }
        else {
            Log.e(TAG, "--- User rejected GPS permission request");
        }
    }

    if(FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE == requestCode) {
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, "+++ User accepted filesystem permission request");
            LoggingService.init();
        }
        else {
            Log.e(TAG, "--- User rejected filesystem permission request");
        }
    }
}

标签: javaandroidandroid-permissions

解决方案


理想情况下,您会在一个请求中执行此操作,以便为用户和您简化事情。

话虽如此,要获得您正在寻找的流量,请checkLoggingPermissions()从两个地方致电:

  1. 来自checkLocationPermissions(),如果用户已经从您的应用程序的某些过去运行中授予了这些权限(即,在您拥有的分支中locationService = LocationService.getInstance(this);

  2. From onRequestPermissionsResult(),如果用户刚刚授予了位置权限

而且,正如 Pawel 提到的那样, remove Manifest.permission.INTERNET,因为它是一种normal权限,不需要运行时验证。


推荐阅读