1
/
5

研修2-2 -androidアプリ作成2-

今回、前回触れた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年以降であるならば新しい情報を探すことを強くお勧めします。

株式会社アクシスでは一緒に働く仲間を募集しています
2 いいね!
2 いいね!
同じタグの記事
今週のランキング