React Native - 启动应用程序后的权限对话框 - “远程”不起作用

Posted

技术标签:

【中文标题】React Native - 启动应用程序后的权限对话框 - “远程”不起作用【英文标题】:ReactNative - PermissionDialog after launching app - 'remove' won't work 【发布时间】:2020-03-06 19:46:27 【问题描述】:

在 ReactNative 应用中,我们使用存储权限来查看/保存图片。因此,我们在需要的地方获得了运行时许可。但奇怪的是,它是在启动画面本身中请求许可,而我们没有请求许可。然后我遇到了以下修复:

https://facebook.github.io/react-native/docs/removing-default-permissions

使用“删除”删除权限:

<uses-permission tools:node="remove" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但问题是,如果我这样做,我将无法在需要的地方获得这些权限。

理想情况下,我想删除 SplashScreen 中的权限对话框,只在需要的地方添加。请指教。

【问题讨论】:

【参考方案1】:

这个答案对你来说可能有点奇怪,但我遇到了同样的情况,我需要在我当前的应用程序中使用 zip 提取的存储权限。

我的管理方式如下:

    我在 Android 代码中使用 React Native Bridging 请求了权限 概念。 我添加了延迟以在下一个屏幕上显示权限对话框(即 启动画面后) 当用户授予我权限时,我开始提取并覆盖加载程序以全屏显示。 当用户拒绝存储权限时,我关闭了应用程序。

检查下面的代码

启动后的下一个屏幕

this.onZipExtracted = this.onZipExtracted.bind(this)

componentDidMount() 
    setTimeout(() => 
        Splash.hide()
    , Platform.OS == 'ios' ? 1000 : 500);

    if (Platform.OS === 'android') 
        AsyncStorage.getItem("Extraction",(error,result)=>
            if(result != 'done')
                this.setState(
                    animating:true
                )
                setTimeout(() => 
                    expandPath.callReactMethod(this.onZipExtracted, (error) => 
                        console.log("Activation Inside Callback"+JSON.stringify(error))
//Do your stuff 

                    )
                , 500)
            
        )
    


onZipExtracted(success)
    console.log("Activation Callback Extract Success -> "+JSON.stringify(success))
    this.setState(
        set loader flag
    )
    AsyncStorage.setItem("Extraction","done")
    Actions.replace('Screen to replace')

用于权限的 Java 代码

我使用了 Dexter Android 权限库

@ReactMethod
public void callReactMethod(Callback successCallback, Callback errorCallback)
    callUserPermission(getCurrentActivity(), successCallback,errorCallback);


private void callUserPermission(Activity currentActivity, Callback successCallback, Callback errorCallback) 
    Dexter.withActivity(getCurrentActivity())
            .withPermissions(
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() 
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) 
                    // check if all permissions are granted
                    if (report.areAllPermissionsGranted()) 
                        Log.i(TAG, "onPermissionsChecked: -> Granted");

                         // Do your stuff here
                        
                     else 
                        currentActivity.finishAffinity();
                        System.exit(0);
                    

                    // check for permanent denial of any permission
                    if (report.isAnyPermissionPermanentlyDenied()) 
                        // permission is denied permenantly, navigate user to app setting
                    
                


                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions,
                                                               PermissionToken token) 
                    token.continuePermissionRequest();
                
            )
            .onSameThread()
            .check();

【讨论】:

以上是关于React Native - 启动应用程序后的权限对话框 - “远程”不起作用的主要内容,如果未能解决你的问题,请参考以下文章

React Native 应用程序在首次启动时询问 iOS 位置权限,但 0 引用内部任何位置的地理/位置代码

如何请求后台位置权限,但在 iOS / React Native 中回退到何时使用权限?

在首先按下不允许后如何授予对 react-native-camera 的访问权限?

如何检查用户是不是已在 React Native Android 中授予相机权限?

从v1迁移到react-native-navigation v2后的不变违例

排毒测试时,React Native 在初始屏幕上超时完成