2016-11-25 5 views
1

Ich habe eine MVC 4 Web App, die get Benutzermedien verwendet. Ich habe auch ein Android webview die api 18 ausgerichtet ist, das Gerät api ist 19, aber die Fehler, die ich aus dem Konsolenprotokoll erhalten, istGetusermedia funktioniert nicht in webview für api 19 Gerät

source: https://dev.*****.com/truck/home/addpic?truck=C090P (0) 
11-25 11:40:19.705 32382-32382/*****.com.trucksurvey I/chromium: [INFO:CONSOLE(0)] "The page at https://dev.****.com/truck/home/addpic?truck=C090P displayed insecure content from android-webview:default_video_poster/8264335106592469907. 

Die App funktioniert auf einem Laptop in Chrom feinen, auf einem Telefon, das ich nicht bekommen kann es funktioniert aber.

Es ist ein SSL-Zertifikat beigefügt, und es verwendet getUserMedia(), um die Kamera zu verwenden und ein Bild zu machen ist hier der Code:

JS von MVC App:

/* 
** My jquery/js for handleing the image taking portion 
** 
*/ 
if (window.location.href.indexOf("addpic") > -1) { 
var canvas = document.getElementById("kfCanvas"), 
     context = canvas.getContext("2d"), 
     video = document.getElementById("video"); 
var canvas2 = document.getElementById("Canvas"), 
     context2 = canvas2.getContext("2d"), 
     video = document.getElementById("video"); 
// Put event listeners into place 
window.addEventListener("DOMContentLoaded", function() { 
    // Grab elements, create settings, etc. 
    var videoObj = { "video": true, video: {width:400, height:300},"facingMode": "environment" }, 
     errBack = function (error) { 
      console.log("Video capture error: ", error.code); 
      $("#drawingForm").hide(); 
     }; 

    // Put video listeners into place 
    if (navigator.getUserMedia) { // Standard 
     navigator.getUserMedia(videoObj, function (stream) { 
      video.src = stream; 
      video.play(); 
     }, errBack); 
    } else if (navigator.webkitGetUserMedia) { // WebKit-prefixed 
     navigator.webkitGetUserMedia(videoObj, function (stream) { 
      video.src = window.webkitURL.createObjectURL(stream); 
      video.play(); 
     }, errBack); 
    } 
    else if (navigator.mozGetUserMedia) { // Firefox-prefixed 
     navigator.mozGetUserMedia(videoObj, function (stream) { 
      video.src = window.URL.createObjectURL(stream); 
      video.play(); 
     }, errBack); 
    } 
}, false); 
document.getElementById("snap").addEventListener("click", function() { 
    context.drawImage(video, 0, 0, 800, 600); 
    context2.drawImage(video, 0, 0, 400, 300); 
    // Generate the image data 
    var Pic = canvas.toDataURL("image/png"); 
    Pic = Pic.replace(/^data:image\/(png|jpg);base64,/, "") 
    $("#vid").hide(); 
    $("#drawingForm").show(); 
    $('kfCanvas').hide(); 
}); 

$("#btnSave").click(function() { 
    var form = $("#drawingForm"); 
    var image = document.getElementById("kfCanvas").toDataURL("image/png"); 
    image = image.replace('data:image/png;base64,', ''); 
    $("#imageData").val(image); 
    form.submit(); 
}); 
$("#btnRedo").click(function() { 
    $("#vid").show(); 
    $("#drawingForm").hide(); 
}); 

} 

meiner Ansicht von MVC 4:

@model truckEval.Models.DrawingModel 


@{ 
ViewBag.Title = "Add a picture"; 
} 
<div style="margin-left:0px;"> 
<div style="position:absolute;z-index:1000;max-width:480px;" id="vid"> 
<button id="snap" >Snap Photo</button> 
<video id="video" width="400" height="300" autoplay></video> 

</div> 
<div style="position:absolute;"> 
@using (Html.BeginForm(null, null, FormMethod.Post, new { id ="drawingForm" })) 
{ 


     <input type="hidden" name="imageData" id="imageData" /> 
     <input type="button" id="btnSave" value="Save Image" /> 
     <input type="button" id="btnRedo" value="Try Again" /> 
     <input type="hidden" name="trucknum" value="@ViewBag.trucknum" /> 
     <input type="hidden" name="tID" value="@ViewBag.ID" /> 

<canvas id="Canvas" width="400" height="300">Sorry, your browser doesn't support canvas technology. 
     </canvas> 


} 
</div> 
<div style="display:none"> 
<canvas id="kfCanvas" width="800" height="600">Sorry, your browser doesn't support canvas technology. 
     </canvas> 
</div> 

</div> 
<div style="margin-left:500px;"> 

<h2>Truck# @ViewBag.ID</h2> 

<div style="position:relative;"> 
    <a class="ui-btn ui-btn-up-b ui-shadow ui-btn-corner-all" style="padding-top:10px;padding-bottom:10px;width:25%;" href="@Url.Action("Index","home")" >Back home</a> 

</div> 
<br /> 
</div> 

die Online-Hilfe schlage ich die folgenden

meine Web-Einstellungen
 webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); 

aber das ist nur api 21, die mein Problem nicht beheben, eigentlich stürzt die App gerade ab. Wie behebe ich dies für die Webansicht und Chrome auf einem Telefon.

mein android webview Code:

import android.annotation.TargetApi; 
import android.content.Intent; 
import android.net.Uri; 
import android.net.http.SslError; 
import android.os.Build; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.webkit.PermissionRequest; 
import android.webkit.SslErrorHandler; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class MainActivity extends AppCompatActivity { 
private String TAG ="MainActivity"; 
public WebView webview; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //webview use to call own site 
    webview =(WebView)findViewById(R.id.webView); 
    // for regular sites 
    // webview.setWebViewClient(new WebViewClient()); 
    // for ssl certs that look invalid 
    webview.setWebViewClient(new SSLTolerentWebViewClient()); 
    webview.getSettings().setJavaScriptEnabled(true); 
    if (Build.VERSION.SDK_INT >= 21) { 
     webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 
    } 

    // for camera only 
    webview.getSettings().setAllowContentAccess(true); 
    // webview.getSettings().setJavaScriptEnabled(true); 
    webview.getSettings().setAllowFileAccessFromFileURLs(true); 
    webview.getSettings().setAllowUniversalAccessFromFileURLs(true); 
    webview.getSettings().setMediaPlaybackRequiresUserGesture(false); 
    webview.setWebChromeClient(new WebChromeClient(){ 
     @Override 
     public void onPermissionRequest(final PermissionRequest request){ 
      Log.d(TAG, "onPermissionRequest"); 
      MainActivity.this.runOnUiThread(new Runnable(){ 

       @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
       @Override 
       public void run(){ 
        request.grant(request.getResources()); 
       } 
      }); 
     } 

    }); 


    webview.getSettings().setAllowContentAccess(true); 

    webview.getSettings().setDomStorageEnabled(true); 
    if (Build.VERSION.SDK_INT <= 18) { 
     webview.getSettings().setSavePassword(false); 

    } else { 
     // do nothing. because as google mentioned in the documentation - 
     // "Saving passwords in WebView will not be supported in future versions" 
    } 
    webview.getSettings().setSaveFormData(false); 
    webview.clearFormData(); 

    String url = "https://dev.*****.com/truck"; 

    webview.loadUrl(url); 
} 
// for ssl certs that appear invalid 
private class SSLTolerentWebViewClient extends WebViewClient { 
    @Override 
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
     handler.proceed(); // Ignore SSL certificate errors 
    } 
} 
} 
+0

Haben Sie den Debugger verwendet und überprüft, dass der handler.proceed() tatsächlich aufgerufen wird? –

+0

Ja, ja, tut es. Es dient der Seite gut, es führt nur nicht das Javascript für getusermedia. Die Seite wird geladen. minus die Funktionalität. – Danimal

Antwort

0

Es ist, weil API 18 oder weniger im "Quirks-Modus" arbeitet wie in der offiziellen Dokumentation definiert.

Hinweis: Wenn Ihre targetSdkVersion auf „18“ oder niedriger eingestellt ist, WebView arbeitet im „Quirks-Modus“, um einen Teil des Verhaltens zu vermeiden nachstehend beschriebenen Änderungen so nah wie möglich-während noch Bereitstellung Ihre App die Performance- und Webstandards upgraden. Beachten Sie jedoch, , dass einzelne und schmale Spalte Layouts und Standard-Zoom-Stufen sind nicht überhaupt auf Android 4.4 unterstützt, und es kann andere Verhaltens Unterschiede, die nicht identifiziert wurden, so sicher sein, Ihre App auf Android 4.4 zu testen oder höher, auch wenn Sie Ihre targetSdkVersion auf "18" oder niedriger eingestellt haben.

Mehr auf: https://developer.android.com/guide/webapps/migrating.html

+1

Imy Ziel ist 18 das Gerät ist 19. Ich kann nicht die Befehle in SDK 21, die für dieses Verhalten zu beheben würde behoben werden .. Ich denke, der beste Schritt hier ist eigentlich, weiter zu gehen und weiter zu einem Chrom-Webview oder kein Webview überhaupt und schreiben Sie einfach ein Programm. – Danimal

Verwandte Themen