2

In my code, I request:

        int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
        int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
        int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS);

        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 2);

I also include:

@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 0: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);

                }
                return;
            }
            case 1: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);

                }
                return;
            }
            case 2: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 2);

                }
                return;
            }



            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }

When I run y app, I first get the request, and then, after a secon of not touching anything, my app crashes with the following error:

FATAL EXCEPTION: main
    Process: com.example.ortel.tagnet, PID: 28445
    java.lang.StackOverflowError: stack size 8MB
        at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894)
        at android.app.Activity.requestPermissions(Activity.java:4455)
        at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:507)
        at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894)
        at android.app.Activity.requestPermissions(Activity.java:4455)
        at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:507)
        at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894)
        at android.app.Activity.requestPermissions(Activity.java:4455)
        at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:507)
        at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894)

For Your Information, (MainActivityOld.java:894) is

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);

What is happening? It seems that it keeps calling my request.

Shouldn't it wait for my answer?

EDIT: Please Address if you don't know why this is happening.

Ron Arel
  • 371
  • 1
  • 5
  • 14

2 Answers2

0

You can try to request all your permissions at once calling Activity.requestPermissions with input a String[] with all the 3 permission you need to ask, in your code you are actually prompting the system to require the permissions with 3 different dialogues as separate entities, maybe when the second permission request is executed it overrides the first one and create a loop that generate the StackOverflowException.

Example:

List <String> str = new ArrayList <> ();
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (str.size() > 0) {
    String[]strings = new String[str.size()];
    str.toArray(strings);
    ActivityCompat.requestPermissions(StartActivity.this,
        strings,
        PERMISSION_CODE_STATE);
}

And then in the callback receiving the result to check if you received all the permissions something like that or examine every grantResult manually: boolean gotPermissions = true;

for (int i : grantResults) {
    if (i != PackageManager.PERMISSION_GRANTED) {
        gotPermissions = false;
        break;
    }
}
BeepHawkins
  • 56
  • 1
  • 7
0

See this answer.

You have an infinite loop which I'm guessing is caused by someone denying Location permission, and selecting the "Never ask agan" checkbox

Markymark
  • 2,804
  • 1
  • 32
  • 37