React Native - 无法使用 PermissionsAndroid 请求位置权限

React Native - can't request location permissions using PermissionsAndroid

我正在尝试请求运行时位置权限,但我的承诺一直抛出此异常:

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

我的代码如下所示:

  PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION)
  .then((preGranted) => {
    console.log('pre-granted', preGranted)
    if (!preGranted) {
      PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        { 'title': 'Enable location', 'message': 'Boss said so..' }
      )
      .then((granted) => {
        if (granted) {
          console.log('GRANTED AFTER ASKING:', granted)
          debugger
        }
      })
    }
  })

在我的清单中我有:

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

有人看到过这条消息吗?什么是 PermissionAwareActivity 我在网上找不到任何相关信息。

注意:此答案基于 Java 而不是 Reactive native。请参考 React native 特定解决方案的其他答案

What is PermissionAwareActivity

PermissionAwareActivity 是一个可以帮助您获取 运行 时间权限的接口。您必须在自己的 activity.

中实现这些方法
  public interface PermissionAwareActivity {

  int checkPermission(String permission, int pid, int uid);


  int checkSelfPermission(String permission);

  boolean shouldShowRequestPermissionRationale(String permission);

  void requestPermissions(String[] permissions, int requestCode, PermissionListener listener);
}

PermissionAwareActivity是第三方库中的接口。

https://github.com/wix/react-native-navigation

它不是标准 Android SDK 的一部分。

可以在文档中找到有关使用标准 SDK 请求运行时权限的说明。

https://developer.android.com/training/permissions/requesting.html

您应该在 activity 中实施 PermissionAwareActivity, 并定义回调 && PermissionListener .

public class ReactNativeIndexActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler,PermissionAwareActivity {
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;
    private @Nullable   Callback mPermissionsCallback;
    private @Nullable PermissionListener mPermissionListener;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ......
}

  @Override
    protected void onResume() {
        super.onResume();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
        if (mPermissionsCallback != null) {
            mPermissionsCallback.invoke();
            mPermissionsCallback = null;
        }
    }

 @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;
                }
            }
        };
    }