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


まえがき

最近まで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*/
              });

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