我正在尝试让我的Xamarin.Android应用在启动屏幕上寻求许可,这是要启动的第一个活动。

我正在使用permission plugin for Xamarin
我也在使用async modal dialog implementation

这是初始屏幕活动的与权限相关的代码:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

private async Task<bool> RequestPermissionsAndTellIfWeShouldContinueAsync()
{
    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
    if (status != PermissionStatus.Granted)
    {
        if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Storage))
        {
            await Utilities.MessageBox.Show(this, Resources.GetString(Resource.String.explain_external_storage_permission_title), Resources.GetString(Resource.String.explain_external_storage_permission_text), true);
        }
        var newStatus = await CrossPermissions.Current.RequestPermissionsAsync(new Permission[] { Permission.Storage });

        var result = newStatus.Values.ElementAt(0);
        if (result == PermissionStatus.Granted)
        {
            return true;
        }
        if (result == PermissionStatus.Denied)
        {
            await Utilities.MessageBox.Show(this, Resources.GetString(Resource.String.cant_continue_without_permission_title), Resources.GetString(Resource.String.cant_continue_without_permission_text), true);
            return false;
        }

        return false;
    }
    else
        return true;
}


}

接下来是试图在OnResume回调上寻求许可的代码

    protected override async void OnResume()
    {
        base.OnResume();

        bool shallWeContinue = await RequestPermissionsAndTellIfWeShouldContinueAsync();

        if ( shallWeContinue)
        {
          // Start Main activity

        }
        else
        {
            // End current activity and go back to android launcher
            Finish();
        }


    }


只要我接受许可请求,它就可以正常工作。
如果我两次拒绝,那么我的问题是我进入一个无限循环,显示最后一个消息框,该消息框说明现在应在应用程序选项中手动授予权限。

最佳答案

这可能是因为权限对话框消失后每次都会调用onResume-这是标准的Android行为。将onResume逻辑移到onStartonCreate方法以避免循环。

关于c# - 如何在初始屏幕上请求许可,如果被拒绝则退出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56355232/

10-16 10:05