Android - 如何更改条码扫描器视图大小?

时间:2018-01-17 18:25:53

标签: android kotlin

我正在尝试按照此YouTube video制作条形码扫描仪。通过观看此视频,我可以让应用有效。但是,当条形码阅读器占据整个页面时,扫描光标占据屏幕区域的大约40%。所以我想知道是否有办法缩小条形码,剩余空间可用于放置一些按钮或警告TexViews。 所以基本上我想设置QR摄像机视图的宽度和高度。那么它可能吗?

enter image description here

很明显,绿色广场外面的空间是浪费,这就是为什么我要安排它以便它的尺寸大约为200dp * 200dp。

代码如下:

package com.example.priyanka.qrbarcodescanner

import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.hardware.Camera
import android.net.Uri
import android.os.Build
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast

import com.google.zxing.Result

import me.dm7.barcodescanner.zxing.ZXingScannerView

import android.Manifest.permission.CAMERA

class MainActivity : AppCompatActivity(), ZXingScannerView.ResultHandler {
    private var scannerView: ZXingScannerView? = null
    internal var mcontext: Context? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mcontext = this

        scannerView = ZXingScannerView(this)
        setContentView(scannerView)
        val currentApiVersion = Build.VERSION.SDK_INT

        if (currentApiVersion >= Build.VERSION_CODES.M) {
            if (checkPermission()) {
                Toast.makeText(applicationContext, "Permission already granted!", Toast.LENGTH_LONG).show()
            } else {
                requestPermission()
            }
        }
    }

    private fun checkPermission(): Boolean {
        return ContextCompat.checkSelfPermission(applicationContext, CAMERA) == PackageManager.PERMISSION_GRANTED
    }

    private fun requestPermission() {
        ActivityCompat.requestPermissions(this, arrayOf(CAMERA), REQUEST_CAMERA)
    }

    public override fun onResume() {
        super.onResume()

        val currentapiVersion = android.os.Build.VERSION.SDK_INT
        if (currentapiVersion >= android.os.Build.VERSION_CODES.M) {
            if (checkPermission()) {
                if (scannerView == null) {
                    scannerView = ZXingScannerView(this)
                    setContentView(scannerView)
                }
                scannerView!!.setResultHandler(this)
                scannerView!!.startCamera()
            } else {
                requestPermission()
            }
        }
    }

    public override fun onDestroy() {
        super.onDestroy()
        scannerView!!.stopCamera()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        when (requestCode) {
            REQUEST_CAMERA -> if (grantResults.size > 0) {

                val cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED
                if (cameraAccepted) {
                    Toast.makeText(applicationContext, "Permission Granted, Now you can access camera", Toast.LENGTH_LONG).show()
                } else {
                    Toast.makeText(applicationContext, "Permission Denied, You cannot access and camera", Toast.LENGTH_LONG).show()
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        if (shouldShowRequestPermissionRationale(CAMERA)) {
                            showMessageOKCancel("You need to allow access to both the permissions",
                                    DialogInterface.OnClickListener { dialog, which ->
                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                            requestPermissions(arrayOf(CAMERA),
                                                    REQUEST_CAMERA)
                                        }
                                    })
                            return
                        }
                    }
                }
            }
        }
    }

    private fun showMessageOKCancel(message: String, okListener: DialogInterface.OnClickListener) {
        android.support.v7.app.AlertDialog.Builder(mcontext!!)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show()
    }

    override fun handleResult(result: Result) {
        val myResult = result.text
        Log.d("QRCodeScanner", result.text)
        Log.d("QRCodeScanner", result.barcodeFormat.toString())

        val builder = AlertDialog.Builder(this)
        builder.setTitle("Scan Result")
        builder.setPositiveButton("OK") { dialog, which -> scannerView!!.resumeCameraPreview(this@MainActivity) }
        builder.setNeutralButton("Visit") { dialog, which ->
            val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(myResult))
            startActivity(browserIntent)
        }
        builder.setMessage(result.text)
        val alert1 = builder.create()
        alert1.show()
    }

    companion object {

        private val REQUEST_CAMERA = 1
        private val camId = Camera.CameraInfo.CAMERA_FACING_BACK
    }
}

提前谢谢。

1 个答案:

答案 0 :(得分:3)

您可以将zxing嵌入式库与这些gradle依赖项一起使用:

implementation "com.journeyapps:zxing-android-embedded:3.5.0@aar"
implementation "com.google.zxing:core:3.3.0"

然后将其放在您的布局中

<com.journeyapps.barcodescanner.DecoratedBarcodeView
    android:id="@+id/qr_scanner_view"
    android:layout_width="@dimen/your_width"
    android:layout_height="@dimen/your_height" />

然后在您的代码中使用它,如

DecoratedBarcodeView qrView = findViewById(R.id.qr_scanner_view);
CameraSettings s = new CameraSettings();
s.setRequestedCameraId(0); // front/back/etc
qrView.getBarcodeView().setCameraSettings(s);
qrView.resume();

qrView.decodeSingle(new BarcodeCallback() {
    @Override
    public void barcodeResult(BarcodeResult result) {
        Log.d("barcode result: " + result.toString());
        // do your thing with result
    }

    @Override
    public void possibleResultPoints(List<ResultPoint> resultPoints) {}
});