2018/12/02

AndroidアプリでGoogleDriceのFucionTablesをAPIで使ってみる

////////// 20181215追記ここから

12/12にGoogleさんからメールが届いていた。
Notice: Google Fusion Tables Turndown というタイトルで。
2019/12/3にサービス終了する、とのこと。

自作アプリのデータ保管先として利用していこうと思ったところだったのに、残念・・・

公式サイトはこちら。
https://support.google.com/fusiontables/answer/9185417?hl=en

////////// 20181215追記ここまで

# なんでやってみた?
GoogleDrive上のスプレッドシートに日々の体重とかを記録している。
最初は件数が少なかったから良かったけど、気づけば4年も記録していて、
比較のグラフなんて見たいと思っても、なかなか大変。

ということで、アプリでその辺をうまくカスタムして、既存のデータはそのまま流用したいと思い、うまいことできないかと調査。
そしたら、GoogleDriveにも簡単なDBを再現したFution Tablesというものがあると判明。

ということで、試してみる。

# やったこと
## Fusion Tables を有効にする
(1)のサイトを参考に、Fusion Tablesを有効にし、空のテーブルを作成。
カラムを想定した内容に変更。
また、「リンクの共有」をOnにし、「リンクを知っている全員」がアクセス
参考サイトでは、スクリプトエディタでデータの操作方法を紹介しているが、今回は割愛。

## Google Drive APIが利用できるようにする
- プロジェクトの作成
(2)のサイトを参考に、プロジェクトを作成。
具体的には下記のサイトにアクセスして作成。
https://code.google.com/apis/console/


- API登録
API登録を行おうとしたが、管理画面が更新されたようで、参考サイトの内容とは異なっていた。
「Identity-Aware Proxy」からAPIの登録ができそう。
画面遷移をすると、「IPAを使用するには、OAuth同意画面を構成する必要があります。」とのことなので、「同意画面を構成」してみる。

すると、「APIとサービス」という画面の「認証情報」の画面に遷移。
左メニューの「ダッシュボード」をクリック。
画面上部の「APIとサービスの有効化」ボタンをクリック。
検索窓に「Fusion」を入力して「Fustion Tables API」が表示されるので、
クリックして「有効にする」をクリック。
これでAPIの登録は完了。

- 認証情報の登録
APIの登録が完了すると、画面が自動遷移し、Fusion Tablesの設定画面に自動遷移。
認証情報を作成する必要がある旨のメッセージが表示されるので、作成してみる。
画面に従って、下記を設定。

1.必要な認証情報の種類を調べる
  - 使用するAPI: Fusion Tables API
  - APIを呼び出す場所: Android(今回はAndroidアプリから呼びたいので)
  - アクセスするデータの種類: ユーザーデータ(なんとなく)
2.OAuth2.0クライアントIDを作成する
  - 名前:適当に設定(Fusion Tablesで作成したTable名に合わせた)
  - フィンガープリント
  ※デバッグ用のフィンガープリントを取得したいので、下記のコマンドを実行する
  ※PW入力を求められるので、デバッグ用証明書のPW「android」を入力する
  ※実行結果のSHA-1 署名証明書フィンガープリントをコピペ
  >   keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
  - パッケージ名:利用対象のAndroidアプリのパッケージ名
  ※Androidアプリのパッケージ名を記入
 →「OAuthクライアントIDを作成」ボタンをクリック
3.OAuth2.0同意画面を設定する
  - メールアドレス:プロジェクトの管理者のアドレスを選択する
  - ユーザーに表示するサービス名:[ProjectName]-Fusion
  ※どのプロジェクトのどのサービスかがわかるようにしたら良さそう
  →「次へ」ボタンをクリック
4.認証情報をダウンロードする
 ※必要に応じてダウンロード
→「完了」ボタンをクリック

完了すると、APIとサービスの画面の認証情報が選択された画面に戻る
作成した認証情報が表示されていればOK。

## APIを利用するAndroidアプリを作っていく
AndroidStudioを起動し、プロジェクトを作成する
特に注意するのはパッケージ名だけで、他は通常のAndroidアプリを作るときと同じ

- Create Android Project
 - Application name
 OAuth2.0クライアントIDを作成した際に設定した「名前」を入力する
 - Company domain
 OAuth2.0クライアントIDを作成した際に設定したパッケージ名を入力する(アプリ名を除いた部分)
 - Project location
 適宜
 - Package name
 OAuth2.0クライアントIDを作成した際に設定したパッケージ名になっていることを確認する
 - Inclode XXXX
 適宜
- Target Android Devices
 今回はスマホでの利用を想定するので、「Phone and Tablet」を選択する
 対象APIバージョンは、自分のスマホに合わせて選択する
- Add an Activity to Mobile
 自分で画面を頑張って作るので「Empty Activity」を選択する
- Configure Activity
 デフォルトの内容のまま

## 作成したプロジェクトの設定を変更していく
- ライブラリ追加
API利用のためにGoogleアカウント認証を利用できるようにする

ファイル: app/build.gradle
内容:
dependencies {
    ...
    compile 'com.google.android.gms:play-services-auth:16.0.1'
    compile 'com.google.android.gms:play-services-drive:16.0.0'
}

- パーミッション追加
インターネット接続のパーミッションを追加する

ファイル: AndroidManifest.xml
内容:
<uses-permission android:name="android.permission.INTERNET" />

- 認証処理の実装
(5)のサイトの「認証処理」の内容を実装する

- データ取得の実装
 (5)のサイトの「テーブル情報の取得」に記載の内容を実装する。
 selectの結果は、JSON形式だが、InputStreamに格納される。
 そのため、InputStreamからString、そしてJSONオブジェクトに変換が必要。
 なお、FusionTablesのレコードは、"rows"に配列で格納されているので、JSONArrayで取得する。
 詳細は(9)のサイトを参照。

 なお、Androidの場合、APIを呼び出すときには非同期で処理する必要がある。
 そして、非同期処理にてUIの変更は禁止されている。
 なので、AsyncTaskクラスを使って非同期で呼び出し&呼び出し後にUI更新を行う。
 具体的には、下記の通り。

  - AsyncTask#doInBackgroundで非同期(別スレッド)でAPIを呼び出す。
    取得した結果をメインスレッドに返却するために、AsyncTaskの第三引数をVoidではなく、返却するオブジェクトの型(例:ListやString)を指定する。
  - AsyncTask#onPostExecuteでdoInBackgroundの処理結果を受け取り、UIを更新する(メインスレッド)

 これでハマって取得したデータを表示できなかった。。。
 また、非同期処理の結果を返却するためのAsyncTaskクラスの宣言にハマった。
 取得したデータは、TableLayoutとTableRowを利用して、表形式で表示した。

- データ登録の実装
 (5)のサイトの「テーブル行追加処理」に記載の内容を実装する。
 取得時と同様に、例外処理は割愛されている。
 Insertの結果もInputStreamで取得可能。内容は、登録した際のrowIDが得られる。

# 感想
FusionTablesを利用したSelectとInsertをAndroidアプリとして実行できるようになった。
また、Androidアプリで表形式でのデータ表示もできるようになった。
ただ、(5)のサイトに紹介されている方法は、SQLを直接実行するようになっている。
FusionTablesはAPI化されているのに、SQL直接実装は格好が悪いように感じた。
なので、もう少し格好良い実装ができないか、追加調査をしてみる。
また、Select/Insertの他にUpdate/Deleteも実装してみたいと思う。
それは別の記事として投稿させていただく。

※なお、作成したソースはGithubで公開したいけど、パスワードとか入っているので、キレイにしてから公開したいと思う。


# 参考サイト
1)GoogleDriveでデータベースを使ったみた
  https://sitest.jp/blog/?p=8701
2)Google APIからGoogle Fusion Tablesに触れる
  http://schima.hatenablog.com/entry/2013/11/28/005648
3)AndroidアプリでGoogle Drive APIを使う
  http://vividcode.hatenablog.com/entry/20130908/1378613811
4)Google Drive APIの有効化とクライアントID、クライアントシークレットの取得方法
  https://www.virment.com/google-drive-api-activate/
5)AndroidからFution Tablesを操作する
 https://qiita.com/kassy_kz/items/4c0ca6571fa3f5004ec1
6)Google Play Serviceのバージョン確認
 https://developers.google.com/android/guides/setup
7)AndroidからAPIを叩いてJSON取って中身を表示させるまで
 https://qiita.com/minme31/items/a9636cb0453524c64e67
8)Google Table Fusions リファレンス(英語)
 https://developers.google.com/fusiontables/docs/v2/reference/
9)Fusion Tables REST API : Query
 https://developers.google.com/fusiontables/docs/v2/reference/query/sql


2018/01/19

XXPayでできるスマホ決済とは

久々の投稿です。
自分向けのメモとして。

モバイルSuicaが登場してから、Suicaと楽天Edyの電子マネーを使っていました。
ここ最近はnanacoも使うようになりました。
一方で、ここ数年でXXPayが出てきました。試しにAndroidPayを入れてみましたが、何だか分からず、特に勉強せずに利用しないでいました。

今日、ふと、何のことか、知りたくなりいくつかのサイトを調べてみました。
お店で支払いをする方法で比較したら分かりやすかったです。

・電子マネー
これまでは、お財布に入れていたお金から支払いをしていた。
それに代わり、スマホに入金しておいたお金で支払いをする。
電子マネーは現金での支払いを電子化(スマホでできるように)した。

・XXPay
これまでは、お財布に入れていたクレジットカードを店員に渡してスキャンして支払いをしていた。
それに代わり、スマホに登録したクレジットカードをスキャナにかざすなどして、支払いをする。
XXPayはクレジットカードでの支払いを電子化(スマホでできるように)した。

と、こんな理解で良さそうな気がします。
クレジットカードを店員に渡してスキャナに通す訳ではないので、より安全だ、ということなんだろうな。