c# - CheckPermissionsAsync 在 Android 上总是返回 Denied
问题描述
我正在使用权限插件在 Android 上请求良好的位置权限;但是,每次我调用 CheckPermissionsAsync 时,都会收到拒绝响应。这是我正在使用的代码:
protected override async void OnStart()
{
PermissionStatus status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.LocationWhenInUse);
if (status == PermissionStatus.Unknown)
{
var result = await CrossPermissions.Current.RequestPermissionsAsync(Permission.LocationWhenInUse);
}
}
这是在模拟器上运行的,据我所知,我还没有设法执行RequestPermissionsAsync
调用。
这是预期的行为吗?如果是这样,我如何区分拒绝(尚未询问)和拒绝(询问并拒绝)?
编辑:
在进一步调查中,无论哪种方式,呼叫RequestPermissionsAsync
似乎都没有任何区别。我的印象是它会转到原生平台并显示“我们需要权限..”对话框。再看一下这个插件的样本,答案似乎就是只显示设置并让用户分配他们感觉的任何东西;感觉很像我在这里错过了难题的关键部分。
编辑:
我在这里创建了该问题的基本副本(显然我已经删除了 Google Maps 键)。
编辑:
按照@FreakyAli 的建议,我最终得到了一个看起来像这样(或多或少)的主要活动:
if (ActivityCompat.ShouldShowRequestPermissionRationale(this,
Manifest.Permission.AccessFineLocation))
{
}
else
{
ActivityCompat.RequestPermissions(this,
new String[] { Manifest.Permission.AccessFineLocation },
PERMISSIONS_REQUEST_LOCATION);
}
这行得通,但感觉就像我在复制插件的功能。
解决方案
请确保您在 Activity OnCreate 方法中添加了以下代码:
Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
向清单文件添加位置权限。
2.查看权限状态,请求权限。
private async void Btn1_Click(object sender, System.EventArgs e)
{
var status = PermissionStatus.Unknown;
try
{
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
if (status != PermissionStatus.Granted)
{
if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
{
Console.WriteLine("Need location", "Gunna need that location", "OK");
}
var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);
status = results[Permission.Location];
}
if (status == PermissionStatus.Granted)
{
//do something about location.
}
else if (status != PermissionStatus.Unknown)
{
Console.WriteLine("Location Denied", "Can not continue, try again.", "OK");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
覆盖 OnRequestPermissionsResult 方法。
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
4.在您的活动的 OnCreate 方法中设置以下内容。
Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
推荐阅读
- oracle - 查询 user_tables 结果为空
- python - AttributeError: 'dict_values' 对象没有属性 'extend' - repo 同步
- excel - Excel转置和连接函数
- git - 如何在新 Visual Studio 2019 的新 git 体验界面中添加要提交的工作项
- image-processing - 太阳能光伏阴影分析的国家开放激光雷达数据如何实现自动屋顶3d建模?
- c# - 使用 MaterialDesignInXamlToolKit 输入法输入框无法正确定位到 TextBox 的边缘
- excel - 我找不到数据透视表的数据源
- r - R函数转换为宽格式
- c - 为什么我没有得到随机数?
- java - 如何在 url 中使用 API 密钥?请帮忙,看起来很简单,但我完全卡住了