[android] ACTION_SEND를 통해 Android 앱에서 Facebook에 텍스트 공유

Android 앱이 있으며 다른 앱을 통한 문자 전송을 지원합니다. 따라서 인 ACTION_SEND텐트와 EXTRA_TEXT필드를 사용합니다 . 선택기는 그러한 의도를 처리 할 수있는 모든 앱을 제공합니다. 트위터, 이메일, … 및 Facebook입니다. 하지만 Facebook을 선택하면 브라우저가 열리고 다음 페이지로 이동합니다.

http://m.facebook.com/sharer.php?u=mytext

내 텍스트와 제출 버튼이 표시됩니다. 그러나 제출 버튼을 누르면 아무 일도 일어나지 않습니다. 페이지가 다시로드됩니다. Facebook 앱을 통해서만 URL을 보낼 수 있다고 생각합니다. 그럴 수 있습니까?

ACTION_SENDFacebook Android 앱 을 통해 문자를 보낼 수있는 사람이 있습니까?



답변

편집 됨 : Android 용 공식 Facebook 앱의 새 릴리스 (2011 년 7 월 14 일) IT WORKS !!!

OLD : 위의 예는 사용자가 공유를 위해 Facebook 앱을 선택하면 작동하지 않지만 사용자가 Facebook에 게시하기 위해 Seesmic 앱을 선택하면 작동합니다. 나는 Seesmic이 Facebook보다 Facebook API를 더 잘 구현했다고 생각합니다!


답변

공유가 페이스 북 앱에서 작동하게하려면 최소한 하나의 링크 만 있으면됩니다.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Wonderful search engine http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

올바른 공유 창이 표시되지만 공유를 클릭하면 아무 일도 일어나지 않습니다 (공식 Twitter 앱에서도 시도했지만 작동하지 않습니다).

Facebook 앱 공유가 작동하도록하는 유일한 방법은 텍스트없이 링크 만 공유하는 것입니다.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

다음 창이 표시되고 공유 버튼이 작동합니다.

페이스 북에 공유

분명히 공유를 채우기 위해 링크에서 이미지와 텍스트를 자동으로 가져옵니다.

텍스트 만 공유하려면 facebook api를 사용해야합니다. https://github.com/facebook/facebook-android-sdk


답변

2013 년 6 월 :

  • 이것은 귀하의 코드가 아니라 Facebook의 버그입니다.
  • 페이스 북은이 버그를 고치지 않을 것이며 , 그들은 안드로이드 공유 시스템을 깨뜨린 것이 “설계 상”이라고 말합니다 : https://developers.facebook.com/bugs/332619626816423
  • SDK를 사용하거나 URL 만 공유하십시오.
  • 팁 : 게시물의 텍스트로 웹 페이지 제목을 사용하여 약간의 속임수를 쓸 수 있습니다.


답변

먼저 처리기 공유 옵션에 대한 쿼리 의도가 필요합니다. 그런 다음 패키지 이름을 사용하여 Intent를 필터링하면 처리기 공유 옵션이 하나만 있습니다!

Facebook을 통해 공유

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ((app.activityInfo.name).contains("facebook")) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

보너스-Twitter를 통해 공유

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ("com.twitter.android.PostActivity".equals(app.activityInfo.name)) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

다른 공유 응용 프로그램을 통해 공유하는 방법을 찾으려면 거기에서 찾아보십시오 Tép Blog-Android를 통한 사전 공유


답변

그래서 해결 방법이 있지만 공유하는 페이지를 제어 할 수 있다고 가정합니다.

EXTRA_TEXT의 형식을 이렇게 지정하면 …

String myText = "Hey!\nThis is a neat pic!";
String extraText = "http://www.example.com/myPicPage.html?extraText=\n\n" + myText;

… Facebook이 아닌 앱에서는 텍스트가 다음과 같이 표시됩니다.

http://www.example.com/myPicPage.html?extraText=

안녕하세요!
이것은 깔끔한 사진입니다!

이제 extraText 쿼리 매개 변수가있는 요청이 페이지의 메타 데이터에서 extraText의 콘텐츠를 반환하도록 웹 사이트를 업데이트하면됩니다.

<!-- Make sure to sanitize your inputs! e.g. http://xkcd.com/327/ -->
<meta name="title" content="Hey! this is a neat pic!">

그런 다음 Facebook이 해당 URL을 이스케이프하여 대화 상자를 생성하면 제목 메타 데이터를 읽고 공유 대화 상자에 삽입합니다.

이게 꽤 괜찮은 해결책이라는 걸 알고 있으니, 소금 한 알과 함께 드세요 …


답변

Facebook 앱이이 인 텐트를 잘못 처리하는 것 같습니다. 가장 신뢰할 수있는 방법은 Android 용 Facebook API를 사용하는 것 같습니다.

SDK는 다음 링크에 있습니다. http://github.com/facebook/facebook-android-sdk

‘사용법’에는 다음이 있습니다.

Facebook 대화 상자를 표시합니다.

SDK는 벽 게시물 생성과 같은 사용자 상호 작용을 위해 여러 WebView html 대화 상자를 지원합니다. 이는 네이티브 Android UI를 구현하고 API를 통해 직접 Facebook에 데이터를 전달할 필요없이 빠른 Facebook 기능을 제공하기위한 것입니다.

이것이 가장 좋은 방법 인 것 같습니다. 벽에 게시 할 대화 상자를 표시합니다. 유일한 문제는 먼저 로그인해야 할 수도 있다는 것입니다.


답변

Check this out : By this we can check activity results also....
// Open all sharing option for user
                    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
                    sharingIntent.setType("text/plain");
                    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, ShortDesc+" from "+BusinessName);
                    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, ShortDesc+" "+ShareURL);
                    sharingIntent.putExtra(Intent.EXTRA_TITLE, ShortDesc+" "+ShareURL);
                    startActivityForResult(Intent.createChooser(sharingIntent, "Share via"),1000);
/**
     * Get the result when we share any data to another activity
     * */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode) {
        case 1000:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 1 returned OK", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getApplicationContext(), "Activity 1 returned NOT OK", Toast.LENGTH_LONG).show();
            break;
        case 1002:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 2 returned OK", Toast.LENGTH_LONG).show();
            break;
        }// end switch



    }// end onActivityResult