第一回 AndroidでTwitterクライアントの作成（認証まで）

[第二回　AndroidでTwitterクライアントの作成(タイムラインの取得)](https://qiita.com/owll/items/7a1d66b9fe97a87ebecc)

[第三回 AndroidでTwitterクライアントの作成(リプライ機能)](https://qiita.com/owll/items/47a879b3b0db3f22f46b)

FabricのTwitter Kitを使用してTwitterの認証を行なってみます

Twitter Kitを使うと、ログイン状態の永続化をしてくれたり、認証画面を１から作らずともTwitter公式アプリと連携してよしなにやってくれるので比較的少ない手間でログインの処理を実装することができます

##アプリの作成
Application nameやCompany domainは適当に

なお今回は以下で進めます

Application name:  mytwitterapp
Company domain:  www.my_twitter_client_app.com


###Activityの選択
今回は一番シンプルなEmpty Activityで進める事にします。

アプリの作成が終わったら以下のようなファイルができていると思います。

```Java:MainActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

```

##Twitter Kitのライブラリを導入
公式
https://dev.twitter.com/twitterkit/android/installation


以下の一行をapp/build.gradleのdependencies内に追記します。

build.gradleはモジュール(Module:app)とプロジェクト全体(Project:プロジェクト名)の2種類あるので注意。
Module:appのほうを編集

```gradle:app/build.gradle
dependencies {
    
    compile 'com.twitter.sdk.android:twitter-core:3.1.1' // 追記
}
```
以下は編集後の一例

```gradle:app/build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.my_twitter_client_app.www.mytwitterapp"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.twitter.sdk.android:twitter-core:3.1.1' //追記した行
    testCompile 'junit:junit:4.12'
}
```

追記したら、編集したときに表示される右上の「Sync Now」を押して設定を反映させます。
反映させてエラーが出ないか確認。

##Twitter Kitの初期化

Twitter Kitを使う前に初期化処理を記述する必要があります。

```Java:初期化処理の例
TwitterConfig config = new TwitterConfig.Builder(this)
                .logger(new DefaultLogger(Log.DEBUG))
                .twitterAuthConfig(new　TwitterAuthConfig(CONSUMER_KEY, CONSUMER_SECRET))
                .debug(true)
                .build();
Twitter.initialize(config);
```

初期化処理はMainActivityなどで行ってもいいですが、アプリケーション起動時に１度だけ呼ばれればいいので、今回はカスタムApplicationクラスを利用してみます。

Applicationクラスを継承したクラスを作成し、onCreateをオーバーライドして上記の処理を記述します。

```Java:MyApplication.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.app.Application;
import android.util.Log;

import com.twitter.sdk.android.core.DefaultLogger;
import com.twitter.sdk.android.core.Twitter;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterConfig;

public class MyApplication extends Application {

    private static final String CONSUMER_KEY = "自分のCONSUMER_KEYに書き換える";
    private static final String CONSUMER_SECRET = "自分のCONSUMER_SECRETに書き換える";
    
    @Override
    public void onCreate() {
        super.onCreate();

        TwitterConfig config = new TwitterConfig.Builder(this)
                .logger(new DefaultLogger(Log.DEBUG))
                .twitterAuthConfig(new TwitterAuthConfig(CONSUMER_KEY, CONSUMER_SECRET))
                .debug(true)
                .build();
        Twitter.initialize(config);
    }
}
```
package名は適宜自分の作成したものに読み替えてください。

CONSUMER_KEYとCONSUMER_SECRETは[Twitterの開発者サイト](https://dev.twitter.com/)でアプリを作成し、取得した文字列にそれぞれ変更します。



###AndroidManifestへのApplicationの追加
MyApplicationを有効にするため、以下の一行をAndroidManifest.xmlに追記します。


```xml:
android:name=".MyApplication"
```

以下は例

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my_twitter_client_app.www.mytwitterapp">

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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=".LoginActivity"></activity>
    </application>

</manifest>

```

##ログイン画面の作成

ログイン画面を作成するため、新しくLoginActivityという名前でActivityを作成します。
今回はMainActivityのときと同じく、種類はEmpty Activityで作成します。

<!--
Activityを新しくつくる時は、作りたいフォルダの上で右クリックし、New→Activity→Galleryからつくることができます。
今回はMainActivityと同じフォルダに作成しました。
-->

```Java:LoginActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }
}

```
###Twitter認証ボタンの追加


Twitter認証ボタンをログイン画面に表示させるため、LoginActivityのxmlファイルに以下を記述します。

```xml:
<com.twitter.sdk.android.core.identity.TwitterLoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
```
activity_login.xmlを編集

```xml:activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.my_twitter_client_app.www.mytwitterapp.LoginActivity">

    <com.twitter.sdk.android.core.identity.TwitterLoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>
```

xmlのデザインタブでボタンが正しく表示されていることを確認します。

##MainActivity起動時にLoginActivityに遷移するようにする

MainActivityを以下のように編集します。
ログインしていない時だけLoginActivityに遷移するようにしています。

セッションが存在したらログイン中と表示し、画面遷移は行いません。

ちなみに複数のSessionを登録してActiveSessionを切り替えることで、アカウントの切り替えもできたはずです（未検証）

```Java:MainActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.twitter.sdk.android.core.TwitterCore;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (TwitterCore.getInstance().getSessionManager().getActiveSession() == null) {
            Intent intent = new Intent(this, LoginActivity.class);
            startActivity(intent);
        } else {
            Toast toast = Toast.makeText(MainActivity.this, "ログイン中", Toast.LENGTH_LONG);
            toast.show();
        }
    }
}

```

アプリを実行してみて、TwitterLoginButtonが有効な状態で表示されていればokです。
Twitter Kitの初期化処理が行われていないとTwitterLoginButtonは有効にならないみたいです。

##ログイン処理の作成

LoginActivityを以下のように編集します

```Java:LoginActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;

public class LoginActivity extends AppCompatActivity {

    private TwitterLoginButton loginButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                // Do something with result, which provides a TwitterSession for making API calls

                Toast toast = Toast.makeText(LoginActivity.this, "ログイン成功", Toast.LENGTH_LONG);
                toast.show();
            }

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

                Toast toast = Toast.makeText(LoginActivity.this, "ログイン失敗", Toast.LENGTH_LONG);
                toast.show();
            }
        });
    }

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

```

認証成功したらsuccessメソッドが呼ばれ、失敗したらfailureメソッドが呼ばれます。
これらのメソッドの中にログイン成功時や失敗時の処理を記述していきます。

[続き](https://qiita.com/owll/items/7a1d66b9fe97a87ebecc)