Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

第二回 AndroidでTwitterクライアントの作成(タイムラインの取得)

第三回 AndroidでTwitterクライアントの作成(リプライ機能)

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

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

アプリの作成

Application nameやCompany domainは適当に

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

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

Activityの選択

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

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

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のほうを編集

app/build.gradle
dependencies {

    compile 'com.twitter.sdk.android:twitter-core:3.1.1' // 追記
}

以下は編集後の一例

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を使う前に初期化処理を記述する必要があります。

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

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

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の開発者サイトでアプリを作成し、取得した文字列にそれぞれ変更します。

AndroidManifestへのApplicationの追加

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

android:name=".MyApplication"

以下は例

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で作成します。

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ファイルに以下を記述します。

<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を編集

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を切り替えることで、アカウントの切り替えもできたはずです(未検証)

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を以下のように編集します

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メソッドが呼ばれます。
これらのメソッドの中にログイン成功時や失敗時の処理を記述していきます。

続き

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした