web-dev-qa-db-ja.com

ACTION_SEND経由でAndroidアプリからFacebookでテキストを共有する

Androidアプリがあり、他のアプリを介したテキストの送信をサポートしています。したがって、ACTION_SENDインテントとEXTRA_TEXTフィールドを使用します。セレクターは、そのような意図を処理できるすべてのアプリを提示します。それらは、Twitter、EMail、...、Facebookです。しかし、Facebookを選択すると、ブラウザーが開き、次のページに移動します。

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

テキストと送信ボタンが表示されます。しかし、送信ボタンを押しても何も起こりません。ページが再び読み込まれます。 Facebookアプリ経由でしかURLを送信できないと思います。それはありますか?

Facebook Androidアプリを介してACTION_SEND経由でテキストを送信することはできましたか?

91
Goddchen

編集:Androidの公式Facebookアプリの新しいリリースで(2011年7月14日)IT WORKS !!!

OLD:ユーザーがFacebookアプリを共有用に選択した場合、上記の例は機能しませんが、Facebookへの投稿にSeesmicアプリを選択した場合は機能します。 SeesmicはFacebookよりもFacebook APIの実装が優れていると思います!

11
Giulio Prisco

Facebookアプリで共有を機能させるには、少なくとも1つのリンクのみが必要です。

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 share

どうやらそれは自動的にリンクから画像とテキストを取得して共有に入力します。

テキストのみを共有する場合は、facebook apiを使用する必要があります。 https://github.com/facebook/facebook-Android-sdk

51
ol_v_er

06/2013:

  • これはFacebookのバグであり、コードではありません
  • Facebookはこのバグを修正しません、彼らは言うそれは「設計による」彼らがAndroid共有システムを壊したこと: https://developers.facebook.com/bugs/33261962681642
  • sDKを使用するか、URLのみを共有します。
  • ヒント:Webページのタイトルを投稿のテキストとして使用して、少しチートすることができます。
45
Loda

まず、ハンドラー共有オプションへのクエリインテントが必要です。次に、パッケージ名を使用してIntentをフィルタリングすると、ハンドラー共有オプションが1つだけになります!

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ブログ-Android経由の事前共有

28
khaintt

そのため、回避策がありますが、共有しているページを管理していることを前提としています...

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のコンテンツを返すようにWebサイトを更新した場合。

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

次に、Facebookがダイアログを生成するためにそのURLをエスケープすると、タイトルメタデータが読み取られ、共有ダイアログに埋め込まれます。

私はこれが非常に不愉快な解決策であることを理解しているので、一粒の塩で取ってください...

11
Joseph Lee

Facebookアプリはこの意図を誤って処理しているようです。最も信頼できる方法は、Android用のFacebook APIを使用することです。

SDKは次のリンクにあります: http://github.com/facebook/facebook-Android-sdk

「使用」の下に、これがあります:

Facebookダイアログを表示します。

SDKは、ウォールポストの作成など、ユーザーとの対話用にいくつかのWebView htmlダイアログをサポートしています。これは、ネイティブAndroid UIを実装し、APIを介して直接facebookにデータを渡すことなく、迅速なFacebook機能を提供することを目的としています。

これは、それを行うための最良の方法のように思えます-壁に投稿するダイアログを表示します。唯一の問題は、最初にログインする必要がある場合があることです

2
HXCaine
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
1
Vinod Joshi
ShareDialog shareDialog = new ShareDialog(this);
if(ShareDialog.canShow(ShareLinkContent.class)) {

    ShareLinkContent linkContent = new ShareLinkContent.Builder().setContentTitle(strTitle).setContentDescription(strDescription)
                            .setContentUrl(Uri.parse(strNewsHtmlUrl))
                            .build();
    shareDialog.show(linkContent);

}
1
Ram Bhawan

テキストput を表示したい場合は、メッセージの先頭にハッシュタグとして共有します

0
MFQ

2011年4月に報告されたFacebookアプリのバグであり、Android Facebook開発者によってまだ修正されていないようです。

当面の唯一の回避策は、SDKを使用することです。

0
Joseph Woodward