You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Target SDK从33升级到34后Yandex MapKit重复启动崩溃问题

问题:升级Target SDK至34后Yandex MapKit重复打开Activity崩溃

将Target SDK从33升级至34后,含地图的Activity出现崩溃。更新MapKit库到最新3.5版本后,首次打开该Activity正常,但再次打开时抛出错误:java.lang.AssertionError: setApiKey() should be called before initialize()

崩溃相关代码片段

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MapKitFactory.setApiKey(getString(R.string.yandex_key));
    MapKitFactory.initialize(this);
    setContentView(R.layout.activity_yandex_map);
}

@Override
protected void onStart() {
    super.onStart();
    mapview.onStart();
    MapKitFactory.getInstance().onStart();
    updateViews();
}

@Override
protected void onStop() {
    super.onStop();
    mapview.onStop();
    MapKitFactory.getInstance().onStop();
    locationManager.removeUpdates(locationListener);
    locationListener = null;
}

堆栈信息

FATAL EXCEPTION: main
java.lang.AssertionError: setApiKey() should be called before initialize()!
at com.yandex.mapkit.MapKitFactory.setApiKey(MapKitFactory.java:35)
at activities.AddressesSearchBoth.onCreate(AddressesSearchBoth.java:101)
at android.app.Activity.performCreate(Activity.java:8975)
at android.app.Activity.performCreate(Activity.java:8944)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4146)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.app.ActivityThread.main(ActivityThread.java:8919)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)

解决方案

问题根源在于MapKit初始化后,第二次调用setApiKey()时,MapKit已处于初始化状态,不允许重复设置API Key。

修改步骤

  • 将MapKitFactory.setApiKey()和MapKitFactory.initialize()移到Application类的onCreate()方法中,确保全局只执行一次初始化,而非在Activity的onCreate()中重复执行。
  • Activity中仅保留MapKitFactory.getInstance().onStart()和onStop()的调用逻辑。

示例:Application类实现

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 全局初始化MapKit,仅执行一次
        MapKitFactory.setApiKey(getString(R.string.yandex_key));
        MapKitFactory.initialize(this);
    }
}

修改后的Activity代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_yandex_map);
}

@Override
protected void onStart() {
    super.onStart();
    mapview.onStart();
    MapKitFactory.getInstance().onStart();
    updateViews();
}

@Override
protected void onStop() {
    super.onStop();
    mapview.onStop();
    MapKitFactory.getInstance().onStop();
    locationManager.removeUpdates(locationListener);
    locationListener = null;
}

说明

MapKit的初始化是全局操作,无需在每个Activity中重复执行。将初始化逻辑放在Application类中,可保证整个应用生命周期内仅调用一次setApiKey()和initialize(),彻底避免重复调用引发的断言错误。

内容的提问来源于stack exchange,提问作者Lax xxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:50:16