在要求多个权限时,Android权限被拒绝

问题描述 投票:1回答:2

我需要在两个单独的请求中询问用户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");
        }
    }
}
java android android-permissions
2个回答
1
投票

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

话虽如此,为了获得你正在寻求的流量,请从两个地方打电话给checkLoggingPermissions()

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

并且,as Pawel mentioned,删除Manifest.permission.INTERNET,因为它是normal权限,不需要运行时验证。


0
投票

所以我用你的建议解决了这个问题。我现在的方法是在一个请求中请求所有权限,然后在onRequestPermissionsResult中分析结果。

为此,我创建了PermissionsHelper类:

import android.content.pm.PackageManager;

public class PermissionsHelper {
    private String[] permissions;
    private int[] grantResults;

    public PermissionsHelper(String[] permissions, int[] grantResults) {
        this.permissions = permissions;
        this.grantResults = grantResults;
    }

    public boolean isPermissionGranted(String permission) {
        final int length = permissions.length;

        for(int i = 0; i < length; i++) {
            if(permissions[i].equals(permission)) {
                return grantResults[i] == PackageManager.PERMISSION_GRANTED;
            }
        }

        // if permission wasn't found, we weren't even asking for it, so we consider it
        // as granted
        return true;
    }

    public boolean arePermissionsGranted(String ... permissions) {
        for(String permission : permissions) {
            if(!isPermissionGranted(permission)) return false;
        }

        return true;
    }
}

然后我在我的Activity中执行此操作,它似乎完美无缺:

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

private void requestPermissions(String[] permissions) {
    List<String> notGranted = new ArrayList<>();

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        for(String permission : permissions) {
            if(checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                notGranted.add(permission);
            }
        }

        if(!notGranted.isEmpty()) {
            ActivityCompat.requestPermissions(this, notGranted.toArray(new String[0]),
                    FrontendConstants.PERMISSION_REQUEST_CODE);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    if(FrontendConstants.PERMISSION_REQUEST_CODE == requestCode) {
        PermissionsHelper helper = new PermissionsHelper(permissions, grantResults);

        if(helper.isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            Log.i(TAG, "+++ User accepted filesystem permission request");
        }
        else {
            Log.e(TAG, "--- User rejected filesystem permission request");
        }

        if(helper.arePermissionsGranted(Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION)) {
            Log.i(TAG, "+++ User accepted GPS permission request");
        }
        else {
            Log.e(TAG, "--- User rejected GPS permission request");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.