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;
}
}
};
}
我正在尝试请求运行时位置权限,但我的承诺一直抛出此异常:
"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;
}
}
};
}