C# Xamarin-在WebView中请求相机权限
我想为我的web应用程序制作一个容器应用程序,我决定在Xamarin中这样做,因为项目的其余部分也是.NET 最初,我从Xamarin示例页面下载并设置项目: 我只是在WebPage.cs中更改了几个变量: 其次,我更新了App.cs以满足我的需要: 轰!我有一个应用程序 然后是真正的斗争。在web应用程序中,我可以–在浏览器中打开站点()时–单击一个按钮,从设备请求权限,然后在同一窗口中显示摄像头提要 在应用程序中执行相同操作时,不会发生任何事情 然后我开始在谷歌上搜索答案,但真的没有找到多少。我发现的答案似乎是Xamarin(?)的旧版本,因为我无法将答案中的文件和结构与Xamarin示例页面中的文件和结构进行比较。 我试着在这里实现Robbit的答案。经过长时间的努力,我成功地编译了它并将其安装到我的设备上,但它实际上并不要求权限 我不知所措,可能需要一些帮助/指导 我试着在这里实现Robbit的答案。经过长时间的努力,我成功地编译了它并将其安装到我的设备上,但它实际上并不要求权限 我从链接中尝试Robbit提供的代码。C# Xamarin-在WebView中请求相机权限,c#,xamarin,xamarin.forms,xamarin.android,C#,Xamarin,Xamarin.forms,Xamarin.android,我想为我的web应用程序制作一个容器应用程序,我决定在Xamarin中这样做,因为项目的其余部分也是.NET 最初,我从Xamarin示例页面下载并设置项目: 我只是在WebPage.cs中更改了几个变量: 其次,我更新了App.cs以满足我的需要: 轰!我有一个应用程序 然后是真正的斗争。在web应用程序中,我可以–在浏览器中打开站点()时–单击一个按钮,从设备请求权限,然后在同一窗口中显示摄像头提要 在应用程序中执行相同操作时,不会发生任何事情 然后我开始在谷歌上搜索答案,但真的没有找到多
实际上,它工作得很好。为了更好地理解,您可以使用下面的链接进行检查 如果我使用webview直接加载url,它将抛出如下错误 如果我使用Robbit中的自定义渲染器,它将请求MyWebViewRenderer中代码的权限
public override void OnPermissionRequest(PermissionRequest request)
{
mContext.RunOnUiThread(() =>
{
request.Grant(request.GetResources());
});
}
我也检查了你使用的链接,没有发生任何事情。该链接无法打开Android设备中的摄像头
使用Robbit的代码。
在项目中创建MyWebView
public class MyWebView : WebView
{
}
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace WebViewDemo.Droid
{
public class MyWebViewRenderer : WebViewRenderer
{
Activity mContext;
public MyWebViewRenderer(Context context) : base(context)
{
this.mContext = context as Activity;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
Control.Settings.JavaScriptEnabled = true;
Control.ClearCache(true);
Control.SetWebChromeClient(new MyWebClient(mContext));
}
public class MyWebClient : WebChromeClient
{
Activity mContext;
public MyWebClient(Activity context)
{
this.mContext = context;
}
[TargetApi(Value = 21)]
public override void OnPermissionRequest(PermissionRequest request)
{
mContext.RunOnUiThread(() =>
{
request.Grant(request.GetResources());
});
}
}
}
}
在项目的Android部分创建MyWebViewRenderer.cs
public class MyWebView : WebView
{
}
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace WebViewDemo.Droid
{
public class MyWebViewRenderer : WebViewRenderer
{
Activity mContext;
public MyWebViewRenderer(Context context) : base(context)
{
this.mContext = context as Activity;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
Control.Settings.JavaScriptEnabled = true;
Control.ClearCache(true);
Control.SetWebChromeClient(new MyWebClient(mContext));
}
public class MyWebClient : WebChromeClient
{
Activity mContext;
public MyWebClient(Activity context)
{
this.mContext = context;
}
[TargetApi(Value = 21)]
public override void OnPermissionRequest(PermissionRequest request)
{
mContext.RunOnUiThread(() =>
{
request.Grant(request.GetResources());
});
}
}
}
}
您可以从GitHub文件夹CameraRuntimePermission\u WebView
下载整个项目。页面1用于使用webview测试链接。主页用于使用自定义渲染器进行测试。
更新: 在我之前的回答中,它展示了如何在webview上添加摄像头权限 您提供的链接现在可以使用了。它似乎提供了一个相机预览功能。它需要检查API 23+上的权限 在Xamarin.Forms上,您可以使用权限插件 首先,在Android清单中添加摄像头权限。 您的项目。Android>属性>Android清单>所需权限>摄像头。之后,它将在AndroidManifest.xml中生成用户权限
<uses-permission android:name="android.permission.CAMERA" />
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, permissions, grantResults);
}
然后实施它
private async void _button_Clicked(object sender, EventArgs e)
{
webView.Source = "https://xamarin.swappsdev.net/";//"https://test.webrtc.org/";
var status = PermissionStatus.Unknown;
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Camera);
}
}
我已经上传到我的GitHub上了。检查文件夹。测试/相机运行权限\u网络视图/运行时权限
编辑:
如果不想在按钮单击事件中调用此按钮,可以在MainPage.xaml中删除该按钮
MainPage.xaml.cs
private void _button_Clicked(object sender, EventArgs e)
{
webView.Source = "https://test.webrtc.org/";//"https://xamarin.swappsdev.net/";
}
public MainPage()
{
InitializeComponent();
webView.Source = "https://xamarin.swappsdev.net/";
}
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);
}
}
在遵循了几条启用WebView摄像头的指南之后,我终于成功了 我遵循了上面的所有步骤,尽管收到了允许使用相机的提示,但我始终无法摆脱权限错误(即使调试显示已授予权限)。然后,我将MyWebViewRenderer代码(如上Wendy所示)替换为以下代码(如上所示):
现在摄像机终于开始工作了:-)我不太确定之前代码中的罪犯是什么。非常感谢Wendy、Yelinzh和所有人的全面回复。希望这能有所帮助,嗨Wendy,非常感谢您非常详细的回复。但是,我仍然遇到同样的旧权限问题。我加载了你的“CameraRuntimePermission\u WebView”项目,并尝试在没有任何修改的情况下运行它。它编译好,并显示您在GIF中显示的空白按钮,但它也告诉我它不能访问WebRTC测试中所需的硬件。之后,我尝试使用我自己的链接:这是我在自己的链接上运行它时的日志。这就是我通常脸朝前撞墙的地方。它从不要求权限。我已经修复了错误,我需要一些时间来编辑我的回复。请稍等片刻。谢谢您宝贵的时间来写这个答案。真的很感激!!正如预期的那样……温迪,这太棒了!非常感谢你。最后一件事,按钮点击是必要的,还是启动应用程序时可能触发权限请求,或者使用某种初始屏幕?不,您可以不使用按钮加载,但在加载页面后需要请求运行时权限。我在编辑中提供了代码。我不愿意承认这一点,但我错过了您移动的部分
webView.Source=”https://xamarin.swappsdev.net/";将>编码到构造函数中。我花了一段时间才弄明白为什么我只是在看一个白色的屏幕,但除此之外,它还能工作。非常感谢你的帮助和时间!!谢谢你的意见!你永远不知道这些信息何时变得相关,所以我感谢你花时间来整理这个答案。它如预期的那样工作。谢谢你花宝贵的时间写下这个答案。您能告诉我ios是否需要任何类似的程序吗?@Thameem-为回复太晚表示歉意-不幸的是,我还没有对ios进行测试-只有Android。希望你是对的…@Daniëlhofman谢谢你的回复!!
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 void _button_Clicked(object sender, EventArgs e)
{
webView.Source = "https://xamarin.swappsdev.net/";//"https://test.webrtc.org/";
var status = PermissionStatus.Unknown;
status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
if (status != PermissionStatus.Granted)
{
status = await Utils.CheckPermissions(Permission.Camera);
}
}
public MainPage()
{
InitializeComponent();
webView.Source = "https://xamarin.swappsdev.net/";
}
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);
}
}
[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace App19F_8.Droid
{
public class CustomWebViewRenderer : WebViewRenderer
{
public CustomWebViewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
Control.SetWebChromeClient(new MyWebChromeClient(MainActivity.Instance));
Control.Settings.JavaScriptEnabled = true;
}
}
}
public class MyWebChromeClient : WebChromeClient
{
Activity mActivity = null;
public MyWebChromeClient(Activity activity)
{
mActivity = activity;
}
public override void OnPermissionRequest(PermissionRequest request)
{
mActivity.RunOnUiThread(() => {
request.Grant(request.GetResources());
});
}
}
}
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static MainActivity Instance { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
...
base.OnCreate(savedInstanceState);
Instance = this;
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
}