C# 如何在启动屏幕上请求权限并在被拒绝时退出?
我正试图让我的Xamarin.Android应用程序在启动屏幕上请求许可,这是第一个要启动的活动 我在用电话。 我也在用一个 以下是启动屏幕活动的权限相关代码:C# 如何在启动屏幕上请求权限并在被拒绝时退出?,c#,android,xamarin.android,C#,Android,Xamarin.android,我正试图让我的Xamarin.Android应用程序在启动屏幕上请求许可,这是第一个要启动的活动 我在用电话。 我也在用一个 以下是启动屏幕活动的权限相关代码: public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { PermissionsImp
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
,这是安卓的标准行为。将onResume
逻辑移动到onStart
或onCreate
方法以避免循环。将逻辑移动到onCreate解决了问题。太谢谢你了,我都快发疯了。
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();
}
}