Twitter Kit for Androidを使って画像付きツイート

TwitterAPIを使うのに、今までは非公式ライブラリであるTwitter4Jなどを利用しておりましたが、公式ライブラリであるTwitter Kit for Androidがリリースされましたので、このライブラリを使用して画像付きツイートを実現してみます。

環境は下記のとおりです。

課題

Twitter Kitで画像付きTweetをするには下記課題があります。

  1. まだライブラリがmedia/uploadに対応していない
  2. その上、statuses/updateにmedia_idsを渡すためのIFも用意されていない

解決策

1. まだライブラリがmedia/uploadを対応していない

自前で対応します。

Twitter KitでREST APIを使用するにはTwitterApiClientを使用しますので、それにちなんで、media/upload対応したクライアントをTwitterUploadClientとします。

2. その上、statuses/updateにmedia_idsを渡すためのIFも用意されていない

自前で用意します。

TwitterApiClientを継承したClassを作成して対応します。

実装

  1. media/upload対応したTwitterUploadClientを実装する
  2. media/uploadのレスポンスをマッピングするMediaEntityを実装する
  3. TwitterApiClientを継承して、statuses/updateのmedia_idsに対応したIFを備えるMyTWitterApiClientを実装する

使用例

TwitterUploadClient twitterApiClient = new TwitterUploadClient(Twitter.getSessionManager().getActiveSession());
TwitterUploadClient.MediaService mediaService = twitterApiClient.getMediaService();
String imageData = "/9j/4AAQSkZJRgABAQEAAQABAAD/2wBDAAcFBgYGBQcGBgYICAcJCxIMCwoKCxcQEQ0SGxccHBoXGhkdISokHR8oIBkaJTIlKCwtLzAvHSM0ODQuNyouLy7/2wBDAQgICAsKCxYMDBYuHhoeLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi7/wAARCAAgACADASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAABgcAAwQF/8QALRAAAQMDAwIEBQUAAAAAAAAAAQIDBAAFEQYSIUFhEzEyUQcUgZGhNHLB0fD/xAAXAQEBAQEAAAAAAAAAAAAAAAAFBgME/8QAJBEAAQMDBAIDAQAAAAAAAAAAAQIDBAARIQUTMXFBkRQjgaH/2gAMAwEAAhEDEQA/AL7f73CsUAzJi/M7W20+pxXsKnErXt0lOEtLRGb6IQkE/Ums+Ja13K6OxAf0qQGv3EZP3yBRuxxYDMNiVcGfmHpAKkNLUQhtAUU5IGCSSD2AHeuL7pD2014pXTpOnNxlvP5Uk2tz1Ye/VIY+vrtEcCnVtym+qHEgH6EeVUnT18g3+AJkJR4O1xtXqbV7H++tTSBAsFzW40Lc00+2nfhClbVpzg8E8EZFKNKQoVquOITAaD42LwTzjkdf9mj3tSVBmphSAbqtY+M4B91s+uDMj7sZJBHX9zXha8iri6hW8oHw5SAtJ7gYI/A+9HJbAmR2Q0+2xIZBSPEB2OJJJ5IBwQSemDmrNfLREvUFUSUCOdyHE+ptXuKms7R2oYjpSw03MZzw42sJOO6T/GaRG9He3majZMVYWVIFwa1aQgmMZMl2Ql95SfCy2DsQMgkAkAqPA6YHemdibL1zQU+loFSj+BXHbbDcg03HSwI7aRgrcIyfc4FL7bAZgMeE3lSjytZ81GgUw5mpal86WLJTwOuMd5qgZCIsUMpyTz+81//Z";
mediaService.upload(imageData, new Callback<MediaEntity>() {
    @Override
    public void success(Result<MediaEntity> result) {
        MyTwitterApiClient twitterApiClient = new MyTwitterApiClient(Twitter.getSessionManager().getActiveSession());
        MyTwitterApiClient.MyStatusesService statusesService = twitterApiClient.getMyStatusesService();
        statusesService.update("upload test", null, result.data.mediaIdString, new Callback<Tweet>(){

            @Override
            public void success(Result<Tweet> result) {

            }

            @Override
            public void failure(TwitterException e) {

            }
        });


    }

    @Override
    public void failure(TwitterException e) {

    }

});