【问题标题】:Save and Share QR Created File to Gallery将 QR 创建的文件保存并共享到图库
【发布时间】:2020-10-06 10:57:31
【问题描述】:

我正在开发 Android 应用程序,我正在使用 QR 生成库创建一个 QR 码。通过将数据从预览活动发送到我生成并显示二维码的主活动,我已经实现了二维码的生成。

问题发生在将二维码保存到图库并共享相同二维码的过程中。

我已经实现了共享意图,但它说该意图不能共享一个空文件。

当我尝试保存文件时出现同样的问题。

带有二维码的文件基本上都是空的。

这是我的分享和二维码生成代码:

    class QRGenerationAll : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.qr_generation_all)

        val byteArray = intent.getByteArrayExtra("logoimage")
        val bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
        img_logoimage.setImageBitmap(bmp)

        val valuecatchedvalues: String = intent.getStringExtra("sendedvalues")
        tv_textforqr.setText(valuecatchedvalues)

        val tv_textforqr: String = intent.getStringExtra("logotext")
        tv_textforlogoname.setText(tv_textforqr)


        try {
            //setting size of qr code
            val manager = getSystemService(WINDOW_SERVICE) as WindowManager
            val display = manager.defaultDisplay
            val point = Point()
            display.getSize(point)
            val width = point.x
            val height = point.y
            val smallestDimension = if (width < height) width else height
            // val qrInput = findViewById(R.id.qrInput) as EditText

            //setting parameters for qr code
            val charset = "UTF-8" // or "ISO-8859-1"
            val hintMap: MutableMap<EncodeHintType, ErrorCorrectionLevel> = HashMap()
            hintMap[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.L

            if (valuecatchedvalues!=null) {

                createQRCodeText(
                    valuecatchedvalues,
                    charset,
                    hintMap,
                    smallestDimension,
                    smallestDimension
                ) //MAIN METHOD FOR QR GENERATE
            }
        } catch (ex: Exception) {
            Log.e("QrGenerate", ex.message)
        }

        buttonshare.setOnClickListener(View.OnClickListener {
            val sharingIntent = Intent(Intent.ACTION_SEND)
            sharingIntent.type = "text/plain"
            sharingIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here")
            sharingIntent.putExtra(Intent.EXTRA_TEXT, bmp)
            startActivity(
                Intent.createChooser(
                    sharingIntent,
                    resources.getString(R.string.app_name)
                )
            )
        })


    }

    private fun createQRCodeText(
        valueqrTextData: String,
        charset: String,
        hintMap: MutableMap<EncodeHintType, ErrorCorrectionLevel>,
        smallestDimension: Int,
        smallestDimension1: Int
    ) {

        try {
            //generating qr code in bitmatrix type
            val matrix = MultiFormatWriter().encode(
                String(
                    valueqrTextData.toByteArray(charset(charset)), kotlin.text.charset(charset)
                ), BarcodeFormat.QR_CODE, smallestDimension, smallestDimension1, hintMap
            )
            //converting bitmatrix to bitmap
            val width = matrix.width
            val height = matrix.height
            val pixels = IntArray(width * height)
            // All are 0, or black, by default
            for (y in 0 until height) {
                val offset = y * width
                for (x in 0 until width) {
                    pixels[offset + x] = if (matrix[x, y]) Color.BLACK else Color.WHITE
                }
            }
            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height)
            //setting bitmap to image view
            val myImage = findViewById(R.id.imageView1) as ImageView
            myImage.setImageBitmap(bitmap)
        } catch (er: java.lang.Exception) {
            Log.e("QrGenerate", er.message)
        }

    }
}

下面的sn-p是关于从之前的Activity中提取文本并在接收Activity中生成二维码的。

    val byteArray = intent.getByteArrayExtra("logoimage")
    val bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
    img_logoimage.setImageBitmap(bmp)

    val valuecatchedvalues: String = intent.getStringExtra("sendedvalues")
    tv_textforqr.setText(valuecatchedvalues)

    val tv_textforqr: String = intent.getStringExtra("logotext")
    tv_textforlogoname.setText(tv_textforqr)

这是我在这里面临的唯一问题。我生成了 QR 图像,但当我尝试分享和保存它时,这对我来说似乎是不可能的。

这是分享意图后的消息

我已搜索此链接以获取指导Link 1

【问题讨论】:

  • 请不要发布两个问题。或发布代码以将数据保存到文件。或者发布尝试共享文件的代码。

标签: android kotlin android-intent qr-code


【解决方案1】:

您为 EXTRA_TEXT 键传递了错误的参数值。而不是bmp,你应该使用valuecatchedvalues

sharingIntent.putExtra(Intent.EXTRA_TEXT, valuecatchedvalues)

为什么?

  1. 因为这是您创建 QR 码的值;
  2. bmp 的类型为 Bitmap。提取 EXTRA_TEXT 键的值时无法处理 Bitmap,因为需要 String

【讨论】:

  • 我希望共享由传递值生成的 QR,但在此场景中,它传递的是创建 QR 的文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2015-12-22
  • 2021-11-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多