2014年7月20日日曜日

androidとtwitterを連携する 投稿機能の実装

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 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...