在 Android 应用程序中,如何在不显示地址栏的情况下授予网络视图访问摄像头的权限
In Android App, how do I give a webview access to camera without address bar displayed
我正在尝试创建一个 Android 应用程序 (Xamarin),它是网站的包装器。该网站具有允许用户进行二维码扫描的功能。
我使用 WebChromeClient 让它工作。但是,它在顶部显示地址栏。
当我尝试添加 WebViewClient 时,地址栏消失了,但 QR 扫描(相机)不再有效。
在我的 MainActivity.cs:
WebView web_view;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main);
web_view = FindViewById<WebView>(Resource.Id.webview);
web_view.Settings.JavaScriptEnabled = true;
web_view.Settings.DomStorageEnabled = true;
web_view.Settings.AllowFileAccessFromFileURLs = true;
web_view.Settings.AllowUniversalAccessFromFileURLs = true;
web_view.Settings.SetPluginState(WebSettings.PluginState.On);
web_view.Settings.MediaPlaybackRequiresUserGesture = false;
web_view.SetWebViewClient(new WorkspaceDroidClient()); //With this line included, the QR scan no longer works
web_view.SetWebChromeClient(new CustomChromeClient());
web_view.LoadUrl("https://qrstuff.com/scan");
}
public class WorkspaceDroidClient : WebViewClient
{
// For API level 24 and later
public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
{
view.LoadUrl(request.Url.ToString());
return false;
}
}
public class CustomChromeClient : WebChromeClient
{
public override void OnPermissionRequest(PermissionRequest request)
{
request.Grant(request.GetResources());
}
}
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
return true;
}
public override bool OnOptionsItemSelected(IMenuItem item)
{
int id = item.ItemId;
if (id == Resource.Id.action_settings)
{
return true;
}
return base.OnOptionsItemSelected(item);
}
AndroidManifest.xml 具有以下内容:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
如有任何帮助,我们将不胜感激。
因为默认的 WebViewClient
不支持站点中的 QR 扫描功能。而且我认为除非调用 JS 代码,否则无法删除 URL 栏.这不是一个友好的解决方案。
如果只是在Android中实现二维码扫描,则不需要在WebView上加载第三方网站。您可以从 nuget 安装插件 ZXing.Net.Mobile 到您的项目。
用法
buttonScan.Click += (sender, e) => {
#if __ANDROID__
// Initialize the scanner first so it can track the current context
MobileBarcodeScanner.Initialize (Application);
#endif
var scanner = new ZXing.Mobile.MobileBarcodeScanner();
var result = await scanner.Scan();
if (result != null)
Console.WriteLine("Scanned Barcode: " + result.Text);
};
我正在尝试创建一个 Android 应用程序 (Xamarin),它是网站的包装器。该网站具有允许用户进行二维码扫描的功能。 我使用 WebChromeClient 让它工作。但是,它在顶部显示地址栏。 当我尝试添加 WebViewClient 时,地址栏消失了,但 QR 扫描(相机)不再有效。
在我的 MainActivity.cs:
WebView web_view;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main);
web_view = FindViewById<WebView>(Resource.Id.webview);
web_view.Settings.JavaScriptEnabled = true;
web_view.Settings.DomStorageEnabled = true;
web_view.Settings.AllowFileAccessFromFileURLs = true;
web_view.Settings.AllowUniversalAccessFromFileURLs = true;
web_view.Settings.SetPluginState(WebSettings.PluginState.On);
web_view.Settings.MediaPlaybackRequiresUserGesture = false;
web_view.SetWebViewClient(new WorkspaceDroidClient()); //With this line included, the QR scan no longer works
web_view.SetWebChromeClient(new CustomChromeClient());
web_view.LoadUrl("https://qrstuff.com/scan");
}
public class WorkspaceDroidClient : WebViewClient
{
// For API level 24 and later
public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
{
view.LoadUrl(request.Url.ToString());
return false;
}
}
public class CustomChromeClient : WebChromeClient
{
public override void OnPermissionRequest(PermissionRequest request)
{
request.Grant(request.GetResources());
}
}
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
return true;
}
public override bool OnOptionsItemSelected(IMenuItem item)
{
int id = item.ItemId;
if (id == Resource.Id.action_settings)
{
return true;
}
return base.OnOptionsItemSelected(item);
}
AndroidManifest.xml 具有以下内容:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
如有任何帮助,我们将不胜感激。
因为默认的 WebViewClient
不支持站点中的 QR 扫描功能。而且我认为除非调用 JS 代码,否则无法删除 URL 栏.这不是一个友好的解决方案。
如果只是在Android中实现二维码扫描,则不需要在WebView上加载第三方网站。您可以从 nuget 安装插件 ZXing.Net.Mobile 到您的项目。
用法
buttonScan.Click += (sender, e) => {
#if __ANDROID__
// Initialize the scanner first so it can track the current context
MobileBarcodeScanner.Initialize (Application);
#endif
var scanner = new ZXing.Mobile.MobileBarcodeScanner();
var result = await scanner.Scan();
if (result != null)
Console.WriteLine("Scanned Barcode: " + result.Text);
};