Android中打开坐标时「仅一次」与「始终询问」弹窗的实现及对应API咨询
Android中打开坐标时「仅一次」与「始终询问」弹窗的实现及对应API咨询
嗨,你提到的这个带「仅一次/始终」选项的应用选择弹窗,其实是Android系统自带的隐式Intent解析行为,完全不需要调用额外的API来实现——当你发起一个能被多个应用处理的隐式Intent时,系统会自动扫描手机上所有注册了对应Intent Filter的应用,然后弹出这个选择器让用户决定用哪个应用打开,还能设置默认打开方式。
你之前的代码是直接指定了Waze的专属URI,所以只会唤起Waze,不会触发系统选择器。想要实现你要的效果,只需要改成构造通用的地理坐标隐式Intent就行,我给你调整后的代码示例:
fun startNavigation() { val data = intent.getSerializableExtra(CheckInStartActivity.KEY_DATA) as Data val location = data.location as Location val latitude = location.lat val longitude = location.lng // 构造Android标准的地理坐标URI,支持所有地图/导航类应用解析 val geoUri = Uri.parse("geo:$latitude,$longitude?q=$latitude,$longitude") val mapIntent = Intent(Intent.ACTION_VIEW, geoUri) // 两种启动方式可选: // 1. 直接启动:如果用户没设默认应用,系统自动弹出选择器;有默认则直接打开默认应用 // startActivity(mapIntent) // 2. 强制弹出选择器:哪怕用户已经设了默认应用,也会弹出选择界面 val chooserIntent = Intent.createChooser(mapIntent, "选择导航应用") startActivity(chooserIntent) }
这里给你拆解下关键逻辑:
- 用
geo:协议的URI是Android官方定义的地理坐标Intent标准,像Google Maps、高德地图、百度地图、Waze这类应用都会注册对应的Intent Filter,所以系统会自动把它们都列在选择器里。 - 如果用
Intent.createChooser(),可以强制唤起选择器(不管用户有没有设置默认应用);如果直接调用startActivity(mapIntent),只有当没有默认应用时才会弹出选择器,有默认的话就直接打开默认应用。 - 原生的「仅一次/始终」选项是系统层面提供的,咱们开发者没法修改这个弹窗的UI样式,只能依赖系统的默认行为;如果需要自定义选择逻辑或UI,才需要自己实现弹窗,但那样就没有系统自带的「始终」记忆功能了。
备注:内容来源于stack exchange,提问作者Adam Varhegyi
相关产品推荐
相关产品推荐

