TreasureData + Android SDK


## はじめに
TreausureDataにTreasureData社が提供している`Android SDK`を用いてデータをアップロードする方法を記載します。

設定方法についてはTreasureData社のドキュメントサイトで[動画](http://ybi-docs.idcfcloud.com/articles/android-sdk 動画)で紹介されており、今回の投稿はほぼその内容と同じになります。。。合わせてご確認ください。

`TreasureData Android SDK`の利用には、maven経由で利用する方法とjarファイルを直接読み込む二つの方法があります。

今回はjarファイルを直接読み込む方法について記載します。

## 環境
以下環境情報になります。

* OS: Mac OS X 10.9.5
* Android Studio: 0.8.6
* Android: 4.0.3
* TreasureData Android SDK: 0.1.5(2014/10/22時点最新)

## 前提条件
以下前提条件となります。

* Android Studioがインストール済みであること
* TreasureDataアカウントを持っていること。

注：今回も日本版TreasureDataである`Yahoo!ビッグデータインサイト`に対して実施しました。AWS版のTreasureDataを利用の方はEndpointを読み替えて実施してください。

## Step:1 サンプルプロジェクトの作成

### Step1-1: プロジェクト名の指定
Android Studioを起動します。
`Application name`、`Company Domain`に適当な名前を入力してNextボタンを押下します。
ここでは`TDAndroidSDKTest`、`hogehoge.com`を入力しています。
![andsdk_create_project_1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/c2ab04fd-1fb0-4937-f76f-c76cb271aa72.png "andsdk_create_project_1.png")

### Step1-2: 実行環境の指定
今回は`Phone and Tablet`で`Android4.0.3`を指定しています。

![andsdk_create_project_2.png](https://qiita-image-store.s3.amazonaws.com/0/46472/f3c4fc60-dacc-799c-87d6-5c808d1b77a9.png "andsdk_create_project_2.png")

### Step1-3: Activityの指定
今回は`Blank Activity`を指定して、Nextボタンを押下します。

![andsdk_create_project_3.png](https://qiita-image-store.s3.amazonaws.com/0/46472/215ba451-bd1f-34e8-d62f-e020e3f2645f.png "andsdk_create_project_3.png")

### Step1-4: Activity名の指定
適当な名前を指定して、Finishボタンを押下します。

![andsdk_create_project_4.png](https://qiita-image-store.s3.amazonaws.com/0/46472/ade09658-3076-e24f-da1d-0bbbc535b95c.png "andsdk_create_project_4.png")

Finishボタン押下後、しばらくすると以下のようなプロジェクトが表示されているはずです。

![andsdk_create_project_5.png](https://qiita-image-store.s3.amazonaws.com/0/46472/87fb0fa9-8a47-5dab-bc17-8889506176a5.png "andsdk_create_project_5.png")

## Step2: TreasureData Android SDKのインポート
### Step2-1: TreasureData Android SDKのダウンロード
[ダウンロードサイト](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.treasuredata%22%20AND%20a%3A%22td-android-sdk%22 ダウンロードサイト)から`TreasureData Android SDK`をダウンロードしてきます。

今回はjarファイルでプロジェクトにインポートするので、`shaded.jar`をダウンロードしてきます。
`jar`というリンクからダウンロードした`td-android-sdk-0.1.5.jar`では正常に機能しませんのでご注意ください。

### Step2-2: TreasureData Android SDKのインポート
ダウンロードした`td-android-sdk-0.1.5-shaded.jar`をクリップボード上にコピーします。
そしてプロジェクトのlibsディレクトリ上でペーストすることでインポートすることができます。
デフォルトのままOKボタンを押下してください。

![andsdk_sdk_import_1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/e26e6694-4826-0a78-abc5-12aaa621b82f.png "andsdk_sdk_import_1.png")

### Step2-3: TreasureData Android SDKの設定
インポートした`td-android-sdk-0.1.5-shaded.jar`で右クリックして`Add As Library`を選択します。

![andsdk_sdk_import_3.png](https://qiita-image-store.s3.amazonaws.com/0/46472/d3eaaa4b-a57b-b924-c583-5cda52ff2843.png "andsdk_sdk_import_3.png")

そうすることでbuild.gradleに
`compile files('libs/td-android-sdk-0.1.5-shaded.jar')`が追加されます。

これで`TreasureData SDK`を使う準備が整いました。

### Step2-4: Internet接続設定
デフォルトだとAndroidアプリケーションがインターネットに接続できないので、
TDAndroidSDKTest > app > src > main > res > AndroidManifest.xml
を以下のように編集します。

```file:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hogehoge.tdandroidsdktest" >

    <uses-permission android:name="android.permission.INTERNET"/> /* Add For TD */
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".TdTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```


## Step3: WriteOnly Api-Keyの取得
### Step3-1: WebConsoleにログイン
[WebConsole](https://console-ybi.idcfcloud.com/users/sign_in WebConsole)にアクセスしてLog inします。

![signin_1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/37e7420e-2402-301d-77fc-8bf1c124c478.png "signin_1.png")

### Step3-2: My Profile画面の表示
ヘッダメニュ > Account名 > My Profile
でMy Profile画面を表示させます。
![console_myprofile.png](https://qiita-image-store.s3.amazonaws.com/0/46472/f0650e34-4675-4325-cac5-d9e48d2c4c1c.png "console_myprofile.png")

### Step3-3: Show Keys

`API Keys`パネルでアカウントのパスワード入力後に`Show Keys`ボタンを押下します。

![console_getapi1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/df64ea9a-2824-f999-9c2a-61780e1b84f7.png "console_getapi1.png")


### Step3-4: WriteOnly API-Keyの取得
これでWriteOnly API-Keyが表示されるはずです。
まだ取得していいなければ、`Generate New`ボタンを押下して取得してください。

![console_getapi2.png](https://qiita-image-store.s3.amazonaws.com/0/46472/38a4515a-c814-0343-dd73-56f2e5596596.png "console_getapi2.png")

## Step4: アップロード先DB/TABLE作成
### Step4-1: WebConsoleにログイン
アップロード先となるDB/TABLEを作成します。
[WebConsole](https://console-ybi.idcfcloud.com/users/sign_in WebConsole)にアクセスしてLog inします。

![signin_1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/37e7420e-2402-301d-77fc-8bf1c124c478.png "signin_1.png")

### Step4-2: DB作成
サイドメニュのDatabaseタブをクリックします。
![console_db_create_1_no_name.png](https://qiita-image-store.s3.amazonaws.com/0/46472/0eac0b61-7bc8-c0eb-e1b5-ede67102108d.png "console_db_create_1_no_name.png")

Database名を入力してCreateボタンを押下します。
ここでは、`android_sdk_db`と入力します。
![console_db_create_2_no_name.png](https://qiita-image-store.s3.amazonaws.com/0/46472/f410c51c-8f45-6fba-607a-a1e4eda70f10.png "console_db_create_2_no_name.png")

### Step4-3: Table作成
続けて`android_sdk_db`DB画面で`Create Table`ボタンを押下します。

![andsdk_sdk_db.png](https://qiita-image-store.s3.amazonaws.com/0/46472/063f0200-712d-870f-cddb-e681dbd669a8.png "andsdk_sdk_db.png")


そしてテーブル名を入力して`Create Table`ボタンを押下してテーブルを作成します。
ここでは`android_sdk_table`としています。

![andsdk_sdk_table.png](https://qiita-image-store.s3.amazonaws.com/0/46472/52620a17-b3be-53d7-7266-85590b6cf95b.png "andsdk_sdk_table.png")


## Step5: Android SDKの埋め込み
Step1で作成したサンプルプロジェクトに`TreasureData Android SDK`を埋め込んでみます。

今回はアプリケーションが起動されたときに最初に実行されるonCreateメソッドに埋め込みます。

### Step5-1: ソースの埋め込み
TDAndroidSDKTest > app > src > main > java > com.hogehoge.tdandroidsdktest > TdTestActivity.javaのソースは以下となります。

```file:TdTestActivity.java
package com.hogehoge.tdandroidsdktest;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

/* TreasureData SDK import */
import com.treasuredata.android.*;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;

public class TdTestActivity extends Activity {

    private TreasureData td; /* オブジェクトの作成 */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_td_test);
		/* TreasureData SDK Setting */
        TreasureData.initializeApiEndpoint("https://mobile-ybi.jp-east.idcfcloud.com"); /* API Endpointの設定 */
        TreasureData.initializeDefaultApiKey("xxxxxxx09d147de381c3fd23c47035132dxxxxxxx"); /* WriteOnly API-Keyの設定 */
        try {
            td = new TreasureData(this);
            Map<String, Object> activation_event = new HashMap<String, Object>(); /* 送信用データオブジェクトの作成 */
            activation_event.put("action", "起動"); /* データ格納 */
            td.addEvent("android_sdk_db", "android_sdk_table", activation_event); /* DB, Table, データセット */
            td.uploadEvents(); /* データ送信 */
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.td_test, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
```

## Step6: エミュレーターの起動
エミュレーターを起動します。

`Hello World`と表示される簡単なアプリケーションとなります。
アプリケーション起動時にTreasureDataにデータがアップロードされているはずです。

![andsdk_sdk_emulator.png](https://qiita-image-store.s3.amazonaws.com/0/46472/3e7e4709-7d3e-92db-f686-0f9bf1f93b85.png "andsdk_sdk_emulator.png")


## Step7: データアップロードの確認
以下ページロード後のandroid_sdk_db.android_sdk_tableの全件検索結果となります。
TreasureData社が提供するCLIで取得しております。

actionカラムには`起動`というデータが格納されていることがわかると思います。
timeカラムの値はAndroid SDKから送信された時間のUnix時間となります。

```output:query_result
$ td query -w -t presto -d android_sdk_db "SELECT * FROM android_sdk_table"
...省略...
+--------+------------+                                                     
| action | time       |
+--------+------------+
| 起動     | 1413966956 |
+--------+------------+
1 row in set
$
```

## おわりに
ソース自体は
[GitHub](https://github.com/treasure-data/td-android-sdk GitHub)にありますので、より詳細な内容を知りたい場合は参照してください。