c# - 如何在启动画面上请求许可并在被拒绝时退出?

标签 c# android xamarin.android

我正在尝试让我的 Xamarin.Android 应用程序在启动画面上请求许可,这是第一个启动的 Activity 。

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

这里是启动画面 Activity 的权限相关代码:

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/

相关文章:

c# - 如何使用MVVM/ICommand模式在WPF中正确实现BackgroundWorker

c# - 首先查找一组元素或默认哪个总和最接近给定值,然后删除表单列表

c# - 无法使用 EF 5 和 VS 2015 从数据库更新模型

android - 我应该将用户好友列表存储在设备还是服务器上?

android - 将可绘制对象转换为字符串以传递给另一个 Activity

android - 获取图片目录路径

c# - 验证后删除小数 @ WPF 文本框

android - sqlite.SQLiteException : no such column: data1 (Sqlite code 1): 异常

c# - 是否可以使用 C# 在 Mono for Android 中使用异步套接字?

android - 如何使用 MonoDroid 打开网站?