Twitter Kit for Androidを使って画像付きツイート
TwitterのAPIを使うのに、今までは非公式ライブラリであるTwitter4Jなどを利用しておりましたが、公式ライブラリであるTwitter Kit for Android
がリリースされましたので、このライブラリを使用して画像付きツイートを実現してみます。
環境は下記のとおりです。
課題
Twitter Kitで画像付きTweetをするには下記課題があります。
- まだライブラリがmedia/uploadに対応していない
- その上、statuses/updateにmedia_idsを渡すためのIFも用意されていない
解決策
1. まだライブラリがmedia/uploadを対応していない
自前で対応します。
Twitter KitでREST APIを使用するにはTwitterApiClient
を使用しますので、それにちなんで、media/upload対応したクライアントをTwitterUploadClient
とします。
2. その上、statuses/updateにmedia_idsを渡すためのIFも用意されていない
自前で用意します。
TwitterApiClient
を継承したClassを作成して対応します。
実装
- media/upload対応した
TwitterUploadClient
を実装する - media/uploadのレスポンスをマッピングする
MediaEntity
を実装する 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) { } });