Android - QR 生成器 API
Android - QR generator API
我正在尝试从我的应用程序生成一些二维码,但我看到有很多类型的二维码,例如联系人、Wi-Fi 等。我想知道是否有免费的 API 或库来实现这个,我看到有些网站已经在生成它所以我想知道 Android 是否有任何 API 或库可以使用。
我检查过的内容:
但我不确定是否有功能说好的,我想要一个联系人的二维码,这样我就可以添加它的所有信息。
U 可以使用 QRCodeWriter
class 和 Zxing 生成 QR,并使用 encode()
函数,其中第一个参数是 QR 要保存的实际数据。自定义示例:
val qrCodeData: String = "data"
val bitMatrix = QRCodeWriter().encode(
String(
qrCodeData.toByteArray(charset(CHARSET)),
Charset.forName(CHARSET)
),
BarcodeFormat.QR_CODE,
size,
size,
hints
)
其中 hints
也是此库的一部分,可以在 EncodeHintType
中找到。
然后你必须生成一个 Bitmap
可以显示在例如ImageView
.
val bitmap = Bitmap.createBitmap(
size,
size,
Bitmap.Config.ARGB_8888
)
for (x in 0 until size) {
for (y in 0 until size) {
val fillColor = if (bitMatrix[x, y]) Color.BLACK else Color.WHITE
bitmap.setPixel(x, y, fillColor) // <-- color ur QR to default black and white
}
}
使用ZXing生成二维码
在您的应用级别 build.gradle
文件中添加以下 ZXing 核心依赖项。
implementation 'com.google.zxing:core:3.4.0'
生成 512x512 像素 WiFi 二维码的示例代码。您可以在 ImageView 中设置生成的位图。
fun getQrCodeBitmap(ssid: String, password: String): Bitmap {
val size = 512 //pixels
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)
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)
}
}
}
}
要生成其他类型的 QR 码,例如 SMS、VCard 等,您可以查看这个有用的 ZXing Wiki。
使用Google移动视觉扫描二维码API
将以下 GMS 依赖项添加到您的应用级别 build.gradle
。
implementation 'com.google.android.gms:play-services-vision:20.1.2'
步骤 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() {}
}
第 2 步: 使用条形码处理器回调设置 BardcodeDetector
并将其添加到 CameraSource
,如下所示。不要忘记在运行时检查 Manifest.permission.CAMERA
并将其添加到 AndroidManifest.xml
.
private fun setupCameraView() {
if (ContextCompat.checkSelfPermission(requireContext(), android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
BarcodeDetector.Builder(requireContext()).setBarcodeFormats(QR_CODE).build().apply {
setProcessor(processor)
if (!isOperational) {
Log.d(TAG, "Native QR detector dependencies not available!")
return
}
cameraSource = CameraSource.Builder(requireContext(), this).setAutoFocusEnabled(true)
.setFacing(CameraSource.CAMERA_FACING_BACK).build()
}
} else {
// Request camers permission from user
// Add <uses-permission android:name="android.permission.CAMERA" /> to AndroidManifest.xml
}
}
第 3 步: 将 SurfaceView
添加到您的布局以托管您的 CameraSource
。
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
第 4 步: 创建回调以在创建/销毁表面时启动和停止 CameraSource
。
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
}
第 5 步:Link 所有内容以及生命周期方法。
// 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()
}
如果您正在使用 zxing-android-embedded
dependencies {
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
}
你可以缩短它
val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap(content, BarcodeFormat.QR_CODE, 512, 512)
your_image_view.setImageBitmap(bitmap)
对于 vCard,我可以推荐这个
ZXing 的正确方式 [2021 更新]
依赖关系Gradle Scripts/build.gradle(Module:app)
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
代码
import android.util.Log;
import android.graphics.Bitmap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.journeyapps.barcodescanner.BarcodeEncoder;
public static Bitmap generateQR(String content, int size) {
Bitmap bitmap = null;
try {
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.encodeBitmap(content,
BarcodeFormat.QR_CODE, size, size);
} catch (WriterException e) {
Log.e("generateQR()", e.getMessage());
}
return bitmap;
}
此处有更多详细信息:dx.dragan.ba/qr-creation-android/
我正在尝试从我的应用程序生成一些二维码,但我看到有很多类型的二维码,例如联系人、Wi-Fi 等。我想知道是否有免费的 API 或库来实现这个,我看到有些网站已经在生成它所以我想知道 Android 是否有任何 API 或库可以使用。
我检查过的内容:
但我不确定是否有功能说好的,我想要一个联系人的二维码,这样我就可以添加它的所有信息。
U 可以使用 QRCodeWriter
class 和 Zxing 生成 QR,并使用 encode()
函数,其中第一个参数是 QR 要保存的实际数据。自定义示例:
val qrCodeData: String = "data"
val bitMatrix = QRCodeWriter().encode(
String(
qrCodeData.toByteArray(charset(CHARSET)),
Charset.forName(CHARSET)
),
BarcodeFormat.QR_CODE,
size,
size,
hints
)
其中 hints
也是此库的一部分,可以在 EncodeHintType
中找到。
然后你必须生成一个 Bitmap
可以显示在例如ImageView
.
val bitmap = Bitmap.createBitmap(
size,
size,
Bitmap.Config.ARGB_8888
)
for (x in 0 until size) {
for (y in 0 until size) {
val fillColor = if (bitMatrix[x, y]) Color.BLACK else Color.WHITE
bitmap.setPixel(x, y, fillColor) // <-- color ur QR to default black and white
}
}
使用ZXing生成二维码
在您的应用级别 build.gradle
文件中添加以下 ZXing 核心依赖项。
implementation 'com.google.zxing:core:3.4.0'
生成 512x512 像素 WiFi 二维码的示例代码。您可以在 ImageView 中设置生成的位图。
fun getQrCodeBitmap(ssid: String, password: String): Bitmap {
val size = 512 //pixels
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)
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)
}
}
}
}
要生成其他类型的 QR 码,例如 SMS、VCard 等,您可以查看这个有用的 ZXing Wiki。
使用Google移动视觉扫描二维码API
将以下 GMS 依赖项添加到您的应用级别 build.gradle
。
implementation 'com.google.android.gms:play-services-vision:20.1.2'
步骤 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() {}
}
第 2 步: 使用条形码处理器回调设置 BardcodeDetector
并将其添加到 CameraSource
,如下所示。不要忘记在运行时检查 Manifest.permission.CAMERA
并将其添加到 AndroidManifest.xml
.
private fun setupCameraView() {
if (ContextCompat.checkSelfPermission(requireContext(), android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
BarcodeDetector.Builder(requireContext()).setBarcodeFormats(QR_CODE).build().apply {
setProcessor(processor)
if (!isOperational) {
Log.d(TAG, "Native QR detector dependencies not available!")
return
}
cameraSource = CameraSource.Builder(requireContext(), this).setAutoFocusEnabled(true)
.setFacing(CameraSource.CAMERA_FACING_BACK).build()
}
} else {
// Request camers permission from user
// Add <uses-permission android:name="android.permission.CAMERA" /> to AndroidManifest.xml
}
}
第 3 步: 将 SurfaceView
添加到您的布局以托管您的 CameraSource
。
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
第 4 步: 创建回调以在创建/销毁表面时启动和停止 CameraSource
。
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
}
第 5 步:Link 所有内容以及生命周期方法。
// 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()
}
如果您正在使用 zxing-android-embedded
dependencies {
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
}
你可以缩短它
val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap(content, BarcodeFormat.QR_CODE, 512, 512)
your_image_view.setImageBitmap(bitmap)
对于 vCard,我可以推荐这个
ZXing 的正确方式 [2021 更新]
依赖关系Gradle Scripts/build.gradle(Module:app)
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
代码
import android.util.Log;
import android.graphics.Bitmap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.journeyapps.barcodescanner.BarcodeEncoder;
public static Bitmap generateQR(String content, int size) {
Bitmap bitmap = null;
try {
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
bitmap = barcodeEncoder.encodeBitmap(content,
BarcodeFormat.QR_CODE, size, size);
} catch (WriterException e) {
Log.e("generateQR()", e.getMessage());
}
return bitmap;
}
此处有更多详细信息:dx.dragan.ba/qr-creation-android/