问题描述
我在 [1] 上托管了这个简单的 AR 应用程序:https://github.com/haybee1001/MyARExperiencee6tby 当我在手机浏览器上打开链接时,它会调用/请求相机许可并打开相机(完美运行)。
但是,我决定将此链接包含在 Xamarin WebView 中。但是,它抱怨许可。我已经在网上尝试了一些解决方案,但仍有库存。
请问我如何在 WebView 上获得/调用相机权限?有人可以通过我的应用链接向我展示一个可行的解决方案。
解决方法
在 Xamarin Forms 中进入 web 视图页面时,您可以在运行时请求 Camera
权限。
MainPage.xaml.cs
public MainPage()
{
InitializeComponent();
webView.Source = "your webview";
}
protected override void OnAppearing()
{
base.OnAppearing();
RunTimePermission();
}
public async void RunTimePermission()
{
var status = PermissionStatus.Unknown;
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Camera);
}
}
此处使用 Permissions Plugin 请求许可。
Utils.cs 代码如下:
public static class Utils
{
public static async Task<PermissionStatus> CheckPermissions(Permission permission)
{
var permissionStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
bool request = false;
if (permissionStatus == PermissionStatus.Denied)
{
if (Device.RuntimePlatform == Device.Android)
{
var title = $"{permission} Permission";
var question = $"To use this plugin the {permission} permission is required. Please go into Settings and turn on {permission} for the app.";
var positive = "Settings";
var negative = "Maybe Later";
var task = Application.Current?.MainPage?.DisplayAlert(title,question,positive,negative);
if (task == null)
return permissionStatus;
var result = await task;
if (result)
{
CrossPermissions.Current.OpenAppSettings();
}
return permissionStatus;
}
request = true;
}
if (request || permissionStatus != PermissionStatus.Granted)
{
var newStatus = await CrossPermissions.Current.RequestPermissionsAsync(permission);
if (!newStatus.ContainsKey(permission))
{
return permissionStatus;
}
permissionStatus = newStatus[permission];
if (newStatus[permission] != PermissionStatus.Granted)
{
permissionStatus = newStatus[permission];
var title = $"{permission} Permission";
var question = $"To use the plugin the {permission} permission is required.";
var positive = "Settings";
var negative = "Maybe Later";
var task = Application.Current?.MainPage?.DisplayAlert(title,negative);
if (task == null)
return permissionStatus;
var result = await task;
if (result)
{
CrossPermissions.Current.OpenAppSettings();
}
return permissionStatus;
}
}
return permissionStatus;
}
}
在 MainActivity.cs 中,在 OnCreate
方法中添加代码。
Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this,savedInstanceState);
MainActivity.cs 中需要 OnRequestPermissionsResult
方法。
public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode,permissions,grantResults);
base.OnRequestPermissionsResult(requestCode,grantResults);
}
不要忘记在AndroidManifest.xml中添加用户权限。
<uses-permission android:name="android.permission.CAMERA" />