【问题标题】:Zxing QR code scanner code is not working in a fragmentZxing QR码扫描仪代码在片段中不起作用
【发布时间】:2019-05-25 21:23:01
【问题描述】:

我正在尝试使用 Kotlin 中的 Zxing 库开发 QR 码扫描仪应用程序。我可以打开相机并扫描二维码,但没有得到响应。

我也尝试this tutorial 进行实施,但没有得到帮助。

class HomeFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val mScanner = IntentIntegrator(activity)
        mScanner.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)
        mScanner.setBeepEnabled(true)
        mScanner.initiateScan()

    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        if (result != null) {
            if (result.contents == null) {
                Toast.makeText(activity, "Cancelled", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(activity, "Scanned: " + result.contents, Toast.LENGTH_LONG).show()
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }
}

我想在祝酒时得到响应,但是当我尝试使用调试器时,我无法转到 onActivityResult() 并且相机很快关闭。

【问题讨论】:

  • 当相机关闭和应用程序崩溃时,您可以分享您的 logcat 错误详细信息吗?
  • 我在result@AsadChoudhary 中遇到空指针异常
  • 在哪一行?
  • val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
  • 我添加了我的答案。请检查,它应该工作。

标签: android kotlin zxing


【解决方案1】:

您的片段没有请求活动结果。当您使用活动实例化IntentIntegrator(activity) 时,它将运行activity.startActivityForResult(intent, REQUEST_CODE)。因此,您不会在片段中收到结果。

如果您仍在使用android.app.Fragment,您只需确保使用您的片段来实例化IntentIntegrator(this@HomeFragment)。像这样,您将在片段中获得结果,因为它将在内部运行 fragment.startActivityForResult(intent, REQUEST_CODE)

如果您使用的是androidx.fragment.app.Fragment,您可能需要将sources for IntentIntegrator 复制到您的应用中并调整代码以使用AndroidX 片段而不是框架类型。

【讨论】:

    【解决方案2】:

    问题是,扫描器将信息发送到您的活动的 onActivityResult 方法,而不是您的片段方法。因此,可能的解决方案可能是在您的片段中将“this”作为上下文传递,而不是将您的活动作为上下文传递。就像在你的片段中

     val mScanner = IntentIntegrator(this); // pass fragment context
    

    无论您在哪里初始化扫描仪,在 Fragment 中都将 Fragment 作为上下文传递,而不是将活动作为上下文传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多