0

问题:我正在尝试从托管在其他地方的 Android 应用程序向 Facebook 分享内容,并将其深层链接回我的应用程序。

我正在开发和 Android 应用程序的详细信息 ,我面临的问题是我有一个视频,我想分享给用户的新闻源,并带有一个返回应用程序的深层链接。该视频托管在 Cloudinary 上,但这无关紧要,尝试将 Youtube 视频发布到用户新闻源,但当他们单击下面的描述时将其深层链接回应用程序将是同样的问题。

我已经非常接近使用 FacebookShareLinkContentShareDialog. 代码如下所示:

ShareLinkContent content = new ShareLinkContent.Builder()
                        .setContentUrl(Uri.parse("https://kt4rh.app.goo.gl/naxy")) /* Deeplink back into my app created using Firebase Dynamic Link */
                        .setImageUrl(Uri.parse({path to an image stored on clodinary}))
                        .build();
                ShareDialog shareDialog = new ShareDialog(getActivity());
                shareDialog.show(content);

这显示了一个图像,当用户点击它时,它带有一个返回到我的应用程序的深层链接。但是,我想要做的是显示视频(或 gif,两者都可以)而不是图像。

我已经尝试将视频下载到设备并使用 a ShareVideoContent,希望我可以像这样设置localUrlcontentUrl(类似于我在ShareLinkContent上面设置缩略图和 contentUrl 的方式):

Uri videoUri = Uri.fromFile(new File(localPathToVideo));
                ShareVideo shareVideo = new ShareVideo.Builder()
                        .setLocalUrl(videoUri)
                        .build();
                ShareVideoContent videoContent  = new ShareVideoContent.Builder()
                        .setVideo(shareVideo)
                        .setContentUrl(Uri.parse("https://kt4rh.app.goo.gl/naxy")) /* Deeplink back to app */
                        .build();
                ShareDialog shareDialog = new ShareDialog(getActivity());
                callbackManager = CallbackManager.Factory.create();
                shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
                    @Override
                    public void onSuccess(Sharer.Result result) {}

                    @Override
                    public void onCancel() {}

                    @Override
                    public void onError(FacebookException error) {
                        Log.e(LOG_TAG, error.getMessage());
                    }
                });
                if (shareDialog.canShow(videoContent)) {
                    shareDialog.show(videoContent);
                }

但我只是收到一条错误消息,说“只应指定链接、照片和视频中的一个。”,这意味着我无法设置本地 url 和内容 url。

所以现在我被困住了。似乎这应该是一个相对常见的问题(共享托管在其他地方的内容并将其深层链接回您的应用程序),但我不知道该怎么做。

4

2 回答 2

1

最后通过为要共享的每个项目(在本例中为旅行路线)创建一个 html 页面并将它们托管在 Firebase 的云存储上来解决这个问题。这是代码的样子

/**
 * In order to share gifs to facebook and have a animating gif show up, we need to construct an arbitrary HTML page that wraps the
 * gif image that we want to share. When the user clicks on the wrapped html page, it will forward to the real page we want it to show.
 *
 * Facebook uses custom meta properties to determine what image to show in the preview, which is why we need to wrap the actual gif with another image this way
 */
private static final String GIF_IMAGE = "<gif_image_here>";
private static final String REDIRECT_LINK = "<redirect_link_here>";

private static final String SHARE_HTML_PAGE = "<!DOCTYPE html><html>" +
        "<head>" +
        "<meta property=\"og:type\" content=\"video.other\" />" +
        "<meta property=\"og:url\" content=\"" + GIF_IMAGE + "\" />" +
        "<meta property=\"og:image\" content=\"" + GIF_IMAGE + "\" />" +
        "<meta http-equiv=\"refresh\" content=\"0; url=" + REDIRECT_LINK + "\" />" +
        "</head></html>";

public static void shareGifToFacebook(final Activity activity, final String gifUrl, final Trip trip, final ShareStatusListener shareStatusListener) {
    String htmlPageToShare = SHARE_HTML_PAGE.replaceAll(GIF_IMAGE, gifUrl).replaceAll(REDIRECT_LINK, DeeplinkUtils.getTripDeeplink(trip.getUid()));

    // Upload the html page somewhere accessible
    FirebaseStorageUploader.uploadShareHtml(TravellerManager.getInstance().getCurrentlyLoggedInUserUid(), htmlPageToShare, new FirebaseStorageUploader.UploadShareHtmlListener() {
        @Override
        public void onSuccess(String publicUrl) {
            Log.d("ShareUtils", "shareGifToFacebook() publicUrl to be shortened:  " + publicUrl);

            URLShortener.shortUrl(publicUrl, new URLShortener.LoadingCallback() {
                @Override
                public void startedLoading() {

                }

                @Override
                public void finishedLoading(@Nullable String shortUrl) {
                    Log.d("ShareUtils", "shareGifToFacebook() finishedLoading() shortenedUrl " + shortUrl);

                    ShareLinkContent content = new ShareLinkContent.Builder()
                            .setContentUrl(Uri.parse(shortUrl))
                            .setContentDescription(activity.getString(R.string.view_trip_on_wd))
                            .setContentTitle(trip.getName())
                            .build();
                    ShareDialog shareDialog = new ShareDialog(activity);
                    shareDialog.show(content);

                    if (shareStatusListener != null) {
                        shareStatusListener.onShared();
                    }
                }
            });
        }

        @Override
        public void onFailed() {
            Toaster.toastLong(activity.getString(R.string.general_error));
        }
    });
}
于 2017-03-16T04:26:06.470 回答
0

我认为在 Android 上你不能contentUrl同时设置和视频。我遇到了类似的问题,但在删除.setContentUrl(...).

您可以做的是将链接复制到剪贴板并说服用户将链接粘贴到他们的标题中(即:在打开之前显示弹出窗口/警报ShareDialog)。

可能还有其他方法可以解决这个问题。如果是这样,我也很想知道。

希望这可以帮助。

于 2017-03-15T00:38:55.263 回答