OnResquestPermissionResult from Adapter

Viewed 7556

I Have a BaseAdapter with a List of all requires permissions for use correctly the app.

I need to, after onClick in one of them, request the permission and check if is granted or not.

For request, I am using

ActivityCompat.requestPermissions

but I do not know how to get the results.

Is it possible to call O

nRequestpermissionsResultCallback

to know the answer of the user?

How can I do it?

5 Answers

so first i implement in the Adapter implements ActivityCompat.OnRequestPermissionsResultCallback then it require one Overide method

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        //  it is not work here  onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == storagePermission) {

            // getPosts(false);

            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(context.getApplicationContext(), "Please allow permission to Continue", Toast.LENGTH_SHORT).show();



            }

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              Toast.makeText(context.getApplicationContext(), " Permissions Granted Succecfully", Toast.LENGTH_SHORT).show();

        //here i load my method  that i want to run 
            }

        }
    }

now problem is this onRequestPermissionsResult is not call from adapter instead adapter triger onRequestPermissionsResult of the mainActivity Attach with the Adapter

so in main Activity i create this and run onRequestPermissionsResult of adapter by passing adapterPosts.onRequestPermissionsResult(requestCode,permissions,grantResults);

  @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == storagePermission) {

            // getPosts(false);

            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
           //permission not granted
            }

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               //permission granted

                adapterPosts.onRequestPermissionsResult(requestCode,permissions,grantResults);
                //loadImageIntent();
            }

        }
    }

In your adapter class

class Adapter extends RecyclerView.Adapter<Your adapter.MyViewHolder> implements ActivityCompat.OnRequestPermissionsResultCallback{`//enter code here`}

It will override the onRequestPermissionsResult

I have a same problem in RecylclerView.Adapter and I use this section in permission request method

private void requestCallPhonePerm() {
    if (ContextCompat.checkSelfPermission(context,
            Manifest.permission.CALL_PHONE)
            != PackageManager.PERMISSION_GRANTED) {
        onItemCallListener.itemCallPhone(itemPhones);
        ActivityCompat.requestPermissions((Activity)context,
                new String[]{Manifest.permission.CALL_PHONE},
                MY_PERMISSIONS_REQUEST_CALL_PHONE);
    } else {
        ((MainActivity)context).callPhone(itemPhones);
    }
}

It's important to use (Activity)context in "requestPermissions" method to be invoked callback in container activity of your adapter

And in my MainActivity that contain recycler I use overrided request permission result normally.

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch(requestCode){
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
                if(grantResults.length>0
                        &&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    new LoadContacts().execute();
                }
                break;
            case MY_PERMISSIONS_REQUEST_CALL_PHONE:
                if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    callPhone(phones);
                }else{

                }
        }
    }

I solved this from custom class. My custom class is derived from AppCompatActivity. Also you need to pass Activity context to your custom class and do whatever you need with it.

public bool AreStorageAndCamPermissionsGranted(Activity context)
        {
            if (Build.VERSION.SdkInt >= Build.VERSION_CODES.M)
                if (
                            context.CheckSelfPermission(Manifest.Permission.Camera)!= Android.Content.PM.Permission.Granted
                          || context.CheckSelfPermission(Manifest.Permission.ReadExternalStorage) != Android.Content.PM.Permission.Granted
                          || context.CheckSelfPermission(Manifest.Permission.WriteExternalStorage) != Android.Content.PM.Permission.Granted)
                {
                    ActivityCompat.RequestPermissions(context, new String[]
                   {
                                Manifest.Permission.Camera,
                                Manifest.Permission.ReadExternalStorage,
                                Manifest.Permission.WriteExternalStorage,
                   }, REQUEST_PERMISSION_CODE);
                }
            return true;
        }

`

Related