我正在尝试让我的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();
}
}
只要我接受许可请求,它就可以正常工作。 如果我拒绝两次,那么我的问题是我进入一个无限循环,显示最后一个消息框,该消息框说明现在应该在应用程序选项中手动授予权限。
答案 0 :(得分:0)
这可能是因为权限对话框消失后每次都会调用onResume
-这是标准的Android行为。将onResume
逻辑移至onStart
或onCreate
方法以避免循环。