如何在启动画面上请求许可,如果被拒绝则退出?

时间:2019-05-29 07:30:45

标签: c# android xamarin.android

我正在尝试让我的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();
        }


    }

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

1 个答案:

答案 0 :(得分:0)

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