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