Android端Uber Deeplink与通用URL触发应用白屏挂起问题求助
Android调用Uber Deeplink/通用URL时应用卡白屏的问题分析与排查建议
我在Android平台集成Uber Deeplink和通用URL时遇到了一个棘手的问题——调用后Uber应用会卡在白屏状态,按下返回键只能回到我的调用页面。下面是我尝试过的两种解决方案,以及关键的现象细节:
尝试过的两种实现方式
方法1:使用Uber官方SDK构建Deeplink
我基于Uber官方SDK构建了请求Deeplink,尝试了两种触发方式:直接调用SDK的execute()方法,以及通过ACTION_VIEW Intent跳转:
SessionConfiguration config = new SessionConfiguration.Builder() .setClientId(<client-id>) .setClientSecret(<client-secret>) .setServerToken(<server-token>) .build(); Location location = Singleton.getInstance(context).getOneTimeLocation().getLocation(); RideParameters rideParams = new RideParameters.Builder() .setPickupLocation(location.getLatitude(), location.getLongitude(), "Your", "Your") .setDropoffLocation(latitude, longitude, address, "") .build(); RideRequestDeeplink deeplink = new RideRequestDeeplink.Builder(context) .setSessionConfiguration(config) .setFallback(Deeplink.Fallback.MOBILE_WEB) .setRideParameters(rideParams) .build(); // 尝试过直接调用deeplink.execute() try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(deeplink.getUri()); ((BaseActivity) context).startActivity(intent, null, false); } catch (Exception e) { }
说明:两种触发方式都导致Uber卡白屏,没有区别。
方法2:手动拼接通用URL
我也尝试了手动拼接Uber的通用Web URL,然后在浏览器中打开:
String baseUrl = "https://m.uber.com/ul/?action=setPickup&"; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(baseUrl); stringBuilder.append("client_id=").append(<client-id>).append("&"); stringBuilder.append("pickup[latitude]=").append(location.getLatitude()).append("&"); stringBuilder.append("pickup[longitude]=").append(location.getLongitude()).append("&"); stringBuilder.append("dropoff[latitude]=").append(latitude).append("&"); stringBuilder.append("dropoff[longitude]=").append(longitude).append("&"); stringBuilder.append("dropoff[formatted_address]=").append(address); // 在浏览器中打开该URL,结果同样卡白屏
关键现象细节
两种方法的结果一致,但方法2中发现了一个特殊的触发条件:
- 当系统弹出“使用Chrome或Uber打开链接”的选择框时,选择仅此一次用Uber打开,就能正常加载请求数据;
- 但如果选择始终用Uber打开后,后续所有调用都会导致Uber卡在白屏;
- 此时如果按下Home键回到桌面,再从后台重新唤起Uber应用,它又能正常加载之前传入的请求数据。
针对性的排查建议
结合这个特殊现象,我整理了几个可能的排查方向:
- 调整Intent启动Flags
Uber的任务栈可能因为启动模式异常导致无法正常初始化。尝试给Intent添加以下Flags,确保Uber能以正确的任务栈方式启动:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(deeplink.getUri()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); ((BaseActivity) context).startActivity(intent, null, false);
- 检查URL参数编码
方法2中手动拼接的dropoff[formatted_address]参数如果包含空格、特殊字符(比如中文、标点),没有做URL编码的话会导致Uber解析失败。建议对地址参数做编码处理:
stringBuilder.append("dropoff[formatted_address]=").append(URLEncoder.encode(address, "UTF-8"));
清理Uber应用缓存或更新版本
这种白屏挂起的情况可能和Uber应用的缓存冲突有关,建议测试时先清除Uber的应用缓存,或者更新到最新版本再重试。调整SDK的Fallback设置
方法1中设置了Fallback.MOBILE_WEB,可以尝试移除这个设置,或者测试仅用原生Deeplink跳转的情况,排除Web fallback的干扰。排查应用任务栈配置
检查你的应用中启动跳转的Activity是否设置了特殊的启动模式(比如singleTask、singleInstance),这可能会干扰Uber应用的任务栈初始化,导致无法正常加载。
内容的提问来源于stack exchange,提问作者saurabh dhillon
相关产品推荐
相关产品推荐

