第二回 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で進める事にします。
アプリの作成が終わったら以下のようなファイルができていると思います。
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のほうを編集
dependencies {
compile 'com.twitter.sdk.android:twitter-core:3.1.1' // 追記
}
以下は編集後の一例
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をオーバーライドして上記の処理を記述します。
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"
以下は例
<?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で作成します。
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を編集
<?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を切り替えることで、アカウントの切り替えもできたはずです(未検証)
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を以下のように編集します
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メソッドが呼ばれます。
これらのメソッドの中にログイン成功時や失敗時の処理を記述していきます。