0

I'm working with run time permissions and trying to make a method displaying permission rationale/s for taken permission/s and rationale/s The problem is: "Variable 'requiredPermissions' is accessed from within inner class, needs to be declared final"

That's how I call the method:

       showRationale(R.string.permission_ACCESS_FINE_LOCATION_rationale, new String[]{Manifest.permission.ACCESS_FINE_LOCATION});

And that's the method:

private void showRationale(int rationale, String[] requiredPermissions) {
    Snackbar.make(findViewById(R.id.myCoordinatorLayout), rationale, Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.go_grant_permission, new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                                                                     // 'requiredPermissions' below causes the problem
                    ActivityCompat.requestPermissions(MapsActivity.this, requiredPermissions, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                }
            })
            .show();
}
Artur Ex
  • 43
  • 7

3 Answers3

0

You can realize onClick via interface, and not make this variable final.

Oleg Skidan
  • 617
  • 6
  • 24
0

What about this:

private void showRationale(int rationale, final String[] requiredPermissions) {
    Snackbar.make(findViewById(R.id.myCoordinatorLayout), rationale, Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.go_grant_permission, new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                                                                     // 'requiredPermissions' below causes the problem
                    ActivityCompat.requestPermissions(MapsActivity.this, requiredPermissions, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                }
            })
            .show();
}
David
  • 306
  • 6
  • 20
0

The problem is that local variables (and method arguments) must be final to be accessed inside inner classes like your OnClickListener. So you should add a final keyword before a declaration of the argument. To do so, change this line

private void showRationale(int rationale, String[] requiredPermissions) {

to

private void showRationale(int rationale, final String[] requiredPermissions) {

Read more on this topic here.

Community
  • 1
  • 1
Yury Fedorov
  • 14,508
  • 6
  • 50
  • 66