簡體   English   中英

通過HTML5訪問Android設備的相機 <video> 通過CodeName一個移動應用程序的元素

[英]Accessing an Android device's Camera through the HTML5 <video> element through CodeName One mobile app

我們正在使用CodeName One構建適用於Android的移動應用。 作為要求的一部分,我們已經有一個HTML5頁面,其中包含一個視頻元素,可使用設備的相機捕獲照片。 我們需要從CodeName One應用程序中調用此HTML5頁面。 但是此代碼無法按預期工作,但是當直接從chrome瀏覽器中調用時,html文件URL可以正常工作。 從chrome瀏覽器查看時,出現提示詢問相機許可的提示,如CodeName One應用程序中所示,我看不到許可提示。

我最近看到一個類似的問題發布html video control在codenameone應用程序中無法正常工作

我已經嘗試過那里給出的建議,但是對我沒有用。 也許我在這里做錯了嗎?

在我的CodeName一類中,我有以下代碼。 該代碼基本上創建了一個新的BrowserComponent並在該組件中設置了camera1.html URL。 camera1.html包含HTML5代碼,該代碼顯示用於拍照的視頻元素。 `

private Form current;
private Resources theme;

public void init(Object context) {
    theme = UIManager.initFirstTheme("/theme");

    // Enable Toolbar on all Forms by default
    Toolbar.setGlobalToolbar(true);    
}

public void start(){
    if(current != null) {
        current.show();
        return;
    }

    Form f = new Form("Camera", new BorderLayout());
    try {
        CN1NativeCameraInterface cnci = NativeLookup.create(CN1NativeCameraInterface.class);
        if (cnci != null && cnci.isSupported()) {

            boolean cameraPerm = cnci.promptCameraPermission();
            if (cameraPerm) {
               f.setTitle("Camera Permission true");
            }              
        }

        BrowserComponent browser = new BrowserComponent();

        browser.setURL("https://8c10ec77.ngrok.io/app/camera1.html");
        f.add(BorderLayout.CENTER, browser);
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
    finally {
        f.show();
    }
}

public void stop(){
    current = Display.getInstance().getCurrent();
}

public void destroy(){
}

`我已經定義了一個本機接口,如下所示

public interface CN1NativeCameraInterface extends NativeInterface {
    public boolean promptCameraPermission();
}

在CodeName One中為此接口生成了本機訪問代碼,Android的實現如下

import com.codename1.impl.android.AndroidImplementation;
import android.Manifest;

public class CN1NativeCameraInterfaceImpl {
    public boolean promptCameraPermission() {
        return AndroidImplementation.checkForPermission(Manifest.permission.CAMERA, "This is required to take a picture");
    }

    public boolean isSupported() {
        return true;
    }

}

當我在Android設備上運行此代碼時,我可以看到HTML頁面正在加載,但是video元素沒有加載,我所看到的只是video元素的占位符。 該應用程序也不要求相機許可,這是其他相關問題中提出的建議。

我在這里做錯了什么?

更新1:

我在使用adb shell“ logcat --pid = $(pidof -s com.codename1)”命令從設備獲取的日志中看到以下錯誤:

錯誤1-

09-06 11:48:42.530 10172 10202 I WebViewFactory:正在加載com.android.chrome版本69.0.3497.76(代碼349707652)09-06 11:48:42.595 10172 10202 I zygote64:拒絕對先前失敗的類java重新初始化.lang.Class:java.lang.NoClassDefFoundError:無法解決以下問題:Landroid / webkit / TracingController; 09-06 11:48:42.595 10172 10202我zygote64:at java.lang.Class java.lang.Class.classForName(java.lang.String,boolean,java.lang.ClassLoader)(Class.java:-2)09 -06 11:48:42.595 10172 10202我zygote64:at java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader)(Class.java:453)09-06 11:48:42.595 10172 10202我zygote64:位於java.lang.Class android.webkit.WebViewFactory.getWebViewProviderClass(java.lang.ClassLoader)(WebViewFactory.java:151)09-06 11:48:42.595 10172 10202我zygote64:在java.lang.Class android.webkit.WebViewFactory.getProviderClass()(WebViewFactory.java:472)09-06 11:48:42.595 10172 10202我zygote64:在android.webkit.WebViewFactoryProvider android.webkit.WebViewFactory.getProvider() (WebViewFactory.java:212)09-06 11:48:42.595 10172 10202我zygote64:在android.webkit.CookieManager android.webkit.CookieManager.getInstance()(CookieManager.java:39)09-06 11:48:42.595 10172 10202我zygote64:位於android.webkit.CookieManager com.codename1.imp l.android.AndroidImplementation.getCookieManager()(AndroidImplementation.java:4511)09-06 11:48:42.595 10172 10202 I zygote64:at java.util.Vector com.codename1.impl.android.AndroidImplementation.getCookiesForURL(java.lang .String)(AndroidImplementation.java:4528)09-06 11:48:42.595 10172 10202 I zygote64:at com.codename1.io.ConnectionRequest.performOperation()(ConnectionRequest.java:633)09-06 11:48: 42.595 10172 10202我zygote64:無效com.codename1.io.NetworkManager $ NetworkThread.run()(NetworkManager.java:282)09-06 11:48:42.595 10172 10202我zygote64:無效com.codename1.impl.CodenameOneThread $ 1.run()(CodenameOneThread.java:60)09-06 11:48:42.595 10172 10202 I zygote64:at void java.lang.Thread.run()(Thread.java:764)09-06 11:48: 42.595 10172 10202我zygote64:由以下原因引起:java.lang.ClassNotFoundException:在路徑:DexPathList [[zip file“ /data/app/com.android.chrome-fq476TNc_btk-Vb0sBbuyw”中找不到類“ android.webkit.TracingController” == / base.apk“],nativeLibraryDire ctories = [/ data / app / com.android.chrome-fq476TNc_btk-Vb0sBbuyw == / lib / arm64,/data/app/com.android.chrome-fq476TNc_btk-Vb0sBbuyw==/base.apk!/lib/arm64- v8a,/ system / lib64,/ system / vendor / lib64]] 09-06 11:48:42.595 10172 10202我zygote64:位於java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String)(BaseDexClassLoader .java:93)09-06 11:48:42.595 10172 10202我zygote64:在java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String,boolean)(ClassLoader.java:379)09-06 11:48:42.595 10172 10202我zygote64:在java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String)(ClassLoader.java:312)09-06 11:48:42.595 10172 10202我zygote64:在java.lang.Class java.lang.Class.classForName(java.lang.String,boolean,java.lang.ClassLoader)(Class.java:-2)09-06 11:48:42.595 10172 10202我zygote64:at java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader)(Class.java:453)09-06 11:48:42.595 10172 10202我zygote64:在java。 lang.class androi d.webkit.WebViewFactory.getWebViewProviderClass(java.lang.ClassLoader)(WebViewFactory.java:151)09-06 11:48:42.595 10172 10202我zygote64:在java.lang.Class android.webkit.WebViewFactory.getProviderClass()( WebViewFactory.java:472)09-06 11:48:42.595 10172 10202我zygote64:位於android.webkit.WebViewFactoryProvider android.webkit.WebViewFactory.getProvider()(WebViewFactory.java:212)09-06 11:48:42.595 10172 10202我zygote64:位於android.webkit.CookieManager android.webkit.CookieManager.getInstance()(CookieManager.java:39)09-06 11:48:42.595 10172 10202我zygote64:位於android.webkit.CookieManager com.codename1.impl .android.AndroidImplementation.getCookieManager()(AndroidImplementation.java:4511)09-06 11:48:42.595 10172 10202 I zygote64:at java.util.Vector com.codename1.impl.android.AndroidImplementation.getCookiesForURL(java.lang。字符串)(AndroidImplementation.java:4528)09-06 11:48:42.595 10172 10202我zygote64:at無效com.codename1.io.ConnectionRequest.performOperation()(Connec tionRequest.java:633)

錯誤2-

09-06 11:48:44.506 10172 10266 W VideoCapabilities:無法識別的配置文件2130706433用於視頻/ AVC 09-06 11:48:44.506 10172 10266 W VideoCapabilities:無法識別的配置文件2130706434用於視頻/ AVC 09-06 11:48:44.536 10172 10266 W VideoCapabilities:用於視頻/ AVC的無法識別的配置文件2130706433 09-06 11:48:44.536 10172 10266 W VideoCapabilities:用於視頻/ AVC的無法識別的配置文件2130706434 09-06 11:48:44.542 10172 10266 W VideoCapabilities:用於視頻/ AVC的無法識別的配置文件2130706433 09-06 11:48:44.542 10172 10266 W VideoCapabilities:無法識別的配置文件2130706434用於視頻/ AVC 09-06 11:48:44.551 10172 10266 W VideoCapabilities:無法識別的配置文件/級別0/3用於視頻/ MPEG2 09-06 11:48 :44.555 10172 10266 W VideoCapabilities:無法識別的配置文件/視頻/ mpeg2的0/3級09-06 11:48:44.564 10172 10266 W VideoCapabilities:不支持的mime video / x-ms-wmv 09-06 11:48:44.568 10172 10266 W VideoCapabilities:不支持的mime video / x-ms-wmv 09-06 11:48:44.574 10172 10266 W VideoCapabili 關系:不支持的mime video / divx 09-06 11:48:44.577 10172 10177 I zygote64:執行部分代碼緩存收集,代碼= 55KB,數據= 56KB 09-06 11:48:44.580 10172 10266 W視頻功能:不支持的mime視頻/ divx311 09-06 11:48:44.584 10172 10266 W VideoCapabilities:不支持的mime video / divx4 09-06 11:48:44.585 10172 10177 I zygote64:在代碼緩存收集之后,代碼= 55KB,數據= 56KB 09-06 11:48 :44.585 10172 10177 I zygote64:將代碼緩存容量增加到256KB 09-06 11:48:44.605 10172 10266 W VideoCapabilities:不支持的mime video / mp4v-esdp 09-06 11:48:44.633 10172 10266 I VideoCapabilities:不支持的配置文件4 video / mp4v-es 09-06 11:48:44.867 10172 10282 W cr_CrashFileManager:/data/user/0/com.codename1/cache/WebView/Crash報告不存在或不是目錄

錯誤3-

09-06 11:48:47.715 10172 10253 I CameraManagerGlobal:連接到攝像頭服務09-06 11:48:47.799 10172 10172 D代號一:onPermissionRequest 09-06 11:48:50.952 10172 10172 E AndroidImplementation:null 09-06 11 :48:50.952 10172 10172 E AndroidImplementation:java.io.FileNotFoundException:/data/user/0/com.codename1/files/CN1$AndroidServiceProperties(無此類文件或目錄)09-06 11:48:50.952 10172 10172 E AndroidImplementation :位於java.io.FileInputStream.open0(本機方法)09-06 11:48:50.952 10172 10172 E AndroidImplementation:位於java.io.FileInputStream.open(FileInputStream.java:200)09-06 11:48:50.952 10172 10172 E AndroidImplementation:在java.io.FileInputStream。(FileInputStream.java:150)09-06 11:48:50.952 10172 10172 E AndroidImplementation:在android.app.ContextImpl.openFileInput(ContextImpl.java:515)09-06 11 :48:50.952 10172 10172 E AndroidImplementation:位於android.content.ContextWrapper.openFileInput(ContextWrapper.java:190)09-06 11:48:50.952 10172 10172 E和 roidImplementation:位於com.codename1.impl.android.AndroidImplementation.getServiceProperties(AndroidImplementation.java:6081)09-06 11:48:50.952 10172 10172 E AndroidImplementation:位於com.codename1.impl.android.AndroidImplementation.writeServiceProperties(AndroidImplementation.java :6107)09-06 11:48:50.952 10172 10172 E AndroidImplementation:在com.codename1.CameraDemoStub.onStop(CameraDemoStub.java:166)09-06 11:48:50.952 10172 10172 E AndroidImplementation:在android.app.Instrumentation .callActivityOnStop(Instrumentation.java:1486)09-06 11:48:50.952 10172 10172 E AndroidImplementation:at android.app.Activity.performStop(Activity.java:7178)09-06 11:48:50.952 10172 10172 E AndroidImplementation:在android.app.ActivityThread.performStopActivityInner(ActivityThread.java:4274)09-06 11:48:50.952 10172 10172 E AndroidImplementation:在android.app.ActivityThread.handleStopActivity(ActivityThread.java:4333)09-06 11:48: 50.952 10172 10172 E AndroidImplementation:位於android.app.Activi tyThread.-wrap24(未知來源:0)09-06 11:48:50.952 10172 10172 E AndroidImplementation:at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1722)09-06 11:48:50.952 10172 10172 E AndroidImplementation:at android.os.Handler.dispatchMessage(Handler.java:105)09-06 11:48:50.952 10172 10172 E AndroidImplementation:at android.os.Looper.loop(Looper.java:164)09-06 11 :48:50.952 10172 10172 E AndroidImplementation:位於android.app.ActivityThread.main(ActivityThread.java:6798)09-06 11:48:50.952 10172 10172 E AndroidImplementation:位於java.lang.reflect.Method.invoke(本機方法) )09-06 11:48:50.952 10172 10172 E AndroidImplementation:at com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)09-06 11:48:50.952 10172 10172 E AndroidImplementation:at com .android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

錯誤4-

09-06 11:48:51.005 10172 10172 D CameraDemo:[主] 0:0:0,3-[日志]發生以下錯誤:NotAllowedError: https ://8319bf05.ngrok.io/第55行上的權限被拒絕ventasys / venta / code / camera1.html

上面的錯誤(錯誤4)來自從CodeName One調用的.html。 這是HTML的代碼:

<!DOCTYPE HTML>
<html>
  <head>
    <script>
        function copyPhoto() {
            var imgName;
            imgName = getParamValues("imgNm");        
            window.opener.document.getElementById(imgName).src = document.getElementById("theimage1").src;
            window.close();
        }

        function getParamValues(paramNm) {
            var qstring = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
            for (var i = 0; i < qstring.length; i++) {
                var urlparam = qstring[i].split('='); 
                if (urlparam[0] == paramNm) {                        
                    return urlparam[1];
                }
            }
        }

        function snapshot() {

            var canvas = document.getElementById("thecanvas");

            var ctx = canvas.getContext("2d");

            //var constraints = { video: { facingMode: "user" }, audio: false };
            //var constraints = {
            //    video: {
            //        width: { min: 640, ideal: 1920 },
            //        height: { min: 400, ideal: 1080 },
            //        aspectRatio: { ideal: 1.7777777778 },
            //        facingMode: "environment"
            //    },
            //    audio: false
            //};

            var constraints = {
                video: { facingMode: "user" },
                audio: false
            };

            try {

                navigator.mediaDevices.getUserMedia(constraints).then(                        
                    // successCallback
                    function (localMediaStream) {
                        document.getElementById("mylog").innerHTML = document.getElementById("mylog").innerHTML + '1.3 ';
                        video = document.querySelector('video');
                        video.srcObject = localMediaStream;
                    })
                    .catch(function (err) {
                        console.log("The following error occured: " + err);
                        document.getElementById("mylog").innerHTML = document.getElementById("mylog").innerHTML + ' <br> 5 Err' + err;
                    });

            }
            catch (e)
            {
                document.getElementById("mylog").innerHTML = document.getElementById("mylog").innerHTML + ' 6 catch ##** ' + e;
            }
            document.getElementById("mylog").innerHTML = document.getElementById("mylog").innerHTML + '10 ';
            canvas.width = 640;
            canvas.height = video.videoHeight / (video.videoWidth / canvas.width);

            // Draws current image from the video element into the canvas               
            //ctx.drawImage(video, 0,0, video.videoWidth, video.videoHeight);
            ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

            var canvas = document.getElementById("thecanvas");
            var dataUrl = canvas.toDataURL('image/jpeg', 0.6);
        }
    </script>
</head>
<body onload="snapshot();">
    <div id='mylog'></div>
    <p><video id="video" controls autoplay></video></p>
    <p><button onclick="snapshot();">Take Snapshot</button></p>
    <div id='item' hidden>
        <p><canvas id="thecanvas"></canvas></p>
    </div>        
    <p><image id="theimage1"></image></p>
    <p><button onclick="copyPhoto()">Done</button></p>
    <p><button onclick="copyPhoto()">Reload</button></p>
</body>
</html>

嘗試將其添加到您的init(Object)方法中:

Display.getInstance().setProperty("android.WebView.grantPermissionsFrom", url_of_your_video_page);

您可以添加多個以空格分隔的URL。 如果這不起作用,我們可能還需要其他東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM