2016-11-17 175 views
1

在我的android应用程序中,我试图在WebView上加载一个网页(必须访问摄像头)。在我的笔记本电脑上,当我加载网页时,我可以访问相机。如何从Webview中访问摄像头?

显示html页面上的其他内容。

下面是我在Manifest.xml

<uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.webkit.PermissionRequest" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 

我设置的SDK如下把权限:

<uses-sdk 
     android:minSdkVersion="18" 
     android:targetSdkVersion="21" /> 

这里是我的WebView设置:

private void setMyWebviewSettings(WebSettings MyWebviewSettings){ 
     MyWebviewSettings.setAllowFileAccessFromFileURLs(true); 
     MyWebviewSettings.setAllowUniversalAccessFromFileURLs(true); 
     MyWebviewSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
     MyWebviewSettings.setJavaScriptEnabled(true); 
     MyWebviewSettings.setDomStorageEnabled(true); 
     MyWebviewSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
     MyWebviewSettings.setBuiltInZoomControls(true); 
     MyWebviewSettings.setAllowFileAccess(true); 
     MyWebviewSettings.setSupportZoom(true); 
    } 

如果我可以直接从我的应用程序访问摄像头(使用正常活动),为什么我无法从wi打开它薄的WebView?!

+0

当您尝试从网页视图打开相机,那么你需要做的设置webview.Please看到这个http://stackoverflow.com/questions/29290940/open-camera-for-input-type-file-in -webview - 不开放的android – Shailesh

回答

2

如果我没有错,你只是想打开你的设备相机,并在webview中上传新捕获的照片,而无需打开其他应用程序,那么你还需要WRITE_EXTERNAL_STORAGE权限和方法来处理文件请求和创建新的文件与相机和写它到你的设备存储。

我希望这可以帮助,我发现这Open Source (Android Smart WebView)可以帮助您为您设置的东西。

你需要寻找openFileChooser()onShowFileChooser()方法来理解如何处理来自webview输入的文件请求,并激活你的手机相机捕获和创建新的图像,而无需打开其他应用程序。

3

通过WebRTC,getUserMedia肯定可行。

设置您的WebView允许的权限,并使用loadURL()加载HTML:

WebView myWebView = (WebView) findViewById(R.id.webview); 

    myWebView.getSettings().setJavaScriptEnabled(true); 
    myWebView.getSettings().setAllowFileAccessFromFileURLs(true); 
    myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); 

    myWebView.setWebViewClient(new WebViewClient()); 
    myWebView.setWebChromeClient(new WebChromeClient() { 
     // Grant permissions for cam 
     @Override 
     public void onPermissionRequest(final PermissionRequest request) { 
      Log.d(TAG, "onPermissionRequest"); 
      MainActivity.this.runOnUiThread(new Runnable() { 
       @TargetApi(Build.VERSION_CODES.M) 
       @Override 
       public void run() { 
        Log.d(TAG, request.getOrigin().toString()); 
        if(request.getOrigin().toString().equals("file:///")) { 
         Log.d(TAG, "GRANTED"); 
         request.grant(request.getResources()); 
        } else { 
         Log.d(TAG, "DENIED"); 
         request.deny(); 
        } 
       } 
      }); 
     } 


    }); 

    myWebView.loadUrl(LOCAL_FILE); 

然后通过你的JS文件中使用getUserMedia,假设你在HTML文件中有一个<video>标签:

var constraints = { video: { width: 800, height: 800 } }; 

navigator.mediaDevices.getUserMedia(constraints) 
.then(function(mediaStream) { 
    var video = document.querySelector('video'); 
    video.srcObject = mediaStream; 
    video.onloadedmetadata = function(e) { 
    video.play(); 
    }; 
}) 
.catch(function(err) { console.log(err.name + ": " + err.message); }); // always check for errors at the end. 

最后,确保你有你的清单中设置权限:

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

我正在尝试同样的事情。下面的代码对我有用。

首先在清单文件中,我们必须使用使用权限标记添加相机硬件权限true。

然后需要接受相机权限才能在您的活动中使用以下行。

webview.setWebChromeClient(new WebChromeClient() { 

    @Override 
    public void onPermissionRequest(final PermissionRequest request) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     request.grant(request.getResources()); 
     } 
    } 

});