Zxing QR码扫描仪代码无法正常工作

时间:2019-05-25 21:23:01

标签: android kotlin zxing

我正在尝试使用Kotlin中的Zxing库开发QR码扫描仪应用程序。我能够打开相机并扫描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(),并且相机迅速关闭。

2 个答案:

答案 0 :(得分:0)

您的片段未请求活动结果。当您使用活动实例化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 片段而不是框架类型

答案 1 :(得分:0)

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

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

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