[Android] FaceBookSDKを使用し画像とテキストを投稿する

スポンサーリンク

はじめに

FaceBookに画像とテキストとリンクを同時にシェアしたいってことがあった。

どうやってやるのかの調査結果。

試したFacebookSDKバージョン

compile 'com.facebook.android:facebook-android-sdk:4.23.0'

バージョンが古いのはごめんなさい、、、orz

色々試した結果

できなかった(´・ω・`)

試したこと

・シェアで画像とテキスト or リンクを投稿
 →画像とテキスト or リンクが同時に設定できない
・シェアでリンクとテキストを投稿
 →リンクと一緒にテキストを設定できない(引用ならできる)

結論

シェア機能ではテキストは設定できない
Facebookのポリシーでシェアでテキストは設定できないってのがどっかに記載があった気がする、、、。気がする・・・。

どうしたか・・・?

投稿機能で画像とテキストを投稿するようにした。
リンクは諦めた。
テキスト部分にURLを設定すればいいじゃんってことで。
画像とテキストとリンクを同時に投稿する方法あったら誰か教えて。あまり時間かけて検証してないから何か見落としてるかもだけど。

実装

導入はfacebook for developerのスタートガイドに則って実装。

以下、投稿できるようになったコード。シェアで試行錯誤したやつも記載。
異常系は考えてない。

//
public class MainActivity extends AppCompatActivity {
 
    private CallbackManager mCallbackManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.shareButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 引用は設定できるけどテキストが設定できない・・・
                ShareLinkContent content = new ShareLinkContent.Builder()
                        .setContentUrl(Uri.parse("https://friegen.xyz/"))
                        .setQuote("hogehoge")
                        .build();
 
                ShareDialog shareDialog = new ShareDialog(MainActivity.this);
                shareDialog.show(content);
            }
        });
 
 
        findViewById(R.id.shareImageButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                Resources r = getResources();
                Bitmap bmp = BitmapFactory.decodeResource(r, R.mipmap.ic_launcher);
                SharePhoto photo = new SharePhoto.Builder()
                        .setBitmap(bmp)
                        .build();
                SharePhotoContent content = new SharePhotoContent.Builder()
                        .addPhoto(photo)
                        .build();
 
                ShareLinkContent shareLinkContent = new ShareLinkContent.Builder()
                        .setContentUrl(Uri.parse("https://friegen.xyz/"))
                        .setQuote("hogehoge")
                        .build();
 
                // 画像とリンクが同時設定できない・・・
                ShareContent shareContent = new ShareMediaContent.Builder()
                        .addMedium(photo)
                        .build();
 
 
                ShareDialog shareDialog = new ShareDialog(MainActivity.this);
                shareDialog.show(content, ShareDialog.Mode.AUTOMATIC);
            }
        });
 
        findViewById(R.id.shareImageTextButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                share();
            }
        });
    }
 
    private void share() {
        if (AccessToken.getCurrentAccessToken() != null && AccessToken.getCurrentAccessToken().getPermissions().contains("publish_actions")) {
            Bitmap bi = BitmapFactory.decodeResource(getResources(),
                    R.mipmap.ic_launcher);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] data = baos.toByteArray();
            GraphRequest graphRequest = GraphRequest.newPostRequest(AccessToken.getCurrentAccessToken(), "me/photos", null, new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse graphResponse) {
                    Log.d("hoge", graphResponse.toString());
                }
            });
            Bundle postParams = graphRequest.getParameters();
            postParams.putByteArray("picture", data);
            postParams.putString("caption", "https://friegen.xyz/");
            graphRequest.setParameters(postParams);
            graphRequest.executeAsync();
        } else {
            login();
        }
    }
 
    private void login() {
        mCallbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                //ログイン成功
                AccessToken.setCurrentAccessToken(loginResult.getAccessToken());
                // 書き込み権限がなければ取る
                if (!AccessToken.getCurrentAccessToken().getPermissions().contains("publish_actions")) {
                    LoginManager.getInstance().logInWithPublishPermissions(MainActivity.this, Arrays.asList("publish_actions"));
                }
            }
 
            @Override
            public void onCancel() {
                //キャンセル
            }
 
            @Override
            public void onError(FacebookException exception) {
                //ログイン失敗
            }
        });
 
        // 1度ログインする前にpublish_actions取ろうとすると落ちる
//                    LoginManager.getInstance().logInWithReadPermissions(MainActivity.this,
//                            Arrays.asList("publish_actions"));
        LoginManager.getInstance().logInWithReadPermissions(MainActivity.this,
                null);
    }
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    }
}

ハマったこと

・書き込み権限である「publish_actions」を一発目に取りに行こうとすると落ちる
 →一度ログインしてから取りに行くと大丈夫だった(本来こうすべきなのかどうかは知らない)
・アプリアンインストール→インストールでログインし直すとFacebook側でエラーになる
 →スタートガイド中に設定するKeyHashと違う署名ファイルでapk作ってるとダメみたい。設定したKeyHashと同一の署名ファイルでapk作成したらFacebook側でエラーにならなくなった。
 →→1度目のログイン通して2度めのログイン通さないとか辞めてくれって話・・・。

Amazon.co.jp: 日本限定パッケージ Android [ドロイド君] ミニコレクティブル(スタンダードエディション/ブランク) : おもちゃ
Amazon.co.jp: 日本限定パッケージ Android  ミニコレクティブル(スタンダードエディション/ブランク) : おもちゃ
タイトルとURLをコピーしました