Android:WebView中的网络摄像头错误(摄像头权限不起作用)

Pratik Butani

我创建了WebView活动并加载https://web.doar.zone/coronavirus

该URL需要“相机”权限,而我已在Android中获得了“运行时权限”。

这是MainActivity.java的完整代码

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    Context context;

    ActivityMainBinding binding;

    private String url = "https://web.doar.zone/coronavirus";

    @Override
    protected void onResume() {
        super.onResume();
        checkCameraPermission();
    }

    private void checkCameraPermission() {
        int writeExternalStorage = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        if (writeExternalStorage != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1001);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1001) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //Do your stuff
                openWebView();
            } else {
                checkCameraPermission();
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        context = getApplicationContext();

        openWebView();
    }

    @SuppressLint("SetJavaScriptEnabled")
    void openWebView() {

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        final NetworkInfo networkInfo;
        if (connectivityManager != null) {
            networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
                binding.internetTextView.setVisibility(View.INVISIBLE);
                binding.webView.setVisibility(View.VISIBLE);
                //binding.webView.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.3");
                binding.webView.getSettings().setJavaScriptEnabled(true);
                binding.webView.getSettings().setUseWideViewPort(true);
                binding.webView.getSettings().setDomStorageEnabled(true);
                binding.webView.setInitialScale(1);
                binding.webView.setWebChromeClient(new MyWebChromeClient());
                binding.webView.setWebViewClient(new WebViewClient() {

                    @Override
                    public boolean shouldOverrideUrlLoading(WebView webview, String url) {
                        Uri uri = Uri.parse(url);
                        if (uri.getScheme().contains("whatsapp") || uri.getScheme().contains("tel")) {
                            try {
                                Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                                if (intent.resolveActivity(getPackageManager()) != null)
                                    startActivity(intent);
                                return true;
                            } catch (URISyntaxException use) {
                                Log.e("TAG", use.getMessage());
                            }
                        } else {
                            webview.loadUrl(url);
                        }

                        return true;
                    }

                    @Override
                    public void onPageFinished(WebView view, String url) {
                        super.onPageFinished(view, url);
                    }
                });
                binding.webView.loadUrl(url);
            } else {

                binding.internetTextView.setVisibility(View.VISIBLE);
                binding.buttonTryAgain.setVisibility(View.VISIBLE);
                binding.webView.setVisibility(View.INVISIBLE);

                Toast.makeText(context, "Connect to Internet and Refresh Again", Toast.LENGTH_LONG).show();
            }
        } else {
            binding.internetTextView.setVisibility(View.VISIBLE);
            binding.buttonTryAgain.setVisibility(View.VISIBLE);
            binding.webView.setVisibility(View.INVISIBLE);

            Toast.makeText(context, "Connect to Internet and Refresh Again", Toast.LENGTH_LONG).show();
        }
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (binding.webView.canGoBack()) {
                    binding.webView.goBack();
                } else {
                    finish();
                }
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }

    class MyWebChromeClient extends WebChromeClient {

        MyWebChromeClient() {
            // TODO Auto-generated constructor stub
            binding.pb.setProgress(0);
        }

        @Override
        public void onPermissionRequest(final PermissionRequest request) {
            super.onPermissionRequest(request);
            //request.grant(request.getResources());
        }

        public void onProgressChanged(WebView view, int progress) {
            if (progress < 100  /* && pBar.getVisibility() == View.VISIBLE*/) {
                binding.pb.setVisibility(View.VISIBLE);
            }
            binding.pb.setProgress(progress);
            if (progress == 100) {
                binding.pb.setVisibility(View.GONE);
            }
        }
    }
}

现在,当我对此行发表评论时,出现如下错误:

request.grant(request.getResources());

在此处输入图片说明

如果我取消注释此行,那么我将得到:

 java.lang.IllegalStateException: Either grant() or deny() has been already called.
    at org.chromium.android_webview.permission.AwPermissionRequest.c(PG:3)
    at org.chromium.android_webview.permission.AwPermissionRequest.b(PG:1)
    at Cn.grant(PG:8)
    at com.example.webviewapp.MainActivity$MyWebChromeClient.onPermissionRequest(MainActivity.java:164)
    at org.chromium.android_webview.AwContents.onPermissionRequest(PG:8)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:326)
    at android.os.Looper.loop(Looper.java:181)
    at android.app.ActivityThread.main(ActivityThread.java:7078)
2020-04-29 11:52:21.813 4943-4943/com.example.webviewapp W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)

有帮助吗?

Ankit makwana

您已经处理了android os的运行时相机权限。我们还需要RESOURCE_VIDEO_CAPTURE在webview内授予相机权限()。

首先调用以下方法打开相机而无需用户手势:

binding.webView.getSettings().setMediaPlaybackRequiresUserGesture(false);

这样的调用request.grant(request.getResources())方法将授予所有请求的权限。为避免这种情况,您只应授予所需的权限,即RESOURCE_VIDEO_CAPTURE

@Override
public void onPermissionRequest(final PermissionRequest request) {
    final String[] requestedResources = request.getResources();
    for (String r : requestedResources) {
        if (r.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) {
            request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
            break;
        }
    }
}

在您的代码中,这行引起了问题:super.onPermissionRequest(request);此超级方法调用拒绝该权限。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从网址/网络摄像头保存图像

来自分类Dev

网络摄像头和手机中的摄像头方向

来自分类Dev

摄像头无法在WebView中打开

来自分类Dev

后台OpenCV中的Android摄像头

来自分类Dev

我正在尝试使用简单的网络摄像头捕获上传,上传不起作用吗?

来自分类Dev

Chrome中的网络摄像头js错误:无法访问网络摄像头

来自分类Dev

简单的RTMP网络摄像头脚本?

来自分类Dev

HTML <video>网络摄像头访问在Chrome或Safari中不起作用

来自分类Dev

Sarxos API网络摄像头问题

来自分类Dev

如何更改摄像头访问权限?

来自分类Dev

网络摄像头录像机

来自分类Dev

网络摄像头的MJPEG流不起作用

来自分类Dev

网络摄像头问题

来自分类Dev

集成网络摄像头在所有Ubuntu 14.04 x64上均不起作用

来自分类Dev

网络摄像头和手机中的摄像头方向

来自分类Dev

网络摄像头getUserMedia API-AngularJS错误?

来自分类Dev

摄像头的Phonegap权限

来自分类Dev

在Firefox中禁用网络摄像头

来自分类Dev

禁用网络摄像头

来自分类Dev

配置网络摄像头

来自分类Dev

内置网络摄像头不起作用

来自分类Dev

Android6摄像头权限

来自分类Dev

网络摄像头在浏览器中不起作用

来自分类Dev

重复的网络摄像头

来自分类Dev

Citrix Workspace 应用程序 2009 网络摄像头和麦克风在 Ubuntu 20.04 上不起作用

来自分类Dev

罗技网络摄像头麦克风/组合不起作用,只有网络摄像头没有麦克风

来自分类Dev

网络摄像头闪烁

来自分类Dev

c# -DirectShow 中的网络摄像头模拟器/虚拟摄像头

来自分类Dev

ReactJS - 来自网络摄像头的视频流不起作用