第6回 C#で自作Android アプリを作ろう:Twitter APIでファボリストを取得

技術顧問の増田です。前回は、路線APIを使って、生のWeb APIを使ってデータを取得しましたが、いちいちJSON形式やXML形式のデータを分解していくのは手間が掛かります。
有名どころの Web API は、提供側がライブラリを用意してくれたり、有志の方が便利なライブラリを作ってくれたりするので探してみるとよいです。今回は、CoreTweet という Twitter API を扱うライブラリを使って Android アプリを作ります。お気に入り(現在は「いいね」)のリストを取得するためのツールです。

サンプルコードは、http://github.com/moonmile/sg-xamarin-sample の sgFavo フォルダにあります。

CoreTweet とは何か?

CoreTweet https://github.com/CoreTweet/CoreTweet は C#などの.NET言語からTwitter APIをアクセスするためのオープンソースなライブラリです。LINQ を使って検索できたりするのですが、ここでは「いいね」を取ってくるためだけに使います。

nuget.org からもダウンロードができるので、Visual Studio を使ってプロジェクトに手軽に追加することができます。MonoAndroid(いわゆる Xamarin.Android が使うフレームワーク)にも対応しているので、コンソールで動くコードを、そのまま Android 上に持って来ることができます。勿論、Xamarin.iOS でも動きますね。

Twitter APIを利用する

Twitter を使うためにはログインが必要なように、Twitter APIを使うにもログインが必要になります。そこで、OAuth 認証を使うのですが、アプリケーションの API キーの取得などの詳細は、以下を参照してください。

Twitter APIの使い方まとめ
https://syncer.jp/twitter-api-matome

あれこれ頑張ってアプリケーションで使う API KEY と API SECRET を取得して、ログインユーザーから ACCESS TOKEN と ACCESS TOKEN SECRET を作ります。

上のコードでは空欄になっていますが、ここに取得したそれぞれのキー情報が入ります。これを使ってコンソールアプリを作っていきましょう。

コンソールアプリで試してみる

コンソールアプリを作って、ファボの一覧を取得してみましょう。CoreTweet は NuGet で取得してプロジェクトに追加しておきます。

  1. アプリケーションキー等を描き込みます。
  2. アクセストークなどを指定して、CoreTweet.Tokens.Create メソッドを呼び出します。
  3. Favorites#ListAsync メソッドでお気に入りのリストを取得します。最大で20件取得できます。続けて取得するときは、next key を使うのですが、今回は20件だけ使います。
  4. ファボのリストをコンソールに表示します。

結果

実行すると、きちんとデータが取れることが分かります。

Androidで取得してみる

コンソールで動作させたものを、Android でも動かしてみましょう。

デザイナ

デザイナには、ボタンと ListView を貼り付けます。

コード

/// /// private async void Button1_Click(object sender, EventArgs e) { var tokens = CoreTweet.Tokens.Create(ApiKey, ApiSecret, AccessToken, AccessTokenSecret); // ④ var favs = await tokens.Favorites.ListAsync(); var items = new List(); // ⑤ foreach (var it in favs) { items.Add(it); } // var arr = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, lst); var ad = new StatusAdapter(this, items ); // ⑥ lv1.Adapter = ad; // ⑦ text1.Text = $”Count: {items.Count}”; // ⑧ return; } }

ほぼ、コンソールアプリのときと同じですが、ListView に表示するときのちょっとだけ工夫しています。

  1. 自作ツールなので、アプリキーなどは直書きで。
  2. 各種コントロールの名前を取得
  3. ボタンをタップしたときに、Twitter APIにアクセスする
  4. CoreTweet の呼び出しは、コンソールアプリと同じです。
  5. ListView に表示するために List コレクションに直します。ツイートの中身は Status クラスに入っているので、そのまま使います。
  6. 通常の ArrayAdapter を使うと、ToString メソッドをオーバーライドしないといけないのと、1行の文字列しか使えないので、独自に StatusAdapter クラスを作ります。
  7. 独自の StatusAdapter クラスのオブジェクトを Adapter プロパティに設定します。
  8. ファボの数をテキストに表示させます。

ListView の表示は、BaseAdapter クラスを継承した、カスタムのアダプターを作ると、項目となるクラス(ここでは、CoreTweet.Statusクラス)と、表示の結び付けができます。MVVM パターンのバインドみたいなものですね。

カスタムのアダプタは、BaseAdapterを継承した定番の処理になります。

  1. BaseAdapterクラスを継承します。
  2. Activity を保持します。通常は、MainActivity が渡されるはずです。
  3. 項目を List コレクションで保持しておきます。
  4. コンストラクタです。
  5. インデックスで、項目を返す定番
  6. 項目数を返す定番
  7. IDを返す定番です。ここでは Twitte の ID を返しています。これだと正確にはユニークにならないのですが…まあ、一応。ユニークでさえあればよいので、position を返しても構いません。
  8. 表示されるときに呼び出されます。ここが、表示の肝です。
  9. 初回は、convertView が null なので、レイアウトを設定します。ここでは、既存の Android.Resource.Layout.SimpleListItem2 を設定しています。2行使える項目のレイアウトです。
  10. position で指定項目を取り出して、
  11. テキストに表示します。リソースは、Android.Resource.Id.Text1 のようにあらかじめ指定された ID があります。

ListView の項目は、Windows 10 のスタート画面の作り方と似ています。

実行

実行すると、うまくスクリーン名(User.Name)と、ツイートの内容(Text)が表示されていることがわかります。

ListViewをカスタムする

ListView の項目をもう少しツイッターっぽく変えてみましょう。既存のレイアウトだけでは無理な場合は、カスタムの axml を作って、ListView の項目レイアウトにすることができます。

CustomRow.axml を追加する

ソリューションエクスプローラーで、sgFavo プロジェクトに axml ファイルを追加します。

CustomRow.axml のデザイン

デザインは、こんな感じに作っています…が、デザイナで全てあれこれやるのは大変なので、直接 axml ファイルを編集します。

CustomRow.axml

CustomRow.axml のコードは、こんな風になっています。TextView や ImageView に名前を付けておくことで、MainActivity.cs から参照ができます。

コード

MainActivity クラスは、既存テンプレートを作ったときと同じものを使えます。ここでは、StatusAdapter クラスの GetView メソッドの内容を書き替えます。

  1. CustomRow.axml で記述した TextView に User.Name と Text を割り当てます。
  2. ツイートした人のアイコンを表示させます。User.ProfileImageUrl に画像のURLがあります。直接 async/await は使えないので、
  3. ContinueWith メソッドで、画像データの取得の終了時に表示されるようにします。
  4. 非同期で、ツイッターのアイコンを取得する関数です。
  5. 画像データをダウンロードして、ImageView に表示すするための Bitmap データを作ります。これは Windows の Bitmap と違う(ハズ)なので、適宜 Stream 経由で扱うとよいでしょう。

プロフィールのアイコンを、非同期で読み込むところがミソですよね。

結果

プロフィールアイコンの読み込みがちょっと遅い(リストを動かさないと更新されない?)のが難点ですが、ひとまず、画像までも含めて Twitter のファボを取ってくることができます。

まとめ

CoreTweet のようなライブラリを使うと Web API が簡単にアクセスできるようになります。開発規模にもよるのですが、機能が豊富な Web API の場合は利用するライブラリを作る、単機能でアクセスできる場合は Web API を直接使う、という使い分けをするとよいでしょう。

さて、ここまで Web API はデータの取り出しだけやってきましたが、次回はデータの登録をするための Web API を呼び出してみたいと思います。アンケートに答える Android アプリを使って、サーバーにアップロードする仕組みを解説します。

次回も、お楽しみに。

増田 ( 技術顧問 )@moonmile, Microsoft MVP

この記事を書いた人:増田 ( 技術顧問 )@moonmile, Microsoft MVP

システムガーディアン技術顧問。趣味はセミアコでブルースを弾くことと農園でラズベリーを育てることとF#でプログラミングすること。仕事は、ええ、びしびしとプログラミング技術を鍛えることと、ばしばしとC#でプログラムコードを書くことです。

この記事に関してのお問い合わせ
御連絡・ご返信は原則2営業日以内を予定しております。
お急ぎの場合は、お手数ですが下記電話でもご対応をしております。

システムガーディアン株式会社
受付時間:平日9:00~18:00
受付担当:坪郷(つぼごう)・加藤
電話:03-6758-9166