网页端打开相机扫描二维码

jsQR 源码:https://github.com/cozmo/jsQR

需要HTTPS下才能使用。

 

看情况调整display

<div class="camera">
    <div id="loadingMessage" style="display:none">🎥 Unable to access video stream (please make sure you have a webcam enabled)</div>
    <div id="camera-title" style="display:none">
        <img class="scan-btn-switch" src="{% static 'images/camera.png' %}" />
    </div>
    <canvas id="canvas" style="display:none"></canvas>
</div>
$(function(){
    var video = document.createElement("video");
    var canvasElement = document.getElementById("canvas");
    var canvas = canvasElement.getContext("2d");
    var loadingMessage = document.getElementById("loadingMessage");
    var camera_title = document.getElementById("camera-title");

    var currentStream;
    var currentFacingMode="environment";
    function stopMediaTracks(currentStream) {
        currentStream.getTracks().forEach(track => {
            track.stop();
        });
    }

    function tick() {
        $(loadingMessage).css('display', 'block');
        loadingMessage.innerText = "⌛ Loading video..."
        if (video.readyState === video.HAVE_ENOUGH_DATA) {
            $(loadingMessage).css('display', 'none');
            $(canvasElement).css('display', 'block');
            $(video).fadeIn();
            $('.camera').fadeIn();
            $(camera_title).fadeIn();
            canvasElement.height = video.videoHeight;
            canvasElement.width = video.videoWidth;
            canvas.drawImage(video, 0, 0, canvasElement.width, canvasElement.height);
            var imageData = canvas.getImageData(0, 0, canvasElement.width, canvasElement.height);
            var code = jsQR(imageData.data, imageData.width, imageData.height, {
                inversionAttempts: "dontInvert",
            });
            if (code && code.data != '') {
                $('#loyalty_card_number').val(code.data);
                $('#points_claim_records_search input[name=search]').val(code.data);
                $(video).fadeOut();
                $('.camera').fadeOut();
                $(camera_title).fadeOut();
                console.log("Stop scan");
                // video.pause();
                stopMediaTracks(currentStream);
                return;
            }
        }
        requestAnimationFrame(tick);
    }

    $('.scan-btn').click(function(){
        if (typeof currentStream !== 'undefined') {
            stopMediaTracks(currentStream);
        }
        console.log("Start scan");
        navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }).then(function(stream) {
            $('.scan-btn-switch').show();
            currentFacingMode = "environment";
            currentStream = stream;
            video.srcObject = stream;
            video.setAttribute("playsinline", true); // required to tell iOS safari we don't want fullscreen
            video.play();
            requestAnimationFrame(tick);
        });
    });

    $('.scan-btn-switch').click(function(){
        if (typeof currentStream !== 'undefined') {
            stopMediaTracks(currentStream);
        }
        if (currentFacingMode === "environment") {
            currentFacingMode = "user";
        } else {
            currentFacingMode = "environment";
        }
        console.log("Switch scan");
        navigator.mediaDevices.getUserMedia({ video: { facingMode: currentFacingMode } }).then(function(stream) {
            currentStream = stream;
            video.srcObject = stream;
            video.setAttribute("playsinline", true); // required to tell iOS safari we don't want fullscreen
            video.play();
            requestAnimationFrame(tick);
        });
    });
});

 

可以看看这篇关于使用mediaDevices。

Choosing cameras in JavaScript with the mediaDevices API

https://www.twilio.com/blog/2018/04/choosing-cameras-javascript-mediadevices-api.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中实现扫描二维码并进入网页,你可以按照以下步骤进行操作: 1. 确保你的Android项目中已经添加了ZXing库的依赖。你可以在项目的build.gradle文件中添加以下代码: ```groovy implementation 'com.google.zxing:core:3.4.1' implementation 'com.journeyapps:zxing-android-embedded:3.6.0' ``` 2. 在你的布局文件中添加一个用于预览相机的SurfaceView控件: ```xml <SurfaceView android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在你的Activity中,添加相机权限和相关代码。确保在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 4. 在你的Activity中,定义一个用于处理扫描结果的回调函数,并初始化ZXing扫描器: ```java import com.google.zxing.Result; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; public class MainActivity extends AppCompatActivity { private SurfaceView cameraPreview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cameraPreview = findViewById(R.id.camera_preview); // 初始化ZXing扫描器 IntentIntegrator integrator = new IntentIntegrator(this); integrator.setPrompt("Scan a QR code"); integrator.setCameraId(0); // 前置摄像头为1,后置摄像头为0 integrator.setBeepEnabled(false); // 是否播放扫描成功的声音,默认为true integrator.setBarcodeImageEnabled(true); // 扫描成功后是否保存二维码图片,默认为false integrator.setOrientationLocked(false); // 是否锁定屏幕方向,默认为true integrator.setCaptureActivity(CaptureActivityAnyOrientation.class); // 自定义CaptureActivity的子类 integrator.initiateScan(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 处理扫描结果 IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null && result.getContents() != null) { String scannedData = result.getContents(); // 在此处处理扫描结果,例如打开网页 openWebPage(scannedData); } } private void openWebPage(String url) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } } ``` 这样,当你运行应用程序并扫描二维码时,它将解析二维码中的内容,并使用默认浏览器打开相应的网页。你可以根据自己的需求进行修改和定制化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值