今回、前回触れたFabricを使ったTwitterクライアントのコードを紹介していきます。
※Android Studioがインストールされている前提です。
※機能はログイン、タイムラインの表示、メンションの表示、ログアウトです。
メインページにログインボタンを設置し、ログインボタンをクリックするとintent処理で自動的にタイムラインを表示するようになっています。
その後は画面上部のボタンでメンション画面とタイムライン画面を行き来し、ログアウトボタンをクリックすることでログアウトできます。
まずはFabricを導入します。以下のサイトが分かりやすく解説してくれています。
https://www.axesor.co.jp/apps/android-twitter-sdk-login
ここの通りに従っていけばログインボタンの実装ができるようになると思います。
それでは以下に実際のコードをまるっと載せていきます。(認証用のキーのみはご自分で登録したものをお使いください。)
記載するコードは、javaファイル3つ、layoutファイル3つ、manifestファイルの計7つです。
java
-MainActivity.java
-TweetListActivity.java
-MentionActivity.java
layout
-activity_main.xml
-mention.xml
-tweet_list.xml
manifest
-AndroidManifest.xml
※ファイル名が慣習にのっとっていなくて気持ち悪いかと思いますがご容赦ください
これらをそのままコピペし、認証キー、パッケージ名のところだけ書き換えればそれで動く、はずです(2016年5月13日現在)。あとimportに関しても省きましたが、Android Studioのサジェスチョンに従えば問題ないかと思います。
字下げされていないので非常に読みづらいです。実際にAndroid Studioに移してから読んでください。
MainActivity.java
ここではログイン機能と、ログイン後の画面遷移を設定しています。intent、画面遷移などで検索すれば理解できます。
public class MainActivity extends AppCompatActivity {
private static final String TWITTER_KEY = "注!ご自分の認証キーを入れてください!";
private static final String TWITTER_SECRET = "注!ご自分の認証キーを入れてください!";
private TwitterLoginButton loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Twitter(authConfig));
setContentView(R.layout.activity_main);
loginButton = (TwitterLoginButton) findViewById(R.id.twitter_login_button);
loginButton.setCallback(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
startTweetList();
}
@Override
public void failure(TwitterException exception) {
Log.d("TwitterKit", "Login with Twitter failure", exception);
}
});
}
private void startTweetList() {
final Intent intent = new Intent(MainActivity.this, TweetListActivity.class);
startActivity(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result to the login button.
loginButton.onActivityResult(requestCode, resultCode, data);
}
}
TweetListActivity.java
ログイン後に遷移する画面の設定を司ります。OnClick機能やTwitterAPIの使い方について理解が深まりました。TwiiterAPIを利用することで非常に楽にタイムラインやメンションを表示することができます。私はこれを自力でなんとかしようとして詰まりました…。
TwitterAPIは他にもさまざまな機能があるのでぜひ公式のドキュメント(https://docs.fabric.io/)を確認してみてください!
私はできればしばらく目にしたくありません…。
public class TweetListActivity extends ListActivity {
Button bt;
final TweetViewFetchAdapter adapter =
new TweetViewFetchAdapter<CompactTweetView>(
TweetListActivity.this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tweet_list);
setListAdapter(adapter);
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();
StatusesService statusesService = twitterApiClient.getStatusesService();
statusesService.homeTimeline(20, null, null, false, false, false, false, new
Callback<List<Tweet>>()
{
@Override
public void success(Result<List<Tweet>> listResult) {
adapter.setTweets(listResult.data);
}
@Override
public void failure(TwitterException e) {
}
});
bt = (Button) findViewById(R.id.to_mention);
bt.setOnClickListener(new Mention());
}
class Mention implements View.OnClickListener
{
public void onClick(View v)
{
Intent intent = new Intent(TweetListActivity.this, MentionActivity.class);
startActivity(intent);
}
}
}
MentionActivity.java
タイムラインの設定とほとんど同じです。
statusesService.homeTimelineが
statusesService.mentionsTimelineに変わっています。ここがすなわち、何をするAPIかを設定している部分です。なのでここを書き換えれば簡単に他のAPIも利用できます。
引数がそれぞれ異なる点にはご注意下さい。
public class MentionActivity extends ListActivity {
Button bt;
Button btl;
final TweetViewFetchAdapter adapter =
new TweetViewFetchAdapter<CompactTweetView>(
MentionActivity.this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mention);
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();
StatusesService statusesService = twitterApiClient.getStatusesService();
statusesService.mentionsTimeline(20, null, null, false, false,false, new Callback<List<Tweet>>()
{
@Override
public void success(Result<List<Tweet>> listResult) {
adapter.setTweets(listResult.data);
}
@Override
public void failure(TwitterException e) {
}
});
setListAdapter(adapter);
bt = (Button) findViewById(R.id.to_home);
btl = (Button) findViewById(R.id.logout);
bt.setOnClickListener(new Mention());
btl.setOnClickListener(new LogoutClickListener());
}
class Mention implements View.OnClickListener
{
public void onClick(View v)
{
Intent intent = new Intent(MentionActivity.this, TweetListActivity.class);
startActivity(intent);
}
}
class LogoutClickListener implements View.OnClickListener
{
@Override
public void onClick(View v) {
CookieSyncManager.createInstance(MentionActivity.this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeSessionCookie();
Twitter.getSessionManager().clearActiveSession();
Twitter.logOut();
Intent intent = new Intent(MentionActivity.this, MainActivity.class);
startActivity(intent);
}
}
}
activity_main.xml
ログインボタンの配置についてです。特筆すべきことはありません。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="注!ご自分のURIを入れてください!"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.axis.fabric.MainActivity">
<com.twitter.sdk.android.core.identity.TwitterLoginButton
android:id="@+id/twitter_login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
</RelativeLayout>
tweet_list.xml
タイムライン表示画面の設定です。メンションへ向かうボタンとログアウトボタンが設定されています。TweetListActivity.javaにてto_mentionというidのボタンがクリックされるとメンション表示画面に移動するようになっていますので確認してみてください。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="注!ご自分のURIを入れてください!"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/to_mention"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="\@"/>
<Button
android:id="@+id/logout"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="logout"/>
</LinearLayout>
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal|center_vertical"
android:text="@string/empty"/>
<ListView android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
</LinearLayout>
mention.xml
こちらはtweet_list.xmlと対照的に、タイムライン表示画面へ飛ぶボタンが設置されています。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="注!ご自分のURIを入れてください!"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/to_home"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="home"/>
<Button
android:id="@+id/logout"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="logout"/>
</LinearLayout>
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal|center_vertical"
android:text="@string/empty"/>
<ListView android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
</LinearLayout>
AndroidManifest.xml
3つのアクティビティを設定したので、それを記述しています。
また<uses-permission android:name="android.permission.INTERNET" />の文でインターネットにアクセスする許可を出しています。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="注!ご自分のURIを入れてください!"
package="注!ご自分のパッケージ名を入れてください!">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TweetListActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MentionActivity"/>
<meta-data
android:name="io.fabric.ApiKey"
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
以上、私が1週間悩みながらつくった2つ目のアプリです。いくつものサイトで先達の知恵を拝借し、つぎはぎしてどうにか完成しました。
現時点、ネットで公開されているものの中では最も新しく、確実に動くものかと思われます。逆に言えば何かしらのアップデートが行われた後の動作は保証できません!
もしこのページを見たのが2016年5月以降であるならば、エラーと戦いながら最新バージョンに対応してください!ご健闘を祈ります。
そしてもし、このページを見ているのが2017年以降であるならば新しい情報を探すことを強くお勧めします。