Unact / yandex_mapkit

Flutter implementation of YandexMapkit
MIT License
132 stars 151 forks source link

Fatal Exception: java.lang.AssertionError: setApiKey() should be called before initialize()! #320

Closed vyurking closed 5 months ago

vyurking commented 10 months ago

На андроидах иногда ловлю ошибку, что ключ или устанавливается несколько раз или как-то вызывается инициализация несколько раз, Решил форкнуть пакет и сделать установку ключа перед MapKitFactory.initialize в файле YandexMapkitPlugin, а не в MainActivity, но при старте приложения все равно ловлю setApiKey несколько раз. Скрин вывода "принтом" в консоль установки ключа, на котором видно, что приложение устанавливает его несколько раз. Снимок экрана 2023-07-05 в 15 21 53

Честно, не понимаю в чем проблема :C

Вот так устанавливаю ключ:


  private boolean mapinit = false;

  private void initMap(FlutterPluginBinding binding) {
    if (mapinit) {
      return;
    }
    MapKitFactory.setApiKey("КЛЮЧ");
    MapKitFactory.setLocale("ru_RU");
    MapKitFactory.initialize(binding.getApplicationContext());
    mapinit = true;
  }

  @Override
  public void onAttachedToEngine(FlutterPluginBinding binding) {
    initMap(binding);
    BinaryMessenger messenger = binding.getBinaryMessenger();
    binding.getPlatformViewRegistry().registerViewFactory(VIEW_TYPE, new YandexMapFactory(messenger, new LifecycleProvider()));

    setupChannels(messenger, binding.getApplicationContext());
  }
DCrow commented 10 months ago

Добрый день!

Инициализировать можно только в MainActivity, как указано в readme.

Пожалуйста приложите flutter doctor -v и список используемых плагинов. Также подскажите, проект используется как "Add-to-app" или же обычное флаттер приложение?

vyurking commented 10 months ago

Добрый день, у меня обычное flutter приложение. Делал, как указано в Readme, но ловил точно такую же ошибку(

Вот flutter doctor -v:

[✓] Flutter (Channel stable, 3.10.2, on macOS 13.4 22F66 darwin-arm64, locale ru-RU)
    • Flutter version 3.10.2 on channel stable at /Users/vsevolodurkin/development/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 9cd3d0d9ff (7 недель назад), 2023-05-23 20:57:28 -0700
    • Engine revision 90fa3ae28f
    • Dart version 3.0.2
    • DevTools version 2.23.1

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    • Android SDK at /Users/vsevolodurkin/Library/Android/sdk
    • Platform android-34, build-tools 34.0.0
    • Java binary at: /Users/vsevolodurkin/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/223.8836.35.2231.10320515/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 14E300c
    • CocoaPods version 1.11.3

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2022.3)
    • Android Studio at /Users/vsevolodurkin/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/223.8836.35.2231.10320515/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)

[✓] VS Code (version 1.80.0)

А вот список плагинов (здесь Ваш пакет форкнут):

  battery_plus: 3.0.6
  bloc: 8.1.2
  bloc_concurrency: 0.2.2
  #convert: ^3.1.1
  cupertino_icons: ^1.0.2
  #dart_des: ^1.0.2
  device_info_plus: 9.0.2
  encrypt: 5.0.1
  equatable: 2.0.5
  #flutter_3des: ^0.0.4
  firebase_core: ^2.13.1
  firebase_crashlytics: ^3.3.2
  firebase_performance: ^0.9.2+2
  flutter_bloc: 8.1.3
  #flutter_des: ^2.1.0
  flutter_local_notifications: 9.5.3+1
  flutter_map: ^4.0.0
  flutter_map_marker_cluster: ^1.1.1
  flutter_simple_dependency_injection: 2.0.0
  flutter_slidable: 3.0.0
  flutter_statusbarcolor_ns: 0.5.0
  flutter_svg: any
  grpc: 3.1.0
  html: ^0.15.0
  intl: ^0.17.0
  latlong2: 0.8.1
  mask_text_input_formatter: 2.4.0
  material_color_utilities: 0.2.0
  package_info_plus: ^4.0.2
  path_provider: 2.0.15
  plugin_platform_interface: 2.1.4
  provider: 6.0.5
  qr_code_scanner: 1.0.1
  safe_device: ^1.1.4
  share_plus: 7.0.2
  shared_preferences: ^2.1.1
  simple_json_persistence: 2.1.0+2
  #tripledes_nullsafety: ^1.0.3
  url_launcher: 6.1.11
  uuid: 3.0.7
  vector_graphics: ^1.1.6
  vector_graphics_compiler: ^1.1.6
  #yandex_mapkit: 3.2.0
  yandex_mapkit:
    path: ./yandex_mapkit
pamir72 commented 10 months ago

Вот как написано у Яндекса в комментариях к примеру инициализации:

/**

И, кстати, в официальном mapkit-android-demo ключ инициализируются так же в в Application.onCreate

@Override
public void onCreate() {
    super.onCreate();
    // Set the api key before calling initialize on MapKitFactory.
    MapKitFactory.setApiKey(MAPKIT_API_KEY);
}

Возникает вопрос, каким образом корректно во flutter можно инициализировать ключ в Application.onCreate или еще как-то до MainActivity ?

DCrow commented 10 months ago

@vyurking Не получается воспроизвести, что onAttachedToEngine, что configureFlutterEngine всегда вызываются один раз.

Подскажите, на эмуляторе воспроизводится такое? и какая версия gradle используется?

vyurking commented 10 months ago

@DCrow на данный момент у меня тоже не получается воспроизвести, мне кажется что старый ключ где-то в кэше карты (возможно) Версия градла: gradle-7.3.3

UDP: Ошибка ловится, но в соотношение запусков 1:100+ На эмуляторе не пробовал

pamir72 commented 10 months ago

Склонировал yandex_maprit и вставил initMap в onAttachedToEngine на своем проекте.

private void initMap(FlutterPluginBinding binding) { if (mapinit) { return; } System.out.println("InitMap"); mapinit = true; MapKitFactory.setApiKey("XXXXXXX"); MapKitFactory.initialize(binding.getApplicationContext()); }

Вот такой лог получаю (жирным выделен вызов InitMap - в моем случае 2 раза (!) и потом эксепшн. Судя по всему, проблему двойного вызова тут создает Firebase:

2023-07-14 09:53:43.885 32467-32467 System.out ru.serviopump.spmobile I InitMap 2023-07-14 09:53:45.025 32467-32467 FlutterGeolocator ru.serviopump.spmobile D Initializing Geolocator services 2023-07-14 09:53:46.841 0-0 init kernel I Untracked pid 32456 received signal 1 2023-07-14 09:53:48.496 32467-32539 FirebaseApp ru.serviopump.spmobile I Device unlocked: initializing all Firebase APIs for app [DEFAULT] 2023-07-14 09:53:48.932 32467-32467 FlutterJNI ru.serviopump.spmobile W FlutterJNI.init called more than once 2023-07-14 09:53:48.982 32467-32467 System.out ru.serviopump.spmobile I InitMap 2023-07-14 09:53:48.984 32467-32467 GeneratedP...nsRegister ru.serviopump.spmobile E Received exception while registering

pamir72 commented 10 months ago

А теперь провел эксперимент с Вашим примером из yandex_mapkit (без лишних плагинов и т.д.):

Ключ устанавливаю в MainActivity. В onAttachedToEngine просто вывожу строку "initMap".

@Override public void onAttachedToEngine(FlutterPluginBinding binding) { System.out.println("InitMap");
MapKitFactory.initialize(binding.getApplicationContext()); BinaryMessenger messenger = binding.getBinaryMessenger(); binding.getPlatformViewRegistry().registerViewFactory(VIEW_TYPE, new YandexMapFactory(messenger, new LifecycleProvider())); setupChannels(messenger, binding.getApplicationContext()); }

Каждый нечетный запуск все ок. "initMap" показывается 1 раз, карты работают ок! Лог ниже:

2023-07-14 10:51:31.501 5911-5911 EGL_emulation pid-5911 D eglCreateContext: 0xebbea1d0: maj 3 min 0 rcv 3 2023-07-14 10:51:31.511 5911-5942 HostConnection pid-5911 D HostConnection::get() New Host Connection established 0xebbe9f30, tid 5942 2023-07-14 10:51:31.540 5911-5942 HostConnection pid-5911 D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_YUV_Cache ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_sync_buffer_data ANDROID_EMU_read_color_buffer_dma GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 2023-07-14 10:51:31.543 5911-5942 EGL_emulation pid-5911 D eglMakeCurrent: 0xebbea1d0: ver 3 0 (tinfo 0xb90804b0) (first time) 2023-07-14 10:51:31.592 5911-5911 System.out pid-5911 I InitMap 2023-07-14 10:51:31.861 5911-5951 flutter pid-5911 I The Dart VM service is listening on http://127.0.0.1:46645/nydZ2-gvsnI=/ 2023-07-14 10:51:32.017 5911-5911 yandex.maps pid-5911 W t6c8XyOLWgTnpOP9OqRR: Locale is already set. Ignored. 2023-07-14 10:51:32.018 5911-5911 yandex.maps pid-5911 W aenAWaCiPaULDXYndbnK: API key is already set. Ignored.

Каждый четный запуск (после выхода по кнопке Back) "initMap" не показывается вообще и сразу вылетает эксепшн пhо setApiKey(). Лог ниже:

2023-07-14 10:48:07.201 5768-5857 HostConnection pid-5768 D HostConnection::get() New Host Connection established 0xebbfed70, tid 5857 2023-07-14 10:48:07.209 5768-5857 HostConnection pid-5768 D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_YUV_Cache ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_sync_buffer_data ANDROID_EMU_read_color_buffer_dma GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 2023-07-14 10:48:07.210 5768-5857 EGL_emulation pid-5768 D eglMakeCurrent: 0xab280710: ver 3 0 (tinfo 0xae8be410) (first time) 2023-07-14 10:48:07.238 5768-5768 AndroidRuntime pid-5768 D Shutting down VM 2023-07-14 10:48:07.239 5768-5768 AndroidRuntime pid-5768 E FATAL EXCEPTION: main Process: com.unact.yandexmapkitexample, PID: 5768 java.lang.AssertionError: setApiKey() should be called before initialize()! at com.yandex.mapkit.MapKitFactory.setApiKey(MapKitFactory.java:36) at com.unact.yandexmapkitexample.MainActivity.configureFlutterEngine(MainActivity.java:13) at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:214) at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:641) at android.app.Activity.performCreate(Activity.java:7994) at android.app.Activity.performCreate(Activity.java:7978) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2023-07-14 10:48:07.245 558-8410 ActivityTaskManager pid-558 W Force finishing activity com.unact.yandexmapkitexample/.MainActivity 2023-07-14 10:48:07.252 318-359 goldfish-address-space pid-318 D claimShared: Ask to claim region [0x3fb997000 0x3fbd1b000] 2023-07-14 10:48:07.257 558-5858 DropBoxManagerService pid-558 I add tag=data_app_crash

pamir72 commented 10 months ago

Тот же пример из yandex_mapkit - убрал setApiKey из MainActivity и вставил в onAttachedToEngine:

private void initMap(FlutterPluginBinding binding) { if (mapinit) { return; } mapinit = true; System.out.println("InitMap"); MapKitFactory.setApiKey("XXX"); MapKitFactory.initialize(binding.getApplicationContext()); }

@Override
public void onAttachedToEngine(FlutterPluginBinding binding) {
    System.out.println("** onAttachedToEngine **");
    initMap(binding);
    BinaryMessenger messenger = binding.getBinaryMessenger();
    binding.getPlatformViewRegistry().registerViewFactory(VIEW_TYPE, new YandexMapFactory(messenger, new LifecycleProvider()));
    setupChannels(messenger, binding.getApplicationContext());
}

Нечетный запуск прошел, как и ожидалось, штатно - вызвался 1 раз onAttachedToEngine и initMap А вот на четном запуске случилось вот такое:

2023-07-17 09:10:48.230 558-7893 EGL_emulation system_process D eglCreateContext: 0xb26c1820: maj 3 min 0 rcv 3 2023-07-17 09:10:48.231 558-7893 EGL_emulation system_process D eglMakeCurrent: 0xb26c1820: ver 3 0 (tinfo 0xb651d610) (first time) 2023-07-17 09:10:48.237 558-726 HostConnection system_process D HostConnection::get() New Host Connection established 0xebbf4810, tid 726 2023-07-17 09:10:48.252 18756-19170 HostConnection com.unact.yandexmapkitexample D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_YUV_Cache ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_sync_buffer_data ANDROID_EMU_read_color_buffer_dma GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 2023-07-17 09:10:48.252 18756-19170 EGL_emulation com.unact.yandexmapkitexample D eglMakeCurrent: 0xab347f60: ver 3 0 (tinfo 0xb83febb0) (first time) 2023-07-17 09:10:48.274 18756-18756 System.out com.unact.yandexmapkitexample I onAttachedToEngine 2023-07-17 09:10:48.275 18756-18756 System.out com.unact.yandexmapkitexample I InitMap 2023-07-17 09:10:48.276 18756-18756 GeneratedP...nsRegister com.unact.yandexmapkitexample E Tried to automatically register plugins with FlutterEngine (io.flutter.embedding.engine.FlutterEngine@d39529c) but could not find or invoke the GeneratedPluginRegistrant. 2023-07-17 09:10:48.280 18756-18756 GeneratedP...nsRegister com.unact.yandexmapkitexample E Received exception while registering java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister.registerGeneratedPlugins(GeneratedPluginRegister.java:80) at io.flutter.embedding.android.FlutterActivity.configureFlutterEngine(FlutterActivity.java:1302) at com.unact.yandexmapkitexample.MainActivity.configureFlutterEngine(MainActivity.java:14) at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:214) at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:641) at android.app.Activity.performCreate(Activity.java:7994) at android.app.Activity.performCreate(Activity.java:7978) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.AssertionError: setApiKey() should be called before initialize()! at com.yandex.mapkit.MapKitFactory.setApiKey(MapKitFactory.java:36) at com.unact.yandexmapkit.YandexMapkitPlugin.initMap(YandexMapkitPlugin.java:46) at com.unact.yandexmapkit.YandexMapkitPlugin.onAttachedToEngine(YandexMapkitPlugin.java:55) at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.add(FlutterEngineConnectionRegistry.java:146) at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:29) at java.lang.reflect.Method.invoke(Native Method)  at io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister.registerGeneratedPlugins(GeneratedPluginRegister.java:80)  at io.flutter.embedding.android.FlutterActivity.configureFlutterEngine(FlutterActivity.java:1302)  at com.unact.yandexmapkitexample.MainActivity.configureFlutterEngine(MainActivity.java:14)  at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:214)  at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:641)  at android.app.Activity.performCreate(Activity.java:7994)  at android.app.Activity.performCreate(Activity.java:7978)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:223)  at android.app.ActivityThread.main(ActivityThread.java:7656)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)  2023-07-17 09:10:48.284 558-726 HostConnection system_process D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_YUV_Cache ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_sync_buffer_data ANDROID_EMU_read_color_buffer_dma GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 2023-07-17 09:10:48.323 18756-18756 FlutterAct...ntDelegate com.unact.yandexmapkitexample W A splash screen was provided to Flutter, but this is deprecated. See flutter.dev/go/android-splash-migration for migration steps. 2023-07-17 09:10:48.452 318-318 goldfish-address-space and...raphics.allocator@3.0-service D claimShared: Ask to claim regio

pamir72 commented 10 months ago

И еще вдруг обнаружил странную странность: Вообще закомментировал вызов MapKitFactory.Initializeв в Вашем примере, выкинул приложение из памяти и... у меня прекрасно и без этого запустились карты как будто initialize вызвался еще откуда-то !

private void initMap(FlutterPluginBinding binding) {
    if (mapinit) {
        return;
    }
    mapinit = true;
    System.out.println("InitMap");
    MapKitFactory.setApiKey("XXX");
    //MapKitFactory.initialize(binding.getApplicationContext());
}

Из странностей 1го запуска выделю вот это :

t6c8XyOLWgTnpOP9OqRR: Locale is already set. Ignored. 2023-07-18 14:28:28.474 3418-3418 yandex.maps com.unact.yandexmapkitexample W aenAWaCiPaULDXYndbnK: API key is already set. Ignored. 2023-07-18 14:28:28.485 3418-3418 yandex.maps com.unact.yandexmapkitexample W t6c8XyOLWgTnpOP9OqRR: Locale is already set. Ignored. 2023-07-18 14:28:28.485 3418-3418 yandex.maps com.unact.yandexmapkitexample W aenAWaCiPaULDXYndbnK: API key is already set. Ignored. 2023-07-18 14:28:28.495 3418-3418 yandex.maps com.unact.yandexmapkitexample W t6c8XyOLWgTnpOP9OqRR: Locale is already set. Ignored. 2023-07-18 14:28:28.496 3418-3418 yandex.maps com.unact.yandexmapkitexample W aenAWaCiPaULDXYndbnK: API key is already set. Ignored. 2023-0

Второй запуск (после выхода по Back) выдал ексепшн, как предыдущем моем посте:

2023-07-17 10:39:54.041 28119-28119 GeneratedP...nsRegister com.unact.yandexmapkitexample E Tried to automatically register plugins with FlutterEngine (io.flutter.embedding.engine.FlutterEngine@a427f22) but could not find or invoke the GeneratedPluginRegistrant. 2023-07-17 10:39:54.056 28119-28119 GeneratedP...nsRegister com.unact.yandexmapkitexample E Received exception while registering java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at

Честно говоря, не знаю, что думать ?

dumptyhumpty2014gmail commented 9 months ago

Судя по нашей ошибке. MainActivity в какой-то момент пересоздается (или создается первый раз при запуске), но карта на тот момент уже считается инициализирована почему-то. Каким костылем это обойти, не понятно... Fatal Exception: java.lang.AssertionError: setApiKey() should be called before initialize()! at com.yandex.mapkit.MapKitFactory.setApiKey(MapKitFactory.java:36) at ru.goldapple.courier.MainActivity.initMap(MainActivity.java:49) at ru.goldapple.courier.MainActivity.configureFlutterEngine(MainActivity.java:58) at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:214) at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:641) at android.app.Activity.performCreate(Activity.java:7144) at android.app.Activity.performCreate(Activity.java:7135) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6718) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

AlexSmirnov9107 commented 8 months ago

i got temporary solution. it works for me

solution

perfperm commented 8 months ago

Получилось найти решение?

Столкнулся с такой же проблемой, причем воспроизводится только при открытии через deeplink

https://github.com/Unact/yandex_mapkit/issues/321#issuecomment-1698622003 из коммента выше помогает, но всё равно работает не корректно - сначала приложение крашится, а после запускается заново :/

pamir72 commented 8 months ago

У меня работают оба и не крешатся. https://github.com/Unact/yandex_mapkit/issues/321#issuecomment-1713832735

dumptyhumpty2014gmail commented 8 months ago

Мы пока отложили вопрос. У нас это не критично. Просто раздражает в фаербейзе ошибка. try catch даже не помогает. и в OnCreate не помогает, ибо ощущение, что активити пересоздается. Но стабильно воспроизвести не получалось, поэтому пока висит в бэклоге.

TerasKatt commented 8 months ago

Всем привет! На нашем проекте мы также столкнулись с данной ошибкой. У нас она чаще всего приходила с Huawei/Xiaomi девайсов. Нам удалось воспроизвести эту ошибку с помощью опции don't keep activites: она происходила при сворачивании-разворачивании приложения с этой включенной опцией. Возможно у вас также получится ее затригерить таким образом.

UPD: по-моему вот таким образом и мы починили это https://github.com/Unact/yandex_mapkit/issues/321#issuecomment-1700820245

perfperm commented 8 months ago

Всем спасибо

Получилось так же и вторым способом, но проблема с "перезапуском" так и осталась. Пока тоже так оставлю, не критично (главное что открывает)

DCrow commented 5 months ago

Огромное спасибо @TerasKatt, с этой опцией стабильно воспроизводилось.

Для избавления от ошибки надо инициализировать приложение следующим образом:

Создать класс MainApplication(или использовать свой если есть кастомный класс типа Application)

import android.app.Application;

import com.yandex.mapkit.MapKitFactory;

public class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MapKitFactory.setLocale("YOUR_LOCALE"); // Your preferred language. Not required, defaults to system language
        MapKitFactory.setApiKey("YOUR_API_KEY"); // Your generated API key
    }
}

После этого изменить в AndroidManifest.xml android:name="${applicationName}" на android:name=".MainApplication"

Также убрать код, который в README, надо было указывать в MainActivity.