【问题标题】:ActivityCompat.requestPermissions does not show prompt when requesting ACCESS_BACKGROUND_LOCATIONActivityCompat.requestPermissions 请求 ACCESS_BACKGROUND_LOCATION 时不显示提示
【发布时间】:2021-05-27 07:51:03
【问题描述】:

在 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 一切正常,问题出在哪里?

【问题讨论】:

  • when requesting list of permission 您请求的不是权限列表,而是一一检查。此外,还可以请求权限列表。此外,不清楚您正在谈论哪个提示,因为检查权限不会导致提示。
  • but if i remove ACCESS_BACKGROUND_LOCATION from request 我们看不到您如何请求该权限。我们只看到您在 if 语句中检查它。目前还不清楚您要移除的东西在哪里。
  • where is problem ? 请更好地描述您的问题。
  • ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST);这是我请求权限的行,它在代码中 //Permissions is revked
  • 你认为我们知道那个调用会做什么?用哪种方法?您能否对我的 cmets 做出反应,因为我没有答案,我仍然不知道问题所在。

标签: java android permissions


【解决方案1】:

我发现解决方案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;
        }
    }
}

【讨论】:

  • 我们能否在一个数组中同时请求ACCESS_BACKGROUND_LOCATIONACCESS_FINE_LOCATION
  • 不,当两个请求时我都没有收到请求提示,所以我先请求ACCESS_FINE_LOCATION,然后如果请求成功,则执行下一个请求ACCESS_BACKGROUND_LOCATION
  • 为了处理订购、理由、永久拒绝和其他边缘情况,我想推广我自己的图书馆,我已经工作了很长时间。它的灵感来自 Google Fit 的做法。 github.com/warting/permissions-ui我希望有人觉得它有用。
猜你喜欢
  • 2016-09-05
  • 2016-05-30
  • 2017-07-03
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多