Android-QR生成器API

Android-QR生成器API,android,kotlin,qr-code,zxing,Android,Kotlin,Qr Code,Zxing,我正试图从我的应用程序中生成一些QR,但我看到有很多类型的QR,如联系人、Wi-Fi等。。我想知道是否有一个免费的API或库来实现这一点,我看到有一些网站已经在生成它,所以我想知道Android是否有任何API或库可以使用 我查到的是: 但是我不确定是否有一个函数可以说ok,我想要一个联系人的QR,这样我就可以添加它的所有信息。U可以使用QRCodeWriter类和Zxing生成QR,并使用encode()函数,其中第一个参数是QR要保存的实际数据。自定义示例: val qrCodeData

我正试图从我的应用程序中生成一些QR,但我看到有很多类型的QR,如联系人、Wi-Fi等。。我想知道是否有一个免费的API或库来实现这一点,我看到有一些网站已经在生成它,所以我想知道Android是否有任何API或库可以使用

我查到的是:


但是我不确定是否有一个函数可以说ok,我想要一个联系人的QR,这样我就可以添加它的所有信息。

U可以使用
QRCodeWriter
类和Zxing生成QR,并使用
encode()
函数,其中第一个参数是QR要保存的实际数据。自定义示例:

val qrCodeData:String=“data”
val bitMatrix=QRCodeWriter().encode(
串(
qrCodeData.toByteArray(字符集(字符集)),
字符集.forName(字符集)
),
条形码格式.QR_码,
大小,
大小,
提示
)
其中
提示
也是此库的一部分,可以在
EncodeHintType
中找到

然后你必须生成一个
位图
,该位图可以显示在例如
图像视图

val bitmap=bitmap.createBitmap(
大小,
大小,
Bitmap.Config.ARGB_8888
)
用于(0中的x,直到尺寸){
用于(y在0中直到大小){
val fillColor=if(位矩阵[x,y])Color.BLACK else Color.WHITE
bitmap.setPixel(x,y,fillColor)//使用ZXing生成二维码
在应用程序级
build.gradle
文件中添加以下ZXing核心依赖项

implementation 'com.google.zxing:core:3.4.0'
生成512x512 px WiFi二维码的示例代码。您可以在ImageView中设置生成的位图

fun getQrCodeBitmap(ssid: String, password: String): Bitmap {
    val qrCodeContent = "WIFI:S:$ssid;T:WPA;P:$password;;"
    val hints = hashMapOf<EncodeHintType, Int>().also { it[EncodeHintType.MARGIN] = 1 } // Make the QR code buffer border narrower
    val bits = QRCodeWriter().encode(qrCodeContent, BarcodeFormat.QR_CODE, size, size, hints)
    val size = 512 //pixels
    return Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565).also {
        for (x in 0 until size) {
            for (y in 0 until size) {
                it.setPixel(x, y, if (bits[x, y]) Color.BLACK else Color.WHITE)
            }
        }
    }
}
步骤1:设置条形码处理器回调

private val processor = object : Detector.Processor<Barcode> {
    
    override fun receiveDetections(detections: Detector.Detections<Barcode>?) {
        detections?.apply {
            if (detectedItems.isNotEmpty()) {
                val qr = detectedItems.valueAt(0)
                // Parses the WiFi format for you and gives the field values directly
                // Similarly you can do qr.sms for SMS QR code etc.
                qr.wifi?.let { 
                    Log.d(TAG, "SSID: ${it.ssid}, Password: ${it.password}")
                }
            }
        }
    }

    override fun release() {}
} 
步骤3:在布局中添加一个
SurfaceView
,以承载
CameraSource

<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /> 
第5步:使用生命周期方法将所有内容链接在一起

// Create camera source and attach surface view callback to surface holder
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_camera_sheet, container, false).also {
        setupCamera()
        it.surfaceView.holder.addCallback(callback)
    }
}

// Free up camera source resources
override fun onDestroy() {
    super.onDestroy()
    cameraSource?.release()
}

但我如何才能生成QR作为生成器,我可以说它是针对Twitter的,是针对短信的,是一个Wifi QR…哪个是参数?我没有问题。Twitter的QR和短信的QR等的区别是什么?你应该在你的回答
实现'com.google.Zxing:core:3.4.0'
中添加对Zxing的依赖性他说他检查过了,但我确定could@StuartDTO您可以自己为各种类型创建字符串并将其传递给ZXing。例如,WiFi的格式为“WiFi:S:$ssid;T:WPA;P:$passkey;;”
。同样,你可以找到联系人等的字符串。顺便说一句,Google Mobile Vision条形码API也可以理解此WiFi代码,而无需手动拆分字符串。对于各种格式,请查看此出色的答案——我想这就是我要找的!是否有更新此内容的页面?有人在我在上面链接的同一个线程--@Siddharthakamaria所以,我不需要任何API或外部的东西来生成QR,我可以使用相同的库来生成和读取?如果是这样,我可以使用该库自定义颜色添加图像等?为了读取,我使用Google的Mobile Vision API主要是因为它可以检测很多现成的QR格式我们切碎字符串--。关于你的另一个问题,我真的不知道如何添加覆盖层和更改QR颜色:(惊人的@Siddhart Kamaria,我测试后会告诉你。这意味着我对所有可能的检测都有一个when,并在那里做自己的事情?我的意思是现在你已经放置了qr.wifi,但为了确保我能接受所有类型,我必须将所有类型都放在那里,对吗?@Stuartdt要正确,你可以在检测中使用when语句并执行正确的p。)正在处理,但请确保处理空/空值。还要让我知道代码是否有任何问题,因为我从我的一个项目中取出了它并编辑了一点!我猜它不起作用,因为摄影机权限没有要求它接受,或者denyI已经在else块中请求了权限,但是没有发生任何事情。如果我去了返回并再次打开活动它显示一个黑屏,但不是摄像头。我终于让它工作了,但是有没有办法创建一个自定义扫描视图?
<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /> 
private val callback = object : SurfaceHolder.Callback {

    override fun surfaceCreated(holder: SurfaceHolder) {
        // Ideally, you should check the condition somewhere 
        // before inflating the layout which contains the SurfaceView
        if (isPlayServicesAvailable(requireActivity()))
            cameraSource?.start(holder)
    } 

    override fun surfaceDestroyed(holder: SurfaceHolder) {
        cameraSource?.stop()
    }

    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { }
}


// Helper method to check if Google Play Services are up to-date on the phone
fun isPlayServicesAvailable(activity: Activity): Boolean {
    val code = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(applicationContext)
    if (code != ConnectionResult.SUCCESS) {
        GoogleApiAvailability.getInstance().getErrorDialog(activity, code, code).show()
        return false
    }
    return true
}
// Create camera source and attach surface view callback to surface holder
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_camera_sheet, container, false).also {
        setupCamera()
        it.surfaceView.holder.addCallback(callback)
    }
}

// Free up camera source resources
override fun onDestroy() {
    super.onDestroy()
    cameraSource?.release()
}