android firebase dynamic link PendingDynamicLinkData 为 null 直接通过应用

android firebase dynamic link PendingDynamicLinkData is null direct through app

问题:为什么 "Short dynamic links" 以编程方式创建不会直接 ​​open/launch 应用程序?

我想在用户单击由 android 应用动态创建的动态 url 时直接启动应用。

单击由 android 应用动态创建的动态短片 link 时,会发生以下情况,

1.Option 显示两个选项,一个是通过 chrome,另一个是通过应用程序

2.if 我选择 chrome 选项,浏览器打开,显示加载对话框并启动带有 PendingDynamicLinkData 数据的应用程序

3.but 如果我选择应用程序选项,应用程序启动应用程序但 PendingDynamicLinkData 丢失或为空。

任何帮助都会很棒。我的清单设置如下

  <intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:host="myapp.page.link" android:scheme="http"/>
    <data android:host="myapp.page.link" android:scheme="https"/>
  </intent-filter>

您应该在 activity 中处理您的 PendingDynamicLinkData 以覆盖 onCreate 和 onNewIntent。像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        if (intent != null) {
            handleDeepLink(intent);
        }
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent != null) {
        handleDeepLink(intent);
    }
}

private void handleDeepLink(Intent intent) {
        FirebaseDynamicLinks.getInstance().getDynamicLink(intent).addOnSuccessListener(pendingDynamicLinkData -> {
            if (pendingDynamicLinkData != null) {
                Uri deepLink = pendingDynamicLinkData.getLink();
                if (deepLink != null) {
                    // todo .....
                }
            }
        });
    }

我不知道正确的解决方案,但我找到了一个有效的技巧。 首先确保您已将以下意图过滤器添加到应该处理动态 link:

的 activity
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="example.com"
            android:scheme="http" />
        <data
            android:host="example.com"
            android:scheme="https" />
    </intent-filter>

Source

然后在您的 activity 中,使用以下代码获取 link:

String link=null;
if (getIntent().getData()!=null){
    link=getIntent().getData().toString();
}

在清单中,将以下意图过滤器添加到将处理 url 的 activity:

覆盖目标 Activity:

的 OnStart 方法
public override fun onStart() {
    super.onStart()
    FirebaseDynamicLinks.getInstance()
    .getDynamicLink(getIntent())
    .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
        @Override
        public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
            // Get deep link from result (may be null if no link is found)
            Uri deepLink = null;
            if (pendingDynamicLinkData != null) {
                deepLink = pendingDynamicLinkData.getLink();
            }
            // ...
        }
    })
    .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.w(TAG, "getDynamicLink:onFailure", e);
        }
    });

完整指南here。 出于某种原因,我无法让它在与主要操作相同的 activity 中工作。