【问题标题】:Xamarin Android Webview: getUserMedia fails to open cameraXamarin Android Webview:getUserMedia 无法打开相机
【发布时间】:2021-02-02 00:04:58
【问题描述】:

我正在尝试打开相机并允许用户从 Xamarin.Android 的 web 视图中捕获图像帧。

我已将 webview 指向此 URL,其中包含一些示例:https://googlechrome.github.io/samples/image-capture/index.html。在设备的 Chrome 浏览器中打开 URL 时,这些示例运行良好,但在应用程序的 web 视图中打开时失败。这是我的 WebChromeClient 实现:

internal class ChromeWebviewClient : WebChromeClient
{
    public override void OnPermissionRequest(PermissionRequest request)
    {
            request.Grant(request.GetResources());
    }
}

我已在清单中声明了相机权限:

<uses-permission android:name="android.permission.CAMERA" />

导航到示例页面并点击“获取用户媒体”似乎没有任何作用,我在应用程序日志中看到以下似乎相关但对我没有意义的内容:

[CameraManagerGlobal] Connecting to camera service
[VendorTagDescriptor] addVendorDescriptor: vendor tag id 3854507339 added
[CameraManagerGlobal] Camera 0 facing CAMERA_FACING_BACK state now CAMERA_STATE_CLOSED for client com.masterappstudio.qrcodereader API Level 1
[CameraManagerGlobal] Camera 1 facing CAMERA_FACING_FRONT state now CAMERA_STATE_CLOSED for client com.sec.android.app.sbrowser API Level 2
[CameraManagerGlobal] Camera 2 facing CAMERA_FACING_FRONT state now CAMERA_STATE_CLOSED for client android.system API Level 2
[CameraManagerGlobal] Camera 90 facing CAMERA_FACING_FRONT state now CAMERA_STATE_CLOSED for client com.samsung.android.server.iris API Level 2

我还在 OnPermissionRequest 处放置了一个断点,但它似乎没有触发。

我怀疑这与 Android 6+ 中引入的运行时相机权限有关(我运行的是 Android 9)。我已经在手机设置中将相机权限设置为允许,但似乎也没有做任何事情。

我已经在这个主题上用尽了谷歌搜索(大部分点击都围绕着标志性和 phonegap 框架),并注意到这里有一些针对原生 Android 的问题以 0 个答案回应了这个问题。

【问题讨论】:

    标签: android xamarin.android camera android-webview google-chrome-webview


    【解决方案1】:

    首先,在 AndroidManifeast.xml 中添加这些权限

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    

    如果在Android 6.0或以上版本上部署应用,需要在运行时请求权限。

     private void checkpermission()
        {
            if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted)
            {
                // We have permission, go ahead and use the camera.              
            }
            else
            {
                // Camera permission is not granted. If necessary display rationale & request.
                ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera }, 1);               
            }
        }
    

    要加载一个 URL,子类 Android.Webkit.WebViewClient 并覆盖 ShouldOverriderUrlLoading 方法。

     public class HelloWebViewClient : WebViewClient
    {
        // For API level 24 and later
        public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
        {
            view.LoadUrl(request.Url.ToString());
            return false;
        }
    }
    

    然后创建自定义 WebChromeClient 以覆盖 OnPermissionRequest 方法以授予请求。

     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 : AppCompatActivity
    {
        private WebView webview1;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
            webview1 = FindViewById<WebView>(Resource.Id.webView1);
            webview1.Settings.JavaScriptEnabled = true;
            webview1.Settings.AllowFileAccessFromFileURLs = true;
            webview1.Settings.AllowUniversalAccessFromFileURLs = true;
            webview1.SetWebViewClient(new HelloWebViewClient());
            webview1.SetWebChromeClient(new MyWebChromeClient(this));
            checkpermission();
        }
    
        private void checkpermission()
        {
            if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted)
            {
                // We have permission, go ahead and use the camera.
                webview1.LoadUrl("https://googlechrome.github.io/samples/image-capture/index.html");
            }
            else
            {
                // Camera permission is not granted. If necessary display rationale & request.
                ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera }, 1);
                webview1.LoadUrl("https://googlechrome.github.io/samples/image-capture/index.html");
            }
        }
        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);
        }
    }
    

    【讨论】:

    • 感谢您的意见,樱桃。我创建了一个全新的项目并粘贴了您的代码。我收到了按预期输入权限的提示并允许它,但导航到示例中的第一个链接(抓取框架 - 拍照)并按“获取用户媒体”没有打开照相机。我检查了应用程序日志并粘贴了我在这里找到的内容:pastebin.com/HRgJ5Zky。我在运行 Android 9 的三星 S9 上。上面的代码对你有用吗?
    • @JaySidri 我在 Google Pixel(Android 8.1) 测试,按“获取用户媒体”时可以打开相机,效果很好。
    • 不幸的是,上面的确切代码不适用于运行 Android 10 的 Pixel 2(Android 系统 WebView 实现 87.0.4280.101):/ 还检查了运行 Android 8.0 的三星 S8(Chrome Webview 实现 87.0.4280.66 ) 结果相同
    • @JaySidri 请尝试在 Android 10 上添加 webview1.Settings.MediaPlaybackRequiresUserGesture = false;,然后重试。
    • @JaySidri 你试试?有什么更新吗?我在华为 android 10 上测试,效果很好。
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多