Google条形码扫描ML Kit:在某些设备上活动崩溃

5

更新:

也许自2023年3月21日的更新以来,它现在可以工作了,也可能不行。 如果您想使用它,可以在文档中了解更多信息。

请再次注意,我们还没有测试它是否可以工作。我们必须迅速决定如何使条形码扫描再次工作。因此,我们重构了我们的自定义条形码扫描 Capacitor 插件,改用com.google.mlkit:barcode-scanning:17.1.0。有关更多信息,请参见此处。这需要更多的努力,因为您必须自己实现 UI 并且花哨的扫描动画已经消失了,但它只是有效的,并且似乎更快。


我们正在使用 com.google.android.gms:play-services-code-scanner:16.0.0-beta3 与自定义的 Capacitor 插件结合使用,用于扫描 EAN-13 和 EAN-8 等条形码,但在某些设备上,当用户尝试打开 Google 的条形码扫描器 UI 时,活动似乎会崩溃。

这是来自 logcat 的 错误日志

win=Window{f8c052d u0 com.[redacted]/com.google.mlkit.vision.codescanner.internal.GmsBarcodeScanningDelegateActivity} destroySurfaces: appStopped=true cleanupOnResume=false win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=4 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6529 com.android.server.wm.ActivityRecord.destroySurfaces:6510 com.android.server.wm.ActivityRecord.notifyAppStopped:6574 com.android.server.wm.ActivityRecord.activityStopped:7162 com.android.server.wm.ActivityClientController.activityStopped:258 android.app.IActivityClientController$Stub.onTransact:613 com.android.server.wm.ActivityClientController.onTransact:136

处理扫描界面的代码:

package com.[redacted];

import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;
import com.google.mlkit.vision.barcode.common.Barcode;
import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions;
import com.google.mlkit.vision.codescanner.GmsBarcodeScanning;

@CapacitorPlugin()
public class BarcodeScanner extends Plugin  {
    private void scan() {
        GmsBarcodeScannerOptions options = new GmsBarcodeScannerOptions.Builder()
                .setBarcodeFormats(Barcode.FORMAT_EAN_13, Barcode.FORMAT_EAN_8, Barcode.FORMAT_CODE_128, Barcode.FORMAT_ITF)
                .allowManualInput()
                .build();

        GmsBarcodeScanning
                .getClient(getContext(), options)
                .startScan()
                .addOnSuccessListener(this::onSuccess);
    }

    private void onSuccess(Barcode result) {
        JSObject jsObject = new JSObject();
        jsObject.put("content", result.getDisplayValue());
        jsObject.put("format", result.getFormat());

        this.getSavedCall().success(jsObject);
    }

    @PluginMethod
    public void startScan(PluginCall call) {
        this.saveCall(call);
        this.scan();
    }
}

版本

    minSdkVersion = 23
    compileSdkVersion = 33
    targetSdkVersion = 33
    androidxActivityVersion = '1.6.1'
    androidxAppCompatVersion = '1.6.1'
    androidxCoordinatorLayoutVersion = '1.2.0'
    androidxCoreVersion = '1.9.0'
    androidxFragmentVersion = '1.5.5'
    coreSplashScreenVersion = '1.0.0-rc01'
    androidxWebkitVersion = '1.6.0'
    junitVersion = '4.13.2'
    androidxJunitVersion = '1.1.5'
    androidxEspressoCoreVersion = '3.5.1'
    cordovaAndroidVersion = '10.1.1'

我们已经将Android Webview更新到最新版本,并更新了应用程序中的任何实现包和Capacitor插件的build.gradle文件。由于错误描述非常模糊,我们不知道是什么原因导致了该错误。我们无法在任何地方找到解决方案。这个错误发生在Galaxy Tab S7上,在那里它以前可以工作。它突然停止工作,可能是因为我们不知道任何内部更新。我们还尝试使用三星Galaxy A51进行测试,但在那台设备上它可以正常工作。

这也发生在三星S22 Ultra上。之前它是可以工作的,但突然就停止了。看起来Google的ML Kit不太可靠。 - Vinoth K
@VinothK 它在三星 Galaxy A51 上也不再起作用了。 我们决定重构我们的自定义条形码扫描 Capacitor 插件,改用 com.google.mlkit:barcode-scanning:17.1.0。 更多信息请查看此处。 这需要更多的努力,因为您必须自己实现 UI 并且漂亮的扫描动画已经消失,但它完美地工作并且比我在帖子中提到的那个更快。 - fruityloops
@SweetyBertilla 我们的解决方案是重构使用 com.google.mlkit:barcode-scanning:17.1.0 - fruityloops
@fruityloops,但这与Google代码扫描器不同,我们需要启动相机,而这将直接为我们启动相机...当它工作时,Google代码扫描器速度更快。 - Sweety Bertilla
今天同样的问题出现了。在一部三星Galaxy M21手机上。 - undefined
显示剩余2条评论
2个回答

0

对我而言解决方案是从"Google play services"中移除更新

故事背景:昨天我使用在GitHub上的一个存在的项目测试库,一切都很正常。

今天我尝试直接从一个新的项目中使用此库(感谢我昨天用过的那个仓库,“com.google.android.gms:play-services-code-scanner”),但是出现了你所发布的错误,我找不到解决方案(三星S20 Ultra),于是想到了一个类似的“android webview”的错误,这使得许多应用程序无法使用,解决方案是删除所有更新,然后一切都正常工作,所以我尝试着将同样的方法应用到“Google play services”,结果现在相机可以正常打开了。

希望我的解决方案能够帮助你,虽然我认为它不够干净,但对终端用户来说还算可行。


这在理论上可能可行,但最终用户的设备无论如何都会自动更新。我认为,最好重构使用 com.google.mlkit:barcode-scanning:17.1.0 - fruityloops

0

我遇到了类似的问题,因为重用了GmsBarcodeScanner。大多数情况下,它可以正常运行。但有时会突然停止工作,这时只能将手机恢复到出厂设置。

旧代码重用了GmsBarcodeScanner

class HomeFragment : Fragment() {
    private var mQRScanner : GmsBarcodeScanner?           = null
    private var mQrCode    : String?                      = null
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val options = GmsBarcodeScannerOptions.Builder()
            .setBarcodeFormats( Barcode.FORMAT_QR_CODE )
            .build()
        mQRScanner = GmsBarcodeScanning.getClient(requireContext(), options)
        
        binding.bnQrCode.setOnClickListener{
            mQRScanner?.startScan()
                ?.addOnSuccessListener { barcode ->
                    mQrCode = barcode.rawValue                    
                }
        }
    }
}

新代码:

class HomeFragment : Fragment() {
    private var mQrCode    : String?                      = null
    
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        binding.bnQrCode.setOnClickListener{
            val options = GmsBarcodeScannerOptions.Builder()
                .setBarcodeFormats( Barcode.FORMAT_QR_CODE )
                .build()
            val QRScanner = GmsBarcodeScanning.getClient( requireContext(), options )

            QRScanner.startScan()
                .addOnSuccessListener { barcode ->
                    mQrCode = barcode.rawValue
                }                
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接