2016-11-25 14 views
1

私はget user mediaを使用するMVC 4ウェブアプリケーションを持っています。 API 18を対象とAndroidのWebViewのを持って、私はまた、デバイスは、API 19ですが、私は、コンソールログから取得エラーがGetusermediaはapi 19デバイスのwebviewでは動作しません

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. 

アプリは私が得ることができない電話で、クロームでラップトップ上で正常に動作していますそれは動作するように。

が取り付けられたSSL証明書であり、それは(getusermediaを使用しています)カメラを使用し、ここでは写真を撮るためにコードがある:MVCアプリから

JS:MVCから

/* 
** 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(); 
}); 

} 

が私の見解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> 

オンラインヘルプには、次の

に私は私のウェブ設定を提案

しかし、それは私の問題を解決しないapi 21だけです、実際にはアプリがちょうどクラッシュします。電話でwebviewとchromeの両方でこれを修正するにはどうすればいいですか?

私のアンドロイドのWebViewコード:

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

デバッガを使用してhandler.proceed()が実際に呼び出されることを確認していますか? –

+0

はい、そうです。それはページを提供し、getusermediaのjavascriptを実行しません。ページが読み込まれます。機能を差し引いたものです。 – Danimal

答えて

0

は公式ドキュメントで定義されているAPI 18以下は "Quirksモード" で動作するため、それはです。

注:お使いのtargetSdkVersionが「18」以下に設定されている場合は、WebViewの は、できるかぎり、しばらくはまだ を提供するなど、下記の行動の一部 変化を避けるために「Quirksモード」で動作あなたのアプリにパフォーマンスとWeb標準のアップグレードを提供します。ただし、 では、単一列と狭い列のレイアウトとデフォルトのズームレベルはAndroid 4.4ではまったくサポートされておらず、他の動作のある の違いが特定されていない可能性がありますので、Android 4.4のアプリ をテストしてくださいtargetSdkVersionを "18"以下に設定しても、それ以上の値を設定する必要があります。上

より:https://developer.android.com/guide/webapps/migrating.html

+1

Imyターゲットが18で、デバイスが19です。私はsdk 21でこの動作を修正できるコマンドを使用することはできません。私はここで最善の動きは実際に先に進み、クロムwebviewまたはwebviewなしに移行することだと思いますプログラムを書くだけです。 – Danimal

関連する問題