android開発をしていると、twitterと連携して欲しいという要望は普通に出てきますね
実装したので、以下にコードを記載します。
環境
- android4.0.2(sdk14)以上
- twitter4j 4.0.1
連携にはtwitter4jを使います。昔からある安定したライブラリで安心して利用できます。
最初にツイートの実装です。つぶやきの文字と同時に画像も送信するようにします。以下、ソースコードです。
twitter developerの設定やoauth認証は既にできている前提です。
TwitterLogic.java /** * twitterで利用するビジネスロジック * */ public class TwitterLogic { protected Context mContext; public TwitterLogic(Context context) { mContext = context; } /** * 認証されたtwitterオブジェクトを返す * @return */ public Twitter getAuthorizedTwitter() { String token = UserTempInfo.getOAuthToken(mContext); String tokenSecret = UserTempInfo.getOAuthTokenSecret(mContext); Log.d("TwitterLogic", "toke n " + token); Log.d("TwitterLogic", "tokenSecret" + tokenSecret); Twitter twitter = new TwitterFactory().getInstance(); if(twitter.getAuthorization().isEnabled()){ Log.d("TwitterLogic", "isEnabled"); return twitter; } else { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(mContext.getResources().getString(R.string.consumerKey)); builder.setOAuthConsumerSecret(mContext.getResources().getString(R.string.consumerSecret)); builder.setOAuthAccessToken(token); builder.setOAuthAccessTokenSecret(tokenSecret); Configuration configuration = builder.build(); TwitterFactory factory = new TwitterFactory(); try { twitter = factory.getInstance(new OAuthAuthorization(configuration)); } catch (java.lang.StringIndexOutOfBoundsException e) { return null; } if(twitter.getAuthorization().isEnabled()){ return twitter; } else { return null; } } } /** * シェアが成功したらtrue, それ以外はfalse */ public boolean share(String msg, String imagePath) { String token = UserTempInfo.getOAuthToken(mContext); String tokenSecret = UserTempInfo.getOAuthTokenSecret(mContext); if (token == null || token.isEmpty() || tokenSecret == null || tokenSecret.isEmpty()) { Log.e(TAG, "This user is not authinticated."); return false; } Twitter twitter = getAuthorizedTwitter(); if (twitter != null) { Status status = null; try { status = twitter.updateStatus( new StatusUpdate(msg).media("", getInputStream(imagePath))); } catch (TwitterException e) { Log.e(TAG, "twitter post error :" + e.getErrorMessage()); return false; } if (status != null) { return true; } return true; } return false; } /** * InputStreamを取得する * @param imagePath 画像のurl * @return */ public static InputStream getInputStream(String imagePath) { HttpURLConnection connection = null; InputStream in = null; try { URL url = new URL(imagePath); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); in = connection.getInputStream(); } catch (IOException e) { Log.e(TAG, "error occured. " + e.getMessage()); return null; } return in; } } 呼び出し側 MainActivity.java TwitterLogic logic = new TwitterLogic(mContext); return logic.share(mTwitterText, mImagePath);}
上記ではshareメソッドを呼び出して投稿を行っています。
画像データはinputStreamオブジェクトに変換して、mediaメソッドに設定して投稿します。
画像urlからinputStreamオブジェクトを取得するコードを書くケースは多いと思いますが、この時データは非同期で取得する必要があります。
非同期でないと、アプリがクラッシュしてしまいます。
AsyncTaskを使えばうまくいきます。
参考サイト
0 件のコメント:
コメントを投稿