关于Xamarin相机的许可

时间:2017-12-11 08:21:30

标签: xamarin.android zxing

我正在使用Xamarin制作Android应用程序,这使用了zxing。

当用户点击按钮时,它显示QrScan页面和对话框,询问是否允许摄像机。

我希望每次点击按钮时都显示用户允许权限的对话框。

现在,如果用户单击拒绝,则在重新启动应用程序之前,不会显示权限对话框。

你有什么想法吗?

这是我的来源。

Android --- MainActivity.cs

 public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        global::Xamarin.Forms.Forms.Init(this, bundle);
        ZXing.Net.Mobile.Forms.Android.Platform.Init();
        LoadApplication(new App { OSVersion = "Android Version " + "2.0" });
    }

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
        // If this is not be, occur unexpected exception when user click deny
        if(grantResults[0] == Permission.Denied)
        {
            return;
        }
        global::ZXing.Net.Mobile.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

这是我在PCL项目中的执行QrScan方法,它调用了点击按钮。

    public async void ImgQrScan_Clicked(object sender, EventArgs e)
    {
        this.TappedEvent?.Invoke(sender, e);
        CustomScanViewMaker();
        await Navigation.PushModalAsync(oCustomQrScanPage);

        zxingPage.IsScanning = true;
        string sScanResult = "";
        zxingPage.OnScanResult += (result) =>
        {
            sScanResult = result.Text;
            zxingPage.IsScanning = false;
            Device.BeginInvokeOnMainThread(async () =>
            {
                this.OnClicked?.Invoke(sender, new QrScannerClickEventArgs(sScanResult));

                await Navigation.PopModalAsync();
            });
        };

        this.OnClicked?.Invoke(sender, new QrScannerClickEventArgs(sScanResult));
    }

谢谢。

1 个答案:

答案 0 :(得分:0)

  

我希望每次点击按钮时都显示用户允许权限的对话框。

您可以尝试使用shouldShowRequestPermissionRationale方法来实现此功能,因为document说:

  

为了帮助找到用户可能需要解释的情况,Android提供了一个实用方法,shouldShowRequestPermissionRationale()。 如果应用先前已请求此权限且用户拒绝了该请求,则此方法返回true。

对于它的用法,您可以参考C#中的官方文档Requesting Permissions at Run Time,它是这样的:

// Here, this is the current activity
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != Permission.Granted)
{
    // Should we show an explanation?
    if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.Camera))
    {
        // Provide an additional rationale to the user if the permission was not granted
        // and the user would benefit from additional context for the use of the permission.
        // For example if the user has previously denied the permission.

       // Show an explanation to the user *asynchronously* -- don't block
       // this thread waiting for the user's response! After the user
       // sees the explanation, try again to request the permission.

       Log.Info(TAG, "Displaying camera permission rationale to provide additional context.");
    }
    else
    {
        // No explanation needed, we can request the permission.
        ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.Camera }, REQUEST_CAMERA);

        // REQUEST_CAMERA is an app-defined int constant. The callback method gets the
        // result of the request.
    }
}
else
{
    System.Diagnostics.Debug.WriteLine("Permission Granted!!!");
}