flutter_tts 初始化时崩溃:java.lang.NoSuchMethodError:android.speech.tts.TextToSpeech.getDefaultVoice

问题描述 投票:0回答:1

在我的 flutter 应用程序中,我使用 flutter_tts 4.0.2 包。 我尝试在旧手机(搭载 Android 4.4.4 的 Sony Xperia E4g E2033)上调试我的应用程序。 不幸的是,应用程序在启动时崩溃并出现以下错误。

√  Built build\app\outputs\flutter-apk\app-dev-debug.apk.
W/FlutterEngineCxnRegstry(14000): Attempted to register plugin (io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin@4287be40) but it was already registered with this FlutterEngine (io.flutter.embedding.engine.FlutterEngine@426d0500).
E/AndroidRuntime(14000): FATAL EXCEPTION: main
E/AndroidRuntime(14000): Process: meihouwang.chinese_decoder.dev.dev, PID: 14000
E/AndroidRuntime(14000): java.lang.NoSuchMethodError: android.speech.tts.TextToSpeech.getDefaultVoice
E/AndroidRuntime(14000):    at com.tundralabs.fluttertts.FlutterTtsPlugin.firstTimeOnInitListener$lambda$5(FlutterTtsPlugin.kt:234)
E/AndroidRuntime(14000):    at com.tundralabs.fluttertts.FlutterTtsPlugin.$r8$lambda$KxrDwWtOaRLTbUOlm0Ru9-56Ri8(FlutterTtsPlugin.kt)
E/AndroidRuntime(14000):    at com.tundralabs.fluttertts.FlutterTtsPlugin$$ExternalSyntheticLambda0.onInit(D8$$SyntheticClass)
E/AndroidRuntime(14000):    at android.speech.tts.TextToSpeech.dispatchOnInit(TextToSpeech.java:701)
E/AndroidRuntime(14000):    at android.speech.tts.TextToSpeech.access$1400(TextToSpeech.java:58)
E/AndroidRuntime(14000):    at android.speech.tts.TextToSpeech$Connection$SetupConnectionAsyncTask.onPostExecute(TextToSpeech.java:1509)
E/AndroidRuntime(14000):    at android.speech.tts.TextToSpeech$Connection$SetupConnectionAsyncTask.onPostExecute(TextToSpeech.java:1471)
E/AndroidRuntime(14000):    at android.os.AsyncTask.finish(AsyncTask.java:632)
E/AndroidRuntime(14000):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
E/AndroidRuntime(14000):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
E/AndroidRuntime(14000):    at android.os.Handler.dispatchMessage(Handler.java:110)
E/AndroidRuntime(14000):    at android.os.Looper.loop(Looper.java:193)
E/AndroidRuntime(14000):    at android.app.ActivityThread.main(ActivityThread.java:5486)
E/AndroidRuntime(14000):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(14000):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(14000):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
E/AndroidRuntime(14000):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
E/AndroidRuntime(14000):    at dalvik.system.NativeStart.main(Native Method)

我知道 android 4.4.4 上没有可用的 tts,因此在初始化 FlutterTts 之前,我使用以下代码来防止在不兼容的操作系统上初始化

      var androidInfo = await
      DeviceInfoPlugin().androidInfo;
      var sdkInt = androidInfo.version.sdkInt;
      // Text to speech only available in Lolipop
      if(sdkInt < 21){
        _available = false;
        return;
      }
    }

但是当我设置断点时,我在崩溃之前没有到达此代码。因此,即使尚未从应用程序代码中调用,也可能是 flutter 框架加载了该库。

那么我怎样才能防止这种崩溃呢?

android flutter dart text-to-speech
1个回答
0
投票

在调试时我收到以下消息

C:\dev\perso\chinesedecoder\chinese_decoder\android\app\src\debug\AndroidManifest.xml Error:
    uses-sdk:minSdkVersion 19 cannot be smaller than version 21 declared in library 
[:flutter_tts] C:\dev\perso\chinesedecoder\chinese_decoder\build\flutter_tts\intermediates\merged_manifest\debug\AndroidManifest.xml
as the library might be using APIs not available in 19
    Suggestion: use a compatible library with a minSdk of at most 19,
    or increase this project's minSdk version to at least 21,
    or use tools:overrideLibrary="com.tundralabs.fluttertts" 
    to force usage (may lead to runtime failures)

因此,在清单文件中使用

tools:overrideLibrary="com.tundralabs.fluttertts"
导致了无法捕获的异常。
如果 minSdk 小于 21,删除它会阻止应用程序被编译。

所以我想除了放弃对 android 4.4.4 的支持之外我无能为力。无论如何,它已经有 10 年历史了,谷歌去年停止支持这个版本。

© www.soinside.com 2019 - 2024. All rights reserved.