ActivityCompat.requestPermissions 请求时不显示提示 ACCESS_BACKGROUND_LOCATION

ActivityCompat.requestPermissions does not show prompt when requesting ACCESS_BACKGROUND_LOCATION

在 MainActivity 中请求权限:

对于 api >=29

当我请求权限时此代码不显示提示

public boolean RequestPermissions(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// api 29++
                final String[] PERMISSIONS_API_Q = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_BACKGROUND_LOCATION
        };

        if (    checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
               checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED
        )
        {//Permissions Granted
            GB.LOG("Permissions is granted");
            getAndroidId();// getting device information
            GB.isPermissionsGranted = true;
            if(MainFragment.MainHandler!=null){
                MainFragment.MainHandler.sendEmptyMessage(1);
            }
            LoadFoldersPath();
            if(GB.CanManualMode){
                CanConfig cc = new CanConfig();
                cc.execute();
            }
            return true;
        }
        else {//Permissions is revoked 
            GB.LOG("Permissions is revoked");
            Dialogs LocationInfoDialog = new Dialogs(MainActivity.this);
            View.OnClickListener onClickListener= v -> {
                ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST); //here is permission request 
                GB.isPermissionsGranted = false;
            };
            LocationInfoDialog.GPSUsageInBackGroundInfo(onClickListener);
            return false;
        }
    }
}

当我删除这行时

>     Manifest.permission.ACCESS_BACKGROUND_LOCATION
>     checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) ==
>     PackageManager.PERMISSION_GRANTED

这段代码工作正常

public boolean RequestPermissions(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// api 29++
                final String[] PERMISSIONS_API_Q = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.ACCESS_COARSE_LOCATION,
        };

        if (    checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
               checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                
        )
        {//Permissions Granted
            GB.LOG("Permissions is granted");
            getAndroidId();// getting device information
            GB.isPermissionsGranted = true;
            if(MainFragment.MainHandler!=null){
                MainFragment.MainHandler.sendEmptyMessage(1);
            }
            LoadFoldersPath();
            if(GB.CanManualMode){
                CanConfig cc = new CanConfig();
                cc.execute();
            }
            return true;
        }
        else {//Permissions is revoked 
            GB.LOG("Permissions is revoked");
            Dialogs LocationInfoDialog = new Dialogs(MainActivity.this);
            View.OnClickListener onClickListener= v -> {
                ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST); //here is permission request 
                GB.isPermissionsGranted = false;
            };
            LocationInfoDialog.GPSUsageInBackGroundInfo(onClickListener);
            return false;
        }
    }
}

您甚至可以在这里比较这两个代码以查看差异 https://text-compare.com/

但是如果我从请求中删除 ACCESS_BACKGROUND_LOCATION 一切正常,问题在哪里?

我发现解决方案 Manifest.permission.ACCESS_BACKGROUND_LOCATION 只有在您已经获得 ACCESS_FINE_LOCATION 许可后才能请求

这是结果

    private static final int REQUEST = 1;

    public boolean RequestPermissions() {
    final String[] PERMISSIONS_API_M = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.INTERNET,
            Manifest.permission.ACCESS_NETWORK_STATE,
            Manifest.permission.ACCESS_COARSE_LOCATION};
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
        ) {

            if (!(checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
                final String[] PERMISSIONS_API_Q = {
                        Manifest.permission.ACCESS_BACKGROUND_LOCATION
                };
                Dialogs AccessBackGroundDialog = new Dialogs(MainActivity.this);
                View.OnClickListener onClickListener = v -> {
                    ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST);
                };
                AccessBackGroundDialog.GPSUsageInBackGroundInfo(onClickListener, true);
                return false;
            }
            GB.LOG("Permissions is granted");
            getAndroidId();// getting device information
            GB.isPermissionsGranted = true;
            if (MainFragment.MainHandler != null) {
                MainFragment.MainHandler.sendEmptyMessage(1);
            }
            LoadFoldersPath();
            if (GB.CanManualMode) {
                CanConfig cc = new CanConfig();
                cc.execute();
            }
            return true;
        } else {
            GB.LOG("Permissions is revoked");
            ActivityCompat.requestPermissions(this, PERMISSIONS_API_M, REQUEST);
            GB.isPermissionsGranted = false;
            return false;
        }
    }
}