相关文章推荐
阳光的手套  ·  表示例 - Office Scripts ...·  12 月前    · 
爱逃课的牛排  ·  java jsp ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

In onRequestPermissionsResult grantResults on some device return empty when user decline the permission

Ask Question

In Shot: , In onRequestPermissionsResult grantResults on some device return empty and some device have a value PackageManager.PERMISSION_DENIED when user decline the permission.

I have implmeneted a solution for identify user has selected accepted , deny and deny with don't ask again for run time permission,based on https://stackoverflow.com/a/31925748/2941375 answer.

as per many docs i have seen,if user decline permission then it returns grantResults empty

Code i have used else if (grantResults[0] == PackageManager.PERMISSION_DENIED) so in else if part it throw Arrayindexoutofbound exception

i have tested code when user decline permission grantResults is not emplty for my case,but i have seen crash report on fabric console for grantResults there is many crash with arrayindexoutofbound ,

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PermissionManager.MY_PERMISSIONS_REQUEST_LOCATION_ACCESS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    DefineLocationService.start(this);
                    startNextActivity(0);
                } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                    boolean showRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0]);
                    if (!showRationale) {
                        // user also CHECKED "never ask again"
                        // you can either enable some fall back,
                        // disable features of your app
                        // or open another dialog explaining
                        // again the permission and directing to
                        // the app setting
                        startNextActivity(ARTIFICIAL_DELAY_MILLIS);
                    } else if (!PermissionManager.MY_REQUESTED_DIALOG) {
                        PermissionManager.checkLocationPermission(this);
                    } else {
                        startNextActivity(0);
                } else {
                    startNextActivity(ARTIFICIAL_DELAY_MILLIS);

can anyone have any explanation for this,why some device return grantResults empty and some device return grantResults have value with decline when user decline permission.

i have tested many time but grantResults never empty on my side,but there is crash on console,it means in some case it is empty and grantResults[0] throw the exception.

Note: It is possible that the permissions request interaction with the user is interrupted. In this case you will receive empty permissions and results arrays which should be treated as a cancellation.

How you want to deal with cancellation is totally up to you (re-ask for permission, treat it as a denial, etc), so just make sure to account for that case in your code.

is there anyway,using that i can reproduce this issue? i mean interrupted the interaction with user. – MJM Jun 9, 2018 at 5:13 The only way I found to reproduce it is with "Don't keep Activities" enabled, but then, all subsequent permission requests fail with empty grantResults coming. So the "totally up to you" doesn't really apply… Any help to deal with it properly is more than welcome. – Louis CAD May 1, 2019 at 20:12

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.