【问题标题】:Why my android xamarin app close automatically when permission is denied?为什么我的 android xamarin 应用程序在权限被拒绝时会自动关闭?
【发布时间】:2020-03-26 22:30:28
【问题描述】:

我正在使用 Xamarin 开发移动应用程序。我想访问相机拍照,所以像往常一样 android 请求它的许可。当用户单击“允许”时,它可以正常工作,但是当用户单击拒绝时,应用程序会自动关闭。我试过调试,用户点击Deny时的错误是UnauthorizedAccessException。我知道所有权限处理都在 MainActivity 中,但我怎样才能避免这种情况发生呢?

【问题讨论】:

  • 您是否因为它可能无法正常工作而陷入困境?
  • 你必须捕获异常

标签: c# android xamarin mobile-application


【解决方案1】:

正如您所提到的,您需要在 OnRequestPermissionsResult 方法中处理一个 try/catch 块。

public class MainActivity : FormsAppCompatActivity
    {
        ...

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
        {
            try
            {
                base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
                ((PermissionsService)PermissionsService.Instance).OnRequestPermissionResult(requestCode, permissions, grantResults);
            }
            catch(UnauthorizedAccessException)
            {
                HandleExceptionAndContinue()
            }
        }
    }

【讨论】:

    【解决方案2】:

    在你去之前检查你的主要活动的权限。

    if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted)
    {
        // We have permission, go ahead and use the camera.
    }
    else
    {
        // We have not got permission, can't use camera
    }
    

    【讨论】:

    • 上面的代码应该在MainActivity.cs里面还是在普通file.cs里面?
    • 两者都可以工作,但一般在Main Activity中使用。
    【解决方案3】:

    我试过调试,用户点击Deny时的错误是UnauthorizedAccessException。我知道所有权限处理都在 MainActivity 中,但我怎样才能避免这种情况再发生?

    根据您的描述,我猜您的项目是Xamarin.Forms,并且您想访问相机,现在您不想在选择Deny for Camera时得到UnauthorizedAccessException?我说的对吗?

    如果是,我建议你可以先通过 Nuget 包安装使用 Plugin.Permissions

    然后在ContentPage中,可以使用下面的代码来请求摄像头权限。

    try
            {
                var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
                if (status != PermissionStatus.Granted)
                {
                    if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Camera))
                    {
                        await DisplayAlert("Need camera", "Gunna need that camera", "OK");
                    }
    
                    var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Camera);
                    status = results[Permission.Camera];
                }
    
                if (status == PermissionStatus.Granted)
                {
                     Console.WriteLine("camera access");
                }
                else if (status != PermissionStatus.Unknown)
                {
                    await DisplayAlert("camera Denied", "Can not continue, try again.", "OK");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex);
                LabelGeolocation.Text = "Error: " + ex;
            }
    

    然后在MainActivity.cs中添加一些代码

     public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    

    并在 Mainactivity.cs 的 OnCreate 方法中添加如下代码:

     Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
    

    关于其他权限的使用,可以看看:

    https://github.com/jamesmontemagno/PermissionsPlugin

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2018-01-09
      • 2017-09-06
      • 2015-11-08
      相关资源
      最近更新 更多