expo: Tried to use permissions API but the host Activity doesn't implement PermissionAwareActivity in expo

I am trying to ask permission for write external storage but the app throws this error

Tried to use permissions API but the host Activity doesn't implement PermissionAwareActivity in expo

how to resolve it.

@Empact @abi @nikki93 @ccheever @brentvatne

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 11
  • Comments: 16 (2 by maintainers)

Commits related to this issue

Most upvoted comments

Hi there! here is my config

"dependencies": {
    "expo": "^32.0.0",
    "expokit": "32.0.6",
    "react": "16.5.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
    "react-native-fs": "^2.13.3"
  },

I have a detached application for using RNFS module so I tried to resolve PermissionAwareActivity error with https://github.com/wix/react-native-navigation/issues/3283

So my MainActivity.java file looks like this:

package host.exp.exponent;

import android.os.Bundle;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.annotation.NonNull;

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

import java.util.List;

import expo.core.interfaces.Package;
import host.exp.exponent.generated.DetachBuildConstants;
import host.exp.exponent.experience.DetachActivity;

import javax.annotation.Nullable;

public class MainActivity extends DetachActivity implements PermissionAwareActivity {
  @Nullable
  private PermissionListener permissionListener;

  @Override
  public String publishedUrl() {
    return "exp://exp.host/@ilya/walletcs-app";
  }

  @Override
  public String developmentUrl() {
    return DetachBuildConstants.DEVELOPMENT_URL;
  }

  @Override
  public List<ReactPackage> reactPackages() {
    return ((MainApplication) getApplication()).getPackages();
  }

  @Override
  public List<Package> expoPackages() {
    return ((MainApplication) getApplication()).getExpoPackages();
  }

  @Override
  public boolean isDebug() {
    return BuildConfig.DEBUG;
  }

  @Override
  public Bundle initialProps(Bundle expBundle) {
    // Add extra initialProps here
    return expBundle;
  }

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

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

I requested READ_EXTERNAL_STORAGE permission and it works

@vimalchandhru Try using expo-permissions instead of PermissionsAndroid from react-native:


import * as Permissions from 'expo-permissions';

const granted = await Permissions.askAsync(Permissions.WRITE_EXTERNAL_STORAGE);

Anyone who comes across this I had to change my MainActivity.java to

package host.exp.exponent;

import android.os.Bundle;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.annotation.NonNull;

import com.facebook.react.ReactPackage;
import com.facebook.react.modules.core.PermissionAwareActivity;
import com.facebook.react.modules.core.PermissionListener;
import com.facebook.react.bridge.Callback;

import org.unimodules.core.interfaces.Package;

import java.util.List;

import host.exp.exponent.experience.DetachActivity;
import host.exp.exponent.generated.DetachBuildConstants;

import javax.annotation.Nullable;

public class MainActivity extends DetachActivity implements PermissionAwareActivity {

  private @Nullable   Callback mPermissionsCallback;
  private @Nullable PermissionListener mPermissionListener;
  @Nullable
  private PermissionListener permissionListener;

  @Override
  public String publishedUrl() {
    return "exp://exp.host/@vincecoppola/mystery";
  }

  @Override
  public String developmentUrl() {
    return DetachBuildConstants.DEVELOPMENT_URL;
  }

  @Override
  public List<ReactPackage> reactPackages() {
    return ((MainApplication) getApplication()).getPackages();
  }

  @Override
  public List<Package> expoPackages() {
    return ((MainApplication) getApplication()).getExpoPackages();
  }

  @Override
  public boolean isDebug() {
    return BuildConfig.DEBUG;
  }

  @Override
  public Bundle initialProps(Bundle expBundle) {
    // Add extra initialProps here
    return expBundle;
  }

  @Override
  @TargetApi(Build.VERSION_CODES.M)
  public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) {
    mPermissionListener = listener;
    requestPermissions(permissions, requestCode);
  }
  @Override
  public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
    mPermissionsCallback = new Callback() {
      @Override
      public void invoke(Object... args) {
        if (mPermissionListener != null && mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
          mPermissionListener = null;
        }
      }
    };
  }
}

I’m closing this issue because it was solved.

To sum everything up, if you’re using PermissionAwareActivity, your activity should implement PermissionAwareActivity. However, we suggest using expo-permissions.

Hi there! here is my config

"dependencies": {
    "expo": "^32.0.0",
    "expokit": "32.0.6",
    "react": "16.5.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
    "react-native-fs": "^2.13.3"
  },

I have a detached application for using RNFS module so I tried to resolve PermissionAwareActivity error with wix/react-native-navigation#3283

So my MainActivity.java file looks like this:

package host.exp.exponent;

import android.os.Bundle;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.annotation.NonNull;

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

import java.util.List;

import expo.core.interfaces.Package;
import host.exp.exponent.generated.DetachBuildConstants;
import host.exp.exponent.experience.DetachActivity;

import javax.annotation.Nullable;

public class MainActivity extends DetachActivity implements PermissionAwareActivity {
  @Nullable
  private PermissionListener permissionListener;

  @Override
  public String publishedUrl() {
    return "exp://exp.host/@ilya/walletcs-app";
  }

  @Override
  public String developmentUrl() {
    return DetachBuildConstants.DEVELOPMENT_URL;
  }

  @Override
  public List<ReactPackage> reactPackages() {
    return ((MainApplication) getApplication()).getPackages();
  }

  @Override
  public List<Package> expoPackages() {
    return ((MainApplication) getApplication()).getExpoPackages();
  }

  @Override
  public boolean isDebug() {
    return BuildConfig.DEBUG;
  }

  @Override
  public Bundle initialProps(Bundle expBundle) {
    // Add extra initialProps here
    return expBundle;
  }

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

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

I requested READ_EXTERNAL_STORAGE permission and it works

I used your code but cant work properly, how do you run your code? Did you use expo start then expo android, or android studio for running your application?

same issue what the solution?

same issue

+1

Same Problem for me @vimalchandhru

cc: @ide @expbot