Fabricでアクセストークンを取得する方法
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,175
現在Twitterクライアントを、Twitter4jとFabricで開発しています。
参考にしているサイトはAndroid再入門- Twitterクライアントを作ってみよう - という記事です。
OAuth認証とツイート機能はFabricを用いて成功したのですが、ユーザー情報の取得やタイムラインを表示するところでつまずいています。
記事ではTwitter4jを用いてアクセストークンを取得し、タイムラインを表示するために用いているようですが、Fabricを用いてログインした場合、どのようにアクセストークンを取得するのかがわかりません。
方法など、ご教授願います。
public class TwitterUtils {
private static final String TOKEN = "token";
private static final String TOKEN_SECRET = "token_secret";
private static final String PREF_NAME = "twitter_access_token";
public static Twitter getTwitterInstance(Context context) {
String consumerKey = context.getString(R.string.twitter_consumer_key);
String consumerSecret = context.getString(R.string.twitter_consumer_secret);
TwitterFactory factory = new TwitterFactory();
Twitter twitter = factory.getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
if (hasAccessToken(context)) {
twitter.setOAuthAccessToken(loadAccessToken(context));
}
return twitter;
}
public static void storeAccessToken(Context context, AccessToken accessToken) {
SharedPreferences preferences = context.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(TOKEN, accessToken.getToken());
editor.putString(TOKEN_SECRET, accessToken.getTokenSecret());
editor.commit();
}
public static AccessToken loadAccessToken(Context context) {
SharedPreferences preferences = context.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
String token = preferences.getString(TOKEN, null);
String tokenSecret = preferences.getString(TOKEN_SECRET, null);
if (token != null && tokenSecret != null) {
return new AccessToken(token, tokenSecret);
} else {
return null;
}
}
public static boolean hasAccessToken(Context context) {
return loadAccessToken(context) != null;
}
}
public class LoginWithTwitterActivity extends Activity {
private TwitterLoginButton loginButton;
private static final String TWITTER_KEY="";
private static final String TWITTER_SECRET = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Twitter(authConfig));
setContentView(R.layout.activity_login);
loginButton = (TwitterLoginButton) findViewById(R.id.twitter_login_button);
loginButton.setCallback(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
// The TwitterSession is also available through:
// Twitter.getInstance().core.getSessionManager().getActiveSession()
TwitterSession session = result.data;
// TODO: Remove toast and use the TwitterSession's userID
// with your app's user model
String msg = "@" + session.getUserName() + "でログインしました!";
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
goHome();
}
@Override
public void failure(TwitterException exception) {
Log.d("TwitterKit", "Login with Twitter failure", exception);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Make sure that the loginButton hears the result from any
// Activity that it triggered.
loginButton.onActivityResult(requestCode, resultCode, data);
}
private void goHome(){
final Intent intent=new Intent(LoginWithTwitterActivity.this,PostTweet.class);
startActivity(intent);
}
}
public class Home extends ListActivity{
TweetAdapter adapter;
Twitter twitter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
*アクセストークンが無い場合、認証用アクティビティ起動
*/
if(!TwitterUtils.hasAccessToken(this)){
Intent intent=new Intent(Home.this,LoginWithTwitterActivity.class);
startActivity(intent);
finish();
} else{
adapter = new TweetAdapter(this);
setListAdapter(adapter);
twitter = TwitterUtils.getTwitterInstance(this);
reloadTimeLine();
}
}
public class TweetAdapter extends ArrayAdapter<twitter4j.Status>{
private LayoutInflater inflater;
public TweetAdapter(Context context){
super(context,R.layout.activity_home);
inflater=(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Status item=getItem(position);
TextView name=(TextView)convertView.findViewById(R.id.account_name);
name.setText(item.getUser().getName());
TextView screenName = (TextView) convertView.findViewById(R.id.user_name);
screenName.setText("@" + item.getUser().getScreenName());
TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText(item.getText());
return convertView;
}
}
private void reloadTimeLine() {
AsyncTask<Void, Void, List<Status>> task = new AsyncTask<Void, Void, List<twitter4j.Status>>() {
@Override
protected List<twitter4j.Status> doInBackground(Void... params) {
try {
return twitter.getHomeTimeline();
} catch (twitter4j.TwitterException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(List<twitter4j.Status> result) {
if (result != null) {
adapter.clear();
for (twitter4j.Status status : result) {
adapter.add(status);
}
getListView().setSelection(0);
} else {
showToast("タイムラインの取得に失敗しました。。。");
}
}
};
task.execute();
}
private void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる