生成二维码

This commit is contained in:
2026-05-13 10:27:46 +08:00
parent 1b84a41a7a
commit 80837e39bf
21 changed files with 560 additions and 16 deletions

View File

@@ -0,0 +1,191 @@
package com.example.defenseapplication.personal
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.RadioButton
import android.widget.RadioGroup
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.bottomsheet.BottomSheetDialog
import androidx.core.content.ContextCompat
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.DialogExpireTimeBinding
import com.example.defenseapplication.databinding.InvitationCodeActivityBinding
import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import com.gyf.immersionbar.ImmersionBar
import java.util.Hashtable
//邀请码页面
class InvitationCodeActivity : AppCompatActivity() {
private lateinit var binding: InvitationCodeActivityBinding
private var expireTimeInMillis: Long = 24 * 60 * 60 * 1000 // 默认24小时
private var selectedExpireOption: Int = 0 // 0: 24h, 1: 7d默认选中24h
companion object {
const val EXPIRE_24H = 24 * 60 * 60 * 1000L
const val EXPIRE_7D = 7 * 24 * 60 * 60 * 1000L
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = InvitationCodeActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initListener()
// 默认显示时效为24h
binding.tvExpireTime.text = getString(R.string.expire_24h)
// 默认显示灰色占位区域,二维码不可见
hideQrCode()
}
private fun initListener() {
binding.ivBack.setOnClickListener {
finish()
}
binding.llExpireTime.setOnClickListener {
showExpireTimeDialog()
}
binding.llWechatShare.setOnClickListener {
// 微信分享功能
shareToWeChat()
}
}
private fun showExpireTimeDialog() {
val dialogBinding = DialogExpireTimeBinding.inflate(LayoutInflater.from(this))
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
dialog.setContentView(dialogBinding.root)
// 设置选中状态
when (selectedExpireOption) {
0 -> dialogBinding.rb24h.isChecked = true
1 -> dialogBinding.rb7d.isChecked = true
}
dialogBinding.radioGroup.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.rb24h -> selectedExpireOption = 0
R.id.rb7d -> selectedExpireOption = 1
}
}
dialogBinding.tvCancel.setOnClickListener {
dialog.dismiss()
}
dialogBinding.tvConfirm.setOnClickListener {
when (selectedExpireOption) {
0 -> {
expireTimeInMillis = EXPIRE_24H
binding.tvExpireTime.text = getString(R.string.expire_24h)
}
1 -> {
expireTimeInMillis = EXPIRE_7D
binding.tvExpireTime.text = getString(R.string.expire_7d)
}
}
// 选择后显示二维码并生成
showQrCode()
generateQRCode()
dialog.dismiss()
}
dialog.show()
}
private fun hideQrCode() {
// 隐藏二维码,显示灰色占位区域
binding.ivQrCode.visibility = View.GONE
binding.ivQrLogo.visibility = View.GONE
binding.vQrPlaceholder.visibility = View.VISIBLE
}
private fun showQrCode() {
// 显示二维码,隐藏灰色占位区域
binding.vQrPlaceholder.visibility = View.GONE
binding.ivQrCode.visibility = View.VISIBLE
binding.ivQrLogo.visibility = View.VISIBLE
}
private fun generateQRCode() {
val content = generateInviteCode()
val qrBitmap = createQRCodeWithLogo(content, 400, 400)
binding.ivQrCode.setImageBitmap(qrBitmap)
}
private fun generateInviteCode(): String {
// 生成包含邀请信息的JSON字符串
val timestamp = System.currentTimeMillis()
val expireTime = timestamp + expireTimeInMillis
return "{\"type\":\"invite\",\"code\":\"INV${timestamp}\",\"expire\":$expireTime}"
}
private fun createQRCodeWithLogo(content: String, width: Int, height: Int): Bitmap? {
return try {
val hints = Hashtable<EncodeHintType, Any>()
hints[EncodeHintType.CHARACTER_SET] = "UTF-8"
hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H
val writer = QRCodeWriter()
val bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints)
val qrBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(qrBitmap)
// 绘制白色背景
canvas.drawColor(Color.WHITE)
// 绘制二维码
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
paint.color = Color.BLACK
val cellWidth = width.toFloat() / bitMatrix.width
val cellHeight = height.toFloat() / bitMatrix.height
for (x in 0 until bitMatrix.width) {
for (y in 0 until bitMatrix.height) {
if (bitMatrix.get(x, y)) {
canvas.drawRect(
x * cellWidth,
y * cellHeight,
(x + 1) * cellWidth,
(y + 1) * cellHeight,
paint
)
}
}
}
qrBitmap
} catch (e: Exception) {
e.printStackTrace()
null
}
}
private fun shareToWeChat() {
// 微信分享实现
// 这里需要集成微信SDK
}
override fun onDestroy() {
super.onDestroy()
}
}