Android StudioでFabricのTwitter Kit使ってみた

表題の通り、FabricのTwitter Kitを使ってログイン処理、タイムライン取得を実装してみました。 GitHubにあげましたので、よかったら使ってください。(ここです)

*既にFabricの登録を済ませてpluginを導入している前提で話を進めます。

Twitter Kit for Androidは要確認です。見てください。(後からでも...)

まず、Android Studioにて、下記のようにFile→New Projectから新規プロジェクトを作成します。

f:id:venture14:20150119204724p:plain

今回は下記のように設定しました。自由に変えてください。

f:id:venture14:20150119204725p:plain

Blank Activityを選択し、nextボタンをクリック。そして、最後にfinishボタンをクリックしてください。

f:id:venture14:20150119204726p:plain

ここまでで、hello,world!を表示するアプリができました。

いよいよ、こっからが本題です。 次に、Fabricのボタンを押して、Twitter Kitをインストールします。

f:id:venture14:20150119204727p:plain

あとは勝手にインストールしてくれるので、そのまま進めちゃいましょう。 終わったら、backボタンではじめの画面に戻ります。 すると、InstallからPending..に代わっていることが分かります。

f:id:venture14:20150119204728p:plain

この時点で、ソースコードがどのように変化したか確認してみてください。(ここをチェック)

では、ログインボタンを実装していきます。

MainActivity.java

public class MainActivity extends ActionBarActivity {

    // Note: Your consumer key and secret should be obfuscated in your source code before shipping.
    private static final String TWITTER_KEY = "your_twitter_key";
    private static final String TWITTER_SECRET = "your_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);
        setUpViews();
    }

    private void setUpViews() {

        loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
               startTweetList();
            }

            @Override
            public void failure(TwitterException exception) {
                // Do something on failure
            }
        });
    }
  .....

activity_main.xml

<com.twitter.sdk.android.core.identity.TwitterLoginButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/login_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>

f:id:venture14:20150119204730p:plain

twitterボタンをクリックし、認証処理後の画面遷移処理、Intentでオブジェクトを渡しています。

 private void startTweetList() {
        final Intent intent = new Intent(MainActivity.this,
                TweetListActivity.class);
        startActivity(intent);
    }

最終的にMainActivityは以下のようになります。
MainActivity.java

public class MainActivity extends ActionBarActivity {

    // Note: Your consumer key and secret should be obfuscated in your source code before shipping.
    private static final String TWITTER_KEY = "your_twitter_key";
    private static final String TWITTER_SECRET = "your_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);
        setUpViews();
    }

    private void setUpViews() {

        loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
               startTweetList();
            }

            @Override
            public void failure(TwitterException exception) {
                // Do something on failure
            }
        });
    }

    private void startTweetList() {
        final Intent intent = new Intent(MainActivity.this,
                TweetListActivity.class);
        startActivity(intent);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @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);
    }
}

ログイン後にタイムラインからtweetを取得する、TweetListActivity,tweet_list.xmlは以下の通りです。 今回は、最新のtweetから20件取得するようにしました。

TweetListActivity.java

public class TweetListActivity extends ListActivity {

    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();
        // statusAPI用のserviceクラス
        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) {
                    }
                });

    }

}

tweet_list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <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>

app/res/values/strings.xmlにemptyを追加。
strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">FabricSample</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="hello_blank_fragment">Hello blank fragment</string>
    <string name="empty">oops, this is empty.</string>

</resources>

AndroidManifest.xmlへActivityの追加も忘れずに。

f:id:venture14:20150119204732p:plain

では、起動してみましょう。

f:id:venture14:20150119212048p:plain

Fabricで設定したproject名、今回作成したアプリのpackage名ですね。 ログイン処理を行いましょう。 すると、、、

f:id:venture14:20150119212118p:plain

最新のtweetが取得できていますね。

念のため、Android エミュレータからだけでなく、スマホ(PC)からも確認して整合性をみてみましょう。

ソースはここに置いてます。FabricSample