如何在 React Native android 中打开应用程序设置页面?

How to open app settings page in react native android?

最后,react native bridge 是唯一的 way.But 是否有任何 npm 包已经为任何人成功运行?

您可以使用链接库打开您的应用程序设置。

import {Linking} from 'react-native';

Linking.openSettings();

官方文档:https://reactnative.dev/docs/linking#opensettings

您可以使用 @react-native-community/react-native-permissions 库。

这里是官方文档:https://github.com/react-native-community/react-native-permissions#opensettings

示例:

import { openSettings } from 'react-native-permissions';
openSettings();
import React, { useCallback } from "react";
import { Button, Linking, StyleSheet, View } from "react-native";

const OpenSettingsButton = ({ children }) => {
  const handlePress = useCallback(async () => {
    // Open the custom settings if the app has one
    await Linking.openSettings();
  }, []);

  return <Button title={children} onPress={handlePress} />;
};

const App = () => {
  return (
    <View style={styles.container}>
      <OpenSettingsButton>Open Settings</OpenSettingsButton>
    </View>
  );
};

const styles = StyleSheet.create({
  container: { flex: 1, justifyContent: "center", alignItems: "center" },
});

这是 android 和 iOS 的完整答案。

没有世博会:

import DeviceInfo from 'react-native-device-info';
import IntentLauncher, { IntentConstant } from 'react-native-intent-launcher'
const pkg = DeviceInfo.getBundleId();
const openAppSettings = () => {
  if (Platform.OS === 'ios') {
    Linking.openURL('app-settings:')
  } else {
    IntentLauncher.startActivity({
      action: 'android.settings.APPLICATION_DETAILS_SETTINGS',
      data: 'package:' + pkg
    })
  }
}

世博会:

import Constants from 'expo-constants'
import * as IntentLauncher from 'expo-intent-launcher'
const pkg = Constants.manifest.releaseChannel
? Constants.manifest.android.package 
: 'host.exp.exponent'
const openAppSettings = () => {
  if (Platform.OS === 'ios') {
    Linking.openURL('app-settings:')
  } else {
    IntentLauncher.startActivityAsync(
      IntentLauncher.ACTION_APPLICATION_DETAILS_SETTINGS,
      { data: 'package:' + pkg },
    )
  }
}

结合现有的答案:这对我来说适用于 iOS 和 Android(没有 expo)

import { Linking, Platform } from 'react-native';


const handleOpenSettings = () => {
    if (Platform.OS === 'ios') {
      Linking.openURL('app-settings:');
    } else {
      Linking.openSettings();
    }
};

// add a button that calls handleOpenSetttings()

import { Linking, Platform } from 'react-native';

const openSettingsAlert = () =>
        Alert.alert('Please provide the require permission from settings', '', [
          {
            text: 'Cancel',
            onPress: () => console.log('Cancel Pressed'),
            style: 'cancel',
          },
          { text: 'Go To Settings', onPress: () => openSettings() },
        ]);





const openSettings = () => {
    if (Platform.OS === 'ios') {
      Linking.openURL('app-settings:');
    } else {
      Linking.openSettings();
    }
  };




let isStoragePermitted = await requestExternalWritePermission();
        if (isStoragePermitted === true) {
          
        }else{
          console.log('permission not granted');
          openSettingsAlert();
        }







const requestExternalWritePermission = async () => {
    if (Platform.OS === 'android') {
      try {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
        );
        // If WRITE_EXTERNAL_STORAGE Permission is granted
        return granted === PermissionsAndroid.RESULTS.GRANTED;
      } catch (err) {
        console.warn(err);
        alert('Storage Access permission error:', err);
      }
      return false;
    }
  };