Kotlin开发点击按钮启动Google Maps应用崩溃问题排查
你的XML布局不存在会直接触发点击崩溃的问题,崩溃基本由以下几个常见原因导致,逐个修复即可:
未适配Android 11+包可见性规则
如果项目targetSdkVersion>= 30,系统默认禁止应用查询其他已安装的第三方应用信息,你代码里的resolveActivity()会无法识别到已安装的Google Maps,甚至触发安全异常。需要在AndroidManifest.xml的<manifest>节点下(和<application>节点平级)添加如下查询声明:<queries> <package android:name="com.google.android.apps.maps" /> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="google.navigation" /> </intent> </queries>findViewById调用顺序错误触发空指针
必须在Activity的onCreate生命周期中先调用setContentView()加载对应XML布局,再执行findViewById绑定控件。如果顺序写反,launch_button会返回null,调用setOnClickListener时直接触发空指针崩溃。
修正后的Kotlin代码参考:class Navigation : AppCompatActivity() { private lateinit var launchButton: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 先加载布局,注意替换成你自己的布局文件名 setContentView(R.layout.activity_navigation) // 再绑定控件 launchButton = findViewById(R.id.button1) launchButton.setOnClickListener { val mapIntent = Intent( Intent.ACTION_VIEW, Uri.parse("google.navigation:q=22.659239,88.435534&mode=1") ).apply { setPackage("com.google.android.apps.maps") } // 加异常兜底,避免极端场景崩溃 runCatching { if (mapIntent.resolveActivity(packageManager) != null) { startActivity(mapIntent) } else { // 可自行替换为弹窗提示,告知用户未安装Google Maps Toast.makeText(this, "请先安装Google Maps", Toast.LENGTH_SHORT).show() } }.onFailure { Toast.makeText(this, "启动导航失败", Toast.LENGTH_SHORT).show() } } } }补充说明
你使用的导航URI格式是正确的,纬度在前、经度在后,mode=1对应步行导航模式,没有语法问题。XML里RelativeLayout下的android:orientation="vertical"是无效属性(RelativeLayout本身不支持orientation配置),但不会引发崩溃,可以直接删除。
如果是进入页面就崩溃(不是点击按钮时才崩),需要检查是否在Manifest里配置了Google Maps的API Key,以及是否在模块级build.gradle中引入了Google Maps SDK依赖。
内容的提问来源于stack exchange,提问作者kimski

