How do you implement PermissionAwareActivity for react native?

Viewed 3201

There is very little documentation on react native's PermissionAwareActivity and I need to implement its methods for Android API 23+ to allow the user to accept / decline bluetooth permissions.

import android.support.v4.app.ActivityCompat; 
import com.facebook.react.modules.core.PermissionAwareActivity;
import com.facebook.react.modules.core.PermissionListener;
public class MainActivity extends ExponentActivity implements PermissionAwareActivity {

  private PermissionListener mPermissionListener;

  @Override
  public int checkPermission(String permission, int pid, int uid) {
    return PackageManager.PERMISSION_GRANTED;
  }

  @Override
  public  int checkSelfPermission(String permission) {
    return PackageManager.PERMISSION_GRANTED;
  }

  @Override
  public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) {
    mPermissionListener = listener;
    ActivityCompat.requestPermissions(this, permissions, requestCode);
  }


  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // callback to native module
    mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults);
  }
  ...

I'm not really sure how I'm suppose to implement these methods. Any help is appreciated. Even if someone can point me to some documentation or resource which I cannot find.

3 Answers

If you are not using an activity that is not derived my ReactActivity and needs to be permission aware, add the following to your activity:

import com.facebook.react.modules.core.PermissionAwareActivity;
import com.facebook.react.modules.core.PermissionListener;

....

public class MyActivity extends Activity implements PermissionAwareActivity {
    private PermissionListener permissionListener;

   ....


       @TargetApi(Build.VERSION_CODES.M)
    public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) {
        permissionListener = listener;
        requestPermissions(permissions, requestCode);
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (permissionListener != null && permissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
            permissionListener = null;
        }
    }
}

I got the code from here. Suggested here.

I found the default implementation of the PermissionAwareActivity in the React-Native source.

However that file has a lot of other boilerplate code mixed in, so I'm not sure which specific pieces are required for implementation.

The better alternative seems to be to have your MainActivity inherit from ReactActivity. It looks like you're inheriting from ExponentActivity. I'm not sure what that is, but if it's a custom Activity subclass that you have control over you should be able to have that inherit from ReactActivity.

I faced this issue while adding react native in existing Android application. Fixed this by implementing following methods in ReactActivity.java

@Override
public void requestPermissions(
        String[] permissions, int requestCode, PermissionListener listener) {
    mDelegate.requestPermissions(permissions, requestCode, listener);
}


protected @Nullable String getMainComponentName() {
        return null;
    }

@Override
public void onRequestPermissionsResult(
        int requestCode, String[] permissions, int[] grantResults) {
    mDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

import followings

import com.facebook.react.modules.core.PermissionAwareActivity;
import com.facebook.react.modules.core.PermissionListener;
import androidx.annotation.Nullable;

change from this

implements DefaultHardwareBackBtnHandler

to this

implements DefaultHardwareBackBtnHandler, PermissionAwareActivity

For more details see ReactActivity.java official repo

Related