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

Android集成Google Cloud Navigation SDK遇NullPointerException问题求助

Google Cloud Navigation SDK: NavigationTransactionRecorder.pickup() 触发NullPointerException

从错误日志可以明确看出,transactionRecorder实例本身为null,并非传入的waypoint或交易ID参数为空——日志里的错误信息是“Attempt to invoke virtual method ... on a null object reference”,指向的是调用pickup()的对象为null。

以下是具体排查和解决步骤:

1. 确认Navigation SDK已完成初始化

NavigationApi.getTransactionRecorder()返回null最常见的原因是SDK未完成初始化。你需要在Application的onCreate()方法中先初始化SDK,且必须在获取transactionRecorder之前执行:

public class YourApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 替换为你的Google Cloud API Key
        String apiKey = "YOUR_VALID_API_KEY";
        NavigationApi.initialize(this, apiKey);
    }
}

同时要确保YourApplication已在AndroidManifest.xml中注册:

<application
    android:name=".YourApplication"
    ...>
    ...
</application>

2. 检查API Key的权限与配置

  • 登录Google Cloud控制台,确认你的API Key已启用Google Maps Navigation SDK for Android服务。
  • 验证API Key的限制条件:确保包名、SHA-1指纹与你的项目完全匹配,无拼写错误。

3. 验证依赖配置正确性

检查app模块的build.gradle(或build.gradle.kts)中是否引入了正确的Navigation SDK依赖,且版本为官方最新稳定版:

dependencies {
    implementation 'com.google.android.libraries.navigation:navigation:2.14.0' // 替换为最新版本
}

避免依赖冲突,可通过./gradlew app:dependencies命令检查是否有重复或冲突的依赖项。

4. 确保上下文有效且初始化时机正确

  • 不要在Activity的onCreate()之前(比如静态代码块、构造方法)获取transactionRecorder,此时Application可能还未完成初始化。
  • 建议在Activity的onCreate()方法中初始化transactionRecorder,并添加非空判断避免崩溃:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    pickUpButton = findViewById(R.id.pick_up_button);
    // 在Activity初始化时获取实例
    NavigationTransactionRecorder transactionRecorder = NavigationApi.getTransactionRecorder(getApplication());

    pickUpButton.setOnClickListener(v -> {
        Waypoint waypoint = Waypoint.builder()
                .setLatLng(51.434110, -0.139030)
                .setPreferSameSideOfRoad(true)
                .setTitle("pickup waypoint")
                .build();

        if (transactionRecorder != null) {
            try {
                transactionRecorder.pickup(
                        waypoint,
                        Arrays.asList(NavigationTransactionRecorder.generateTransactionId())
                );
            } catch (NavigationTransactionRecorder.TransactionException e) {
                Log.e("NavigationError", "Transaction failed", e);
            }
        } else {
            Log.e("NavigationError", "TransactionRecorder is null - check SDK initialization");
        }
    });
}

总结

问题核心是NavigationTransactionRecorder实例未被正确初始化(返回null),与传入的参数无关。按照上述步骤逐一排查初始化流程、API Key配置、依赖版本这几个关键点,即可解决该NullPointerException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:43:17