【问题标题】:How to create a Firebase short dynamic link如何创建 Firebase 短动态链接
【发布时间】:2020-08-01 01:21:11
【问题描述】:

我在 Android 上的 Java 中成功创建了 Firebase 动态链接。我这样做的代码是在按钮单击侦听器中。

shareButton.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        DynamicLink dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLink(Uri.parse("https://www.mycompany.com/"))
            .setDomainUriPrefix("https://mycompany.page.link/test")
            .setAndroidParameters(
                new DynamicLink.AndroidParameters.Builder("com.mycompany.app")
                    .setFallbackUrl(Uri.parse("https://www.mycompany.com/"))
                    .setMinimumVersion(1)
                    .build())
            .buildDynamicLink();

        Uri dynamicLinkUri = dynamicLink.getUri();
        shareDynamicLink(dynamicLinkUri);
    }
});

public void shareDynamicLink(Uri dynamicLink)
{
    Intent shareIntent = new Intent();
    String msg = "Check this out: " + dynamicLink;
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_TEXT, msg);
    shareIntent.setType("text/plain");
    startActivity(shareIntent);
}

这会发送一个可以正常工作的长动态链接。现在我想缩短链接,所以我用这段代码替换了“shareDynamicLink”方法。

public void shareDynamicLink(Uri dynamicLink)
{
    Task<ShortDynamicLink> shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
        .setLongLink(dynamicLink)
        .buildShortDynamicLink()
        .addOnCompleteListener(Objects.requireNonNull(this.getActivity()), new OnCompleteListener<ShortDynamicLink>()
        {
            @Override
            public void onComplete(@NonNull Task<ShortDynamicLink> task)
            {
                if (task.isSuccessful())
                {
                    // Short link created
                    Uri shortLink = Objects.requireNonNull(task.getResult()).getShortLink();
                    Uri flowchartLink = task.getResult().getPreviewLink();

                    Log.e("DynamicLink", "shortLink: " + shortLink + System.lineSeparator());
                    Log.e("DynamicLink", "flowChartLink: " + flowchartLink + System.lineSeparator());

                    Intent shareIntent = new Intent();
                    String msg = "Check this out: " + shortLink;
                    shareIntent.setAction(Intent.ACTION_SEND);
                    shareIntent.putExtra(Intent.EXTRA_TEXT, msg);
                    shareIntent.setType("text/plain");
                    startActivity(shareIntent);
                }
                else
                {
                    Toast.makeText(context, "Failed to share event.", Toast.LENGTH_SHORT).show();
                }
            }
        });
}

第二种方法会产生我不理解的错误。

"400: Cannot shorten a short Dynamic Link:
https://mycompany.page.link/test?afl=https%3A%2F%2Fwww.mycompany.com%2F&amv=1
&apn=com.mycompany.app&ibi=com.mycompany.app&ifl=https%3A%2F%2F
www.mycompany.com%2F&isi=963543827&ipfl=https%3A%2F%2F
www.mycompany.com%2F&link=https%3A%2F%2Fwww.mycompany.com%2F
[https://firebase.google.com/docs/dynamic-links/rest#create_a_short_link_from_parameters]

我在这里缺少什么?这似乎应该可以工作。

注意:我不需要长动态链接,只需要短链接。我尝试按如下方式更改 onClickListener。

shareButton.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        Task<ShortDynamicLink> dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLink(Uri.parse("https://www.mycompany.com/"))
            .setDomainUriPrefix("https://mycompany.page.link/test")
            .setAndroidParameters(
                new DynamicLink.AndroidParameters.Builder("com.mycompany.app")
                    .setFallbackUrl(Uri.parse("https://www.mycompany.com/"))
                    .setMinimumVersion(1)
                    .build())
            .buildShortDynamicLink()
            .addOnCompleteListener(Objects.requireNonNull(getActivity()), new OnCompleteListener<ShortDynamicLink>()
            {
                @Override
                public void onComplete(@NonNull Task<ShortDynamicLink> task)
                {
                    if (task.isSuccessful())
                    {
                        Uri shortLink = Objects.requireNonNull(task.getResult()).getShortLink();
                        Uri flowchartLink = task.getResult().getPreviewLink();

                        Log.e("DynamicLink", "shortLink: " + shortLink + System.lineSeparator());
                        Log.e("DynamicLink", "flowChartLink: " + flowchartLink + System.lineSeparator());
                    }
                    else
                    {
                        Log.e("DynamicLink", "Link failed: " + task.getException().getMessage() + System.lineSeparator());
                    }
                }
            });

    }
});

但我仍然遇到同样的 400 错误。

400: Cannot shorten a short Dynamic Link:
https://mycompany.page.link/test?afl=https%3A%2F%2Fwww.mycompany.com%2F&amv=1
&apn=com.mycompany.app&ibi=com.mycompany.app&ifl=https%3A%2F%2F
www.mycompany.com%2F&isi=963543827&ipfl=https%3A%2F%2Fwww.mycompany.com%2F
&link=https%3A%2F%2Fwww.mycompany.com%2F
[https://firebase.google.com/docs/dynamic-links/rest#create_a_short_link_from_parameters]

【问题讨论】:

    标签: java android firebase firebase-dynamic-links


    【解决方案1】:

    对于发现此问题的任何人,我的问题源于对编程生成的链接与预定义链接的工作方式的误解。在我的情况下,我试图使用来自 Firebase 控制台的预定义链接(“https://mycompany.page.link/test”)作为我生成的链接的前缀。当我试图缩短它时,这在后端造成了某种混乱。我仍然不明白它到底不喜欢什么,但关键是它失败了。

    因此,生成链接的解决方案是仅使用 Firebase 控制台中的基本前缀 - .setDomainPrefix("https://mycompany.page.link/")。使用它我可以创建“.buildShortDynamicLink()”或“buildDynamicLink()”。

    我在 Firebase 控制台中创建的链接(“http://mycompany.page.link/test”)只能逐字使用——无需生成任何内容。只需按字面意思将其放入短信中即可完成。

    【讨论】:

      【解决方案2】:

      您打算使用较长的版本,还是只使用较短的版本?如果是这样,如果您在 onClick(...) 方法中使用 .buildShortDynamicLink() 而不是 .buildDynamicLink() 而不在 shareDynamicLink(...) 中进行转换,它是否有效?

      【讨论】:

      • 我只想要短的,但它不允许我使用 .buildShortDynamicLink(),因为这需要 onClick() 的匿名函数中的匿名函数。
      • 在上面添加了重构的 onClick() 处理程序。仍然收到 400 错误。
      • 我将 .setDomainUriPrefix("mycompany.page.link/test") 更改为 .setDomainUriPrefix("mycompany.page.link/") 并且它不再失败。但是我在 Firebase 控制面板中创建的链接包含“/test”,那么我应该如何使用它呢?
      • 我也想到了这一点,但是网络上的一些 Google 文档/示例再次在其domainUriPrefix 中包含“/something”。以下链接有效吗? mycompany.page.link/test/?注意尾部的斜杠。
      • 我不是 100% 确定,但我认为问题是我的根本误解。我在 Firebase 控制台中创建的动态链接可以而且必须逐字使用——根本不需要在代码中构建链接。该链接不是“前缀”URI。在代码中创建某些东西必须使用 BASE URI 作为其“前缀”。我想我在混合隐喻。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多