Android集成Google Cloud Navigation SDK遇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
相关产品推荐
相关产品推荐

