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