Posted at

Twitter Kitで画像付き投稿をする

More than 1 year has passed since last update.


まえがき

最近までTwitter4jを使用して、画像付き投稿をしていたのですがTwitter Kitを使った方が認証がスムーズそうだし、純正だし今後のためにも乗り換えるかぁああということで乗り換えました!

乗り換えてみて、画像付きで投稿するまでのフローが少し面倒なのと、ネットの情報が古いものしか見当たらなかったので今回投稿してみました。

認証の流れは省いていますが、認証後でないと投稿はできませんのでお気をつけください。


投稿までの流れ

POST media/upload

まずこちらのAPIに画像のバイナリデータを送信し、media_id_stringの値を取得します。


ExampleResult

{

"media_id": 553639437322563584,
"media_id_string": "553639437322563584",
"size": 998865,
"image": {
"w": 2234,
"h": 1873,
"image_type": "image/jpeg"
}
}

POST statuses/update

そしてこちらのAPIに投稿文言と共に、先ほど取得したmedia_id_stringをPOSTすると画像付き投稿が可能になります!


実装

R.drawable.XXXXの画像をバイナリに変換して、Tweetするまでの流れです。

InputStream inputStream = getResources().openRawResource(R.drawable.XXXX);

ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bufRead;
while ((bufRead = inputStream.read(buffer)) != -1) {
bout.write(buffer, 0, bufRead);
}
byte[] binary =bout.toByteArray();
Observable.fromEmitter(emitter ->
TwitterCore.getInstance().getApiClient()
.getMediaService()
.upload(RequestBody.create(MediaType.parse("image/jpg"), binary), null, null)
.enqueue(new Callback<Media>() {
@Override
public void success(Result<Media> result) {
emitter.onNext(result.data.mediaIdString);
emitter.onCompleted();
}

@Override
public void failure(TwitterException exception) {
emitter.onError(exception);
}
}), Emitter.BackpressureMode.LATEST)
.flatMap(mediaIdString -> Observable.fromEmitter(emitter ->
TwitterCore.getInstance().getApiClient()
.getStatusesService()
.update(tweetContent.get(), null, false, null, null, null, false, null, (String) mediaIdString)
.enqueue(new Callback<Tweet>() {
@Override
public void success(Result<Tweet> result) {
emitter.onNext(true);
emitter.onCompleted();
}

@Override
public void failure(TwitterException exception) {
Timber.e(exception, "tweet upload %s", exception.getMessage());
emitter.onError(exception);
}
}), Emitter.BackpressureMode.LATEST))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(isSuccess -> {
/*do something*/
},
throwable -> {
/*do something*/
});

雑ですみません、、以上です。