如何实现Android地点搜索APP的链接唤起与指定地点页跳转?
嘿,这个需求其实和Clash Royale的跳转机制原理一致,咱们可以通过Deep Linking(深度链接)或者进阶的App Linking(应用链接)来实现,下面给你一步步拆解实现思路:
首先要在负责展示地点详情的Activity里添加intent-filter,告诉Android系统:这个Activity可以处理咱们指定格式的链接。比如我们自定义一个专属scheme(类似myplaces://),用来标识咱们的应用:
<activity android:name=".ui.PlaceDetailActivity"> <!-- 原有配置保持不变 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 自定义链接规则:匹配 myplaces://detail/place/[地点ID] 格式 --> <data android:scheme="myplaces" android:host="detail" android:pathPattern="/place/.*" /> </intent-filter> </activity>
这里的pathPattern用来匹配带地点ID的路径,比如myplaces://detail/place/123这样的链接,系统就会把它交给PlaceDetailActivity处理。
接下来要在PlaceDetailActivity里读取链接里的地点ID,然后加载对应的详情内容。注意:如果应用已经在后台运行,系统会调用onNewIntent而不是重新创建Activity,所以两个方法都要处理:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_place_detail) // 处理启动时的链接 handleDeepLink(intent) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // 处理后台唤起时的链接 intent?.let { handleDeepLink(it) } } private fun handleDeepLink(intent: Intent) { val uri = intent.data ?: return // 从链接路径里提取地点ID,比如 uri.path 是 "/place/123",取最后一段 val placeId = uri.pathSegments.lastOrNull() placeId?.let { id -> // 这里写你的业务逻辑:根据ID获取地点数据、渲染页面 loadPlaceDetail(id) } ?: run { // 如果ID无效,给用户友好提示 Toast.makeText(this, "无效的地点链接", Toast.LENGTH_SHORT).show() finish() } }
如果是Java项目,逻辑完全一致,只是语法不同,你可以对应转换。
现在你可以在分享按钮的点击事件里,根据当前地点的ID生成对应的链接:
// 假设当前地点ID是 currentPlaceId val shareLink = "myplaces://detail/place/$currentPlaceId" val shareIntent = Intent(Intent.ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_TEXT, "推荐你一个好去处:$shareLink") } startActivity(Intent.createChooser(shareIntent, "分享地点"))
这样用户点击分享后,就能把带地点ID的链接发给好友了。
上面的自定义scheme已经能满足需求,但如果想让用户点击普通的Https链接(比如https://yourdomain.com/place/123)也能直接唤起应用(没装的话跳网页展示地点),就需要配置App Links:
- 先修改Manifest里的
intent-filter,换成Https scheme和你的域名:
<data android:scheme="https" android:host="yourdomain.com" android:pathPattern="/place/.*" />
- 在你的域名服务器上放置一个验证文件:
在域名的.well-known目录下创建assetlinks.json文件,内容如下(替换成你的应用包名和签名SHA256指纹):
[{ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "com.yourcompany.myplaces", "sha256_cert_fingerprints": ["你的应用签名的SHA256指纹"] } }]
你可以通过Android Studio的Gradle > Tasks > android > signingReport查看SHA256指纹,或者用keytool命令生成。
配置完成后,用户点击https://yourdomain.com/place/123时,系统会直接唤起你的应用,没装的话就跳对应的网页地址。
可以用adb命令快速测试链接是否能正常唤起应用:
adb shell am start -W -a android.intent.action.VIEW -d "myplaces://detail/place/123" com.yourcompany.myplaces
内容的提问来源于stack exchange,提问作者A.khaled

