2016-09-21 2 views
0

문제 : 다른 곳에서 호스팅되는 내 Android 앱에서 Facebook에 콘텐츠를 공유하려고하며 내 앱으로 다시 딥 링크합니다.딥 링크가있는 Android에서 Facebook에 동영상 올리기 앱으로 돌아 가기

세부 내가 개발하고 있어요 안드로이드 애플 리케이션과 내가 직면하고있어 문제는 내가 다시 응용 프로그램에의 딥 링크를 사용자의 뉴스 피드에 공유하고 싶은 동영상을 가지고있다. 동영상은 Cloudinary에서 호스팅되지만 관련없는 사용자의 뉴스 피드에 Youtube 비디오를 게시하려고 시도하지만 아래 설명을 클릭 할 때 앱으로 다시 딥 링크해야 동일한 문제가 발생합니다.

저는 페이스 북의 ShareLinkContentShareDialog을 사용하여 정말 가까이에 왔습니다. 코드는 다음과 같습니다 : 사용자가 도청 때

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, 괜찮을 것입니다) 대신에 이미지를 표시하는 것입니다.

내가 이런 (I 위의 ShareLinkContent의 축소판과 contentUrl을 설정하는 방법 유사) localUrlcontentUrl 설정할 수 바라고, 장치에 비디오를 다운로드하고 ShareVideoContent를 사용하여 시도했다 :

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을 설정할 수 없습니다.

그래서 지금은 붙어 있습니다. 이건 비교적 일반적인 문제 (다른 곳에서 호스팅되는 콘텐츠를 공유하고 앱으로 다시 이동하지 않아야 함)가되어야하는 것처럼 보입니다. 그러나 어떻게해야하는지 알 수 없습니다.

답변

1

공유 할 모든 항목 (이 경우 여행 일정)에 대한 html 페이지를 만들어 Firebase의 Cloud Storage에 호스팅하여 해결했습니다. 코드의 모양은 다음과 같습니다

/** 
* 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)); 
     } 
    }); 
} 
+0

작동합니까? GIF URL이 제 3자인 경우 – DevKRos

+0

예, @DevKRos가 작동합니다. 예 GIF URL은 제 3 자입니다. Cloudinary를 사용하여 GIF를 호스팅합니다. – odiggity

+0

제 3 자 URL에서 이미지를 공유하고 이미지 리디렉션을 클릭하면 콘텐츠 링크로 HTML 문자열을 공유하는 데 문제가 발생합니다. 어떤 제안? – DevKRos

0

나는 안드로이드에서 contentUrl과 비디오를 동시에 설정할 수 없다고 생각합니다. 비슷한 문제가 발생했지만 .setContentUrl(...)을 제거한 후에 작동했습니다.

링크 대신 클립 보드에 링크를 복사하고 캡션에 링크를 붙여 넣으십시오 (예 : ShareDialog을 열기 전에 팝업/알림 표시).

다른 문제가있을 수 있습니다. 그렇다면, 나는 또한 알고 싶습니다.

희망이 도움이됩니다.

+0

처음에는 @Deon Nicholas를 시도했지만 사용자 경험은 잔인했습니다. 나는 html 페이지를 만들고이를 Firebase Storage에 저장하여 해결책을 찾았습니다. 더 자세한 내용을 담은 답변을 추가하겠습니다. – odiggity