2016-11-17 171 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()); 
     } 
    } 

});