Android隐式深度链接:Intent中的null extrass



我想使用导航组件创建一个隐式深度链接。

但当我用以下URL启动我的应用程序时:

https://my-app.com/cars/ef123-aaf33/parts

我得到以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{myapp/screens.car.CarActivity}: java.lang.IllegalStateException: 
Activity screens.car.CarActivity@3b8d354 has null extras in Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=https://my-app.com/... flg=0x13008000 cmp=myapp/screens.car.CarActivity }

intent没有任何额外内容,但它应该包含定义为深度链接中URL占位符的carUuid。一旦评估了navArgs(),就会抛出错误。

这是我的设置:

nav_graph.xml

<fragment
android:id="@+id/fragment_parts"
android:name="myapp.screens.parts.PartsFragment"
android:label="@string/parts"
tools:layout="@layout/fragment_parts">
<deepLink
android:id="@+id/deepLink"
app:uri="my-app.com/cars/{carUuid}/parts" />
<argument
android:name="carUuid"
app:argType="string" />
</fragment>

AndroidManifest

<activity android:name=".screens.car.CarActivity" >
<nav-graph android:value="@navigation/nav_graph" />
</activity>

CarActivity

class CarActivity : AppCompatActivity() {

private val carViewModel: CarViewModel by viewModel { parametersOf(args.carUuid) }
private val args: CarActivityArgs by navArgs()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DataBindingUtil.setContentView<ActivityCarBinding>(this, R.layout.activity_car).also { binding ->
binding.lifecycleOwner = this
binding.carViewModel = carViewModel
}
}

有用的链接:

用于隐式DeepLinks 的Android文档

RayWenderlich 的DeepLinks

----更新----

我创建了一个最小的示例项目,并发现了关于发生了什么/出了什么问题的提示。我在官方问题跟踪器上发布了所有内容:https://issuetracker.google.com/issues/155690730

我从导航团队那里得到了答案,并得到了一个适合我的解决方案/解决方法。更多细节,包括样品项目可以在这里找到

https://issuetracker.google.com/issues/155690730

为什么会发生这种情况(来自谷歌问题跟踪器的答案(

SubActivity内部的深度链接目的地肯定是可能的,但在handleDeepLink()时,我们还没有构建能够识别深度链接变量的NavDeepLink对象。此外,如果我们能够以某种方式解析URL模式并将其作为intent extra,对于您给出的示例,SubActivity中的bynavArgs()调用将返回一个值"alice",该值用于深度链接目的地,而不是它的Activity。

当您使用NavDirections调用navigation((时,by navArgs()在"活动"中工作的原因是ActivityNavigator向用于启动新"活动"的Intent添加了额外内容。当你使用adb的深度链接时,你绕过了所有这些逻辑,这意味着启动活动的意图没有额外的东西,这就是为什么它会失败的原因。

无论你的用例是什么,可能都有一种比嵌套活动更好的方法。也就是说,你可以通过在adb命令中添加一个额外的密钥名称来实现这一点,该命令用于从深度链接启动应用程序:--es"name"<"您的字符串">。

我现在做什么

由于我可以完全控制deeplink URL,我现在所做的就是将deeplink设置为SubActivity本身。此外,我还为深度链接URL提供了目标SubActivity应该设置为startDestination的信息。

这种方法对我来说很好。唯一的缺点是MainActivity也是在后台构建的,所以当按下后退按钮时,用户首先会被带回这个MainActivty。但我可以接受:(

在你的deepLink:中试试这个

<fragment
android:id="@+id/fragment_parts"
android:name="myapp.screens.parts.PartsFragment"
android:label="@string/parts"
tools:layout="@layout/fragment_parts">
<argument
android:name="carUuid"
app:argType="string" />
<deepLink
android:id="@+id/deepLink"
app:uri="my-app.com/cars/{carUuid}/parts" >
</deepLink>
</fragment>

最新更新