当我在 Android 中请求位置权限时使用 React Native,权限对话框永远不会弹出并自动授予权限

问题描述

我正在为我的 Android React Native 应用程序请求位置许可。我正在使用 npm 包:react-native-permissions。我创建了一个自定义挂钩来执行此操作。

我的 iOS 实现完美无缺。在 Android 上尝试类似方法时,询问用户位置权限的对话框永远不会弹出。在我对权限的初始检查时,我的应用程序报告权限已被授予!!但是如何?

我将其包含在我的 AndroidManifest.xml 中: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

这是我请求许可的钩子:

export default (setPermissionsGranted = () => {},setPermissionError = () => {}) => {
   const appState = useRef(AppState.currentState)
   const [shouldCheckPermission,setShoudCheckPermission] = useState(false)

   useEffect(() => {
      let isMounted = true

      const handleAppState = (nextAppState) => {
         if (appState.current.match(/inactive|background/) && nextAppState === 'active') {
            // the app has come into the foreground. Change a boolean state variable to trigger
            // handlePermission() again.
            if (isMounted) setShoudCheckPermission(!shouldCheckPermission)
         }
         appState.current = nextAppState
      }

      const handlePermissionStatus = (result) => {
         const status = {
            unavailable: () => {},denied: async () => {
               const res = await request(PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION)
               if (isMounted) {
                  if (res === RESULTS.GRANTED) {
                     setPermissionsGranted(true)
                  } else {
                     setPermissionsGranted(false)
                  }
               }
            },limited: () => {
               // todo find out what limited entails
               if (isMounted) setPermissionsGranted(true)
            },granted: async () => {
               if (isMounted) setPermissionsGranted(true)
            },blocked: () => {
               if (isMounted) setPermissionsGranted(false)
            },}
         return status[result]
      }

      AppState.addEventListener('change',handleAppState)

      const handlePermission = async () => {
         console.log('permissions code is run')
         try {
            const res = await check(PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION)
            console.log('res',res)
            handlePermissionStatus(res)()
         } catch (err) {
            throw err
         }
      }

      handlePermission().catch((e) => {
         if (isMounted) setPermissionError(e.message)
      })

      return () => {
         AppState.removeEventListener('change',handleAppState)
         isMounted = false
      }
   },[shouldCheckPermission])
}

有没有解释为什么用户从来没有被询问过并且权限是自动授予的?

一个特殊之处,我已经注释掉了所有在 Android 上请求位置权限的代码,重新启动了 Metro 服务器,卸载了应用程序,然后重新安装了它。 request-permissions 标记仍在 AndroidManifest.xml 中。显然这就是我需要做的所有事情,现在权限是自动授予的!

我的理解是,这是一个危险的权限,不应自动授予,但 Android 将其视为安全权限。 ??‍♂️

提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...