Treasure Data Android および Android TV SDK を使用することで、Treasure Data サービスを標準的な Android アプリや Android TV アプリに統合できます。これは、Android および Android TV アプリケーションのイベントを Treasure Data に簡単にインポートする方法です。
- Android 開発の基礎知識
- Android Pie 以降。自動トラッキングは API 28(Android 9.0)以降で動作する Android デバイスのみをサポートします
- Treasure Data の基礎知識
- Android SDK Releasesへのアクセス
- GDPR への準拠の確認
バージョン 1.0.0 には、以前のバージョンとの後方互換性がない大きな変更があります。バージョン 0.6.0 以前からアップグレードする場合は、以下の手順を実行しないとコードが正しく動作しません:
- API エンドポイントが Ingestion エンドポイントに変更されました。デフォルト値は [ https://us01.records.in.treasuredata.com ] です。
initializeApiEndpoint(String apiEndpoint)API は使用できなくなりました。代わりにinitializeSharedInstance(Context context, String apiKey, String apiEndpoint)を使用してください。uuidは予約されたカラム名になりました。イベントのuuidキーに値を追加しようとしても、データベースにカラムが表示されません。td_ipフィールドを追加することによるクライアント ID の自動トラッキングはサポートされなくなりました。代わりに、新しいenableAutoTrackingIPおよびdisableAutoTrackingIPAPI を使用してください。
以下の動画は Android SDK のインストール方法を示しています。
Treasure Data ライブラリをプロジェクトに追加します。Gradle、Maven、および Jar ファイルを使用する例を以下に示します。
// build.gradle に以下を追加
dependencies {
implementation 'com.treasuredata:td-android-sdk:1.0.0'
}// pom.xml に以下を追加
<dependency>
<groupId>com.treasuredata</groupId>
<artifactId>td-android-sdk</artifactId>
<version>1.0.0</version>
</dependency>1) 最新の td-android-sdk-x.x.x-shaded.jar パッケージを以下からダウンロード
https://central.sonatype.com/search?q=g:com.treasuredata%20%20a:td-android-sdk&smo=true
2) .jar を YOUR_ANDROID_PROJECT/libs フォルダに追加この SDK にはサンプル Android アプリケーションプロジェクトがあります。pom.xml が良い参考になります。
まだ存在しない場合は、AndroidManifest.xml ファイルに INTERNET パーミッションを追加します。以下のエントリは <manifest> .. </manifest> タグの間に記述する必要があります。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.treasuredata.android.demo"
android:versionCode="1"
android:versionName="1.0" >
...
<!-- 必要なパーミッション -->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>詳細は Android Manifest の例をご覧ください。
会社のデータプライバシー責任者および法務顧問とデータ収集ポリシーを確認し、どのような個人情報を収集すべきかを判断する必要があります。個人のトラッキングを有効にする場合は、個人ユーザーのトラッキングへのオプトインを追跡するために、同意管理システムも統合することをお勧めします。
さまざまな領域、特に EU の GDPR におけるデータプライバシー規制に準拠するため、Treasure Data Android SDK は個人を特定できる特定のイベントメタデータをデフォルトでは収集しません。具体的には、以下の情報はデフォルトでは収集されません:
td_uuid- クライアントの識別子で、このデバイス上のこのアプリケーションのこのインストールに固有です。
td_uuid は、個々のユーザーを追跡し、ユーザーセッション内およびセッション間でデータを分析し、追跡された行動を実在の個人と関連付けるなどを行う場合に必要です。
ユーザーの同意を得た後、個人データの収集を有効にできます。例:
td.enableAutoAppendUniqId();テスト時には、収集している情報を確認し、意図した個人情報のみが含まれ、それ以上のものが含まれていないことを確認してください。
Android SDK の UUID について詳しく学んでください。
効率的な API 呼び出しのために、Application サブクラスの onCreate() メソッドで TreasureData 共有インスタンスを初期化することを強くお勧めします。
public class ExampleApp extends Application {
@Override
public void onCreate() {
// Treasure Data Android SDK の初期化
TreasureData.initializeEncryptionKey("RANDOM_STRING_TO_ENCRYPT_DATA");
TreasureData.disableLogging();
TreasureData.initializeSharedInstance(this, "YOUR_API_KEY", "API_ENDPOINT");
TreasureData.sharedInstance.setDefaultDatabase("your_application_name");
TreasureData.sharedInstance.setDefaultTable("your_event_name");
TreasureData.sharedInstance.enableAutoAppendUniqId();
TreasureData.sharedInstance.enableAutoAppendModelInformation();
TreasureData.sharedInstance.enableAutoAppendAppInformation();
TreasureData.sharedInstance.enableAutoAppendLocaleInformation();
}
}YOUR_API_KEY は、実際の apikey 文字列に置き換える必要があります。API キーは、TD Console のプロファイルから取得できます。Write-only API key の使用が推奨されます。
その後、TreasureData.sharedInstance() メソッドを使用して、どこからでも共有インスタンスを使用できます。
public class ExampleActivity extends Activity {
public void onDataLoadSomethingFinished(long elapsedTime) {
Map<String, Object> event = new HashMap<String, Object>();
event.put("data_type", "something");
event.put("elapsed_time", elapsedTime);
TreasureData.sharedInstance().addEvent("events", event);
}
}ローカルバッファにイベントを追加するには、addEvent または addEventWithCallback API を呼び出します。
View v = findViewById(R.id.button);
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Map event = new HashMap<String, Object>();
event.put("id", v.getId());
event.put("left", v.getLeft());
event.put("right", v.getRight());
event.put("top", v.getTop());
event.put("bottom", v.getBottom());
td.addEvent("testdb", "demotbl", event);
}
});View v = findViewById(R.id.button);
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Map event = new HashMap<String, Object>();
event.put("id", v.getId());
event.put("left", v.getLeft());
event.put("right", v.getRight());
event.put("top", v.getTop());
event.put("bottom", v.getBottom());
td.addEventWithCallback("testdb", "demotbl", event, new TDCallback() {
@Override
public void onSuccess() {
Log.i("ExampleApp", "success!");
}
@Override
public void onError(String errorCode, Exception e) {
Log.w("ExampleApp", "errorCode: " + errorCode + ", detail: " + e.toString());
}
});
}
});イベントをインポートするデータベースとテーブルを指定します。データベースとテーブルの合計長は 256 文字未満である必要があります。各テーブルは最大 10000 イベントをキャッシュします。
さらに、イベント内のキーの長さは 256 文字を超えてはならず、イベント内の値の長さは 10000 文字を超えてはなりません。
バッファされたイベントを Treasure Data にアップロードするには、uploadEvents または uploadEventsWithCallback API を使用します。
アプリケーションのニーズによって、バッファされたイベントをいつ、どのくらいの頻度でアップロードするかが決まります。以下をお勧めします:
- 現在の画面が閉じているとき、またはバックグラウンドに移動するとき
- アプリケーションを閉じるとき
findViewById(R.id.upload).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// この API を呼び出して、いつでもバッファされたイベントをアップロードできます。
td.uploadEvents();
return false;
}
});findViewById(R.id.upload).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// この API を呼び出して、いつでもバッファされたイベントをアップロードできます。
td.uploadEventsWithCallback(new TDCallback() {
@Override
public void onSuccess() {
Log.i("ExampleApp", "success!");
}
@Override
public void onError(String errorCode, Exception e) {
Log.w("ExampleApp", "errorCode: " + errorCode + ", detail: " + e.toString());
}
});
return false;
}
});バッファされたイベントをいつ、どのくらいの頻度でアップロードするかは、アプリケーションの特性によって異なります。しかし、少なくとも以下のタイミングでアップロードすることをお勧めします。
現在の画面が閉じているとき、またはバックグラウンドに移動するとき アプリケーションを閉じるとき 送信されたイベントは、Treasure Data ストレージにインポートされる前に数分間バッファされます。
基本を理解したところで、使用できるいくつかの高度なメソッドとプラクティスを紹介します。
SDK は、これらの機能を組み合わせた 1 つのスタイルでイベントをインポートします:
- この SDK は、一意のキーを追加してバッファされたイベントを保持し、イベントがサーバー側にアップロードされ保存されたことを確認するまで、アップロードを再試行します(少なくとも 1 回)
- サーバー側は、デフォルトで過去 1 時間以内のすべてのイベントの一意のキーを記憶し、重複インポートを防ぐことができます。
重複排除は、同じ識別子を持つレコードが同じデータセット内で、最大で過去 1 時間以内または過去 4096 レコード以内のいずれか早い方で見られた場合に、重複レコードを識別するベストエフォートシステムです。
テーブル、データベース、または任意のテーブルやデータベースに追加されたイベントに対して、キーの値を自動的に設定したい場合は、デフォルト値を設定します。同じキーに複数のデフォルト値が設定されている場合、新しく追加されたイベントには、以下の順序でデフォルト値が適用され、上書きされます:
- すべてのテーブルとデータベースを対象とするデフォルト値が最初に適用されます。
- データベース内のすべてのテーブルを対象とするデフォルト値が適用されます。
- イベントが追加されるテーブルを対象とするデフォルト値が適用されます。
- イベントが追加されるテーブルとデータベースを対象とするデフォルト値が適用されます。
- 最後に、イベントがキーの値を持っている場合、その値がすべてのデフォルト値を上書きします。
TreasureData.sharedInstance().setDefaultValue(null, null, "key", "Value"); // すべてのデータベースとテーブルを対象
TreasureData.sharedInstance().setDefaultValue("database_name", null, "key", "Value"); // データベース "database_name" のすべてのテーブルを対象
TreasureData.sharedInstance().setDefaultValue(null, "table_name", "key", "Value"); // "table_name" という名前のすべてのテーブルを対象
TreasureData.sharedInstance().setDefaultValue("database_name", "table_name", "key", "Value"); // データベース "database_name" のテーブル "table_name" を対象String defaultValue = (String) TreasureData.sharedInstance().getDefaultValue("database_name", "table_name", "key"); // データベース "database_name" とテーブル "table_name" を対象とするキーのデフォルト値を取得TreasureData.sharedInstance().removeDefaultValue("database_name", "table_name", "key"); // データベース "database_name" とテーブル "table_name" を対象とするデフォルト値のみを削除startSession メソッドを呼び出すと、SDK はセッション ID を生成し、endSession が呼び出されるまで保持します。セッション ID は列名 "td_session_id" として出力されます。また、startSession と endSession メソッドは {"td_session_event":"start" または "end"} を含むイベントを追加します。
@Override
protected void onStart(Bundle savedInstanceState) {
:
TreasureData.sharedInstance().startSession("demotbl");
:
}
@Override
protected void onStop() {
:
TreasureData.sharedInstance().endSession("demotbl");
TreasureData.sharedInstance().uploadEvents();
// 出力 =>>
// [{"td_session_id":"cad88260-67b4-0242-1329-2650772a66b1",
// "td_session_event":"start", "time":1418880000},
//
// {"td_session_id":"cad88260-67b4-0242-1329-2650772a66b1",
// "td_session_event":"end", "time":1418880123}
// ]
:
}以下のケースを処理したい場合は、グローバルセッショントラッキングのために TreasureData.startSession と TreasureData.endSession のクラスメソッドのペアを使用してください:
- ユーザーがアプリケーションを開き、セッショントラッキングを開始します。例えば、
session#0です。 - ユーザーがホーム画面に移動し、Activity を破棄します
- ユーザーがデフォルトの 10 秒以内にアプリケーションを再度開き、セッショントラッキングを再開します。しかし、この新しいセッションを
session#0と同じセッションとして扱いたい場合です。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
:
TreasureData.setSessionTimeoutMilli(30 * 1000); // デフォルトは 10 秒
}
@Override
protected void onStart() {
:
TreasureData.startSession(this);
:
}
@Override
protected void onStop() {
:
TreasureData.endSession(this);
TreasureData.sharedInstance().uploadEvents();
:
}この場合、TreasureData.getSessionId を使用して現在のセッション ID を取得できます。
@Override
protected void onStart() {
:
TreasureData.startSession(this);
Log.i(TAG, "onStart(): Session ID=" + TreasureData.getSessionId(this));
:
}アプリライフサイクルイベントのトラッキングはオプションであり、デフォルトでは有効になっていません。enableAppLifecycleEvent() を使用してアプリライフサイクルイベントを自動的にトラッキングできます。
アプリライフサイクルイベントには、アプリケーションのインストール、アプリケーションのオープン、アプリケーションのアップデートが含まれます。以下のように個別のコアイベントを無効にできます:
- アプリケーションインストールの無効化:
disableAppInstalledEvent() - アプリケーションオープンの無効化:
disableAppOpenEvent() - アプリケーションアップデートの無効化:
disableAppUpdatedEvent()
アプリ内課金イベントのトラッキングはオプションであり、デフォルトでは有効になっていません。アプリ内課金イベントを自動的にトラッキングするには、次のコードを追加してください: TreasureData.enableInAppPurchaseEvent()。
以下の列が出力されます:
| 列名 | 説明 |
|---|---|
td_android_event | TD_ANDROID_IN_APP_PURCHASE |
td_iap_product_id | productId (Purchase) |
td_iap_order_id | orderId (Purchase) |
td_iap_product_price | price (SKU detail) |
td_iap_quantity | 1 |
td_iap_product_price_amount_micros | price_amount_micros (SKU detail) |
td_iap_product_currency | price_currency_code (SKU detail) |
td_iap_purchase_time | purchaseTime (Purchase) |
td_iap_purchase_token | purchaseToken (Purchase) |
td_iap_purchase_state | purchaseState (Purchase) |
td_iap_purchase_developer_payload | developerPayload (Purchase) |
td_iap_product_type | type (SKU detail)、ワンタイム製品の場合は inapp、サブスクリプションの場合は subs |
td_iap_product_title | title (SKU detail) |
td_iap_product_description | description (SKU detail) |
td_iap_package_name | packageName (Purchase) |
td_iap_subs_auto_renewing | autoRenewing (Purchase) |
td_iap_subs_status | サブスクリプションの自動検出 (New |
td_iap_subs_period | subscriptionPeriod (SKU detail for subscription) |
td_iap_free_trial_period | freeTrialPeriod (SKU detail for subscription) |
td_iap_intro_price_period | introductoryPricePeriod (SKU detail for subscription) |
td_iap_intro_price_cycless | introductoryPriceCycles (SKU detail for subscription) |
td_iap_intro_price_amount_micros | introductoryPriceAmountMicro (SKU detail for subscription) |
この SDK は、Google Play Billing Library と AIDL を使用したアプリ内課金の両方を使用する Android アプリケーションのアプリ内課金イベントをトラッキングできます。アプリケーションが AIDL API を使用したアプリ内課金で開発されている場合、SDK が使用する AIDL クラスを保持するために、以下の ProGuard ルールをプロジェクトに追加する必要があります。
-keep class com.android.vending.billing.** { *; }アプリを販売する国(例: EU)によっては、アプリ内でユーザーがデータトラッキングをオプトアウトできる機能を提供する必要がある場合があります。
- アプリケーションライフサイクルイベントの自動トラッキングをオフにする(アプリケーションライフサイクルイベントトラッキングが有効な場合):
disableAppLifecycleEvent()。 - アプリ内課金イベントの自動トラッキングをオフにする(アプリ内課金イベントが有効な場合):
disableInAppPurchaseEvent()。 - カスタムイベント(
addEvent、addEventWithCallbackでトラッキングしているイベント)をオフにする:disableCustomEvent。再度オンにする:enableCustomEvent。
isAppLifecycleEventEnabled()、isInAppPurchaseEventEnabled()、isCustomEventEnabled() を使用して、イベントトラッキングの状態を照会できます。これらの状態はデバイスの再起動やアプリの更新をまたいで効果があるため、アプリケーション中に一度呼び出すだけで済みます。
addEventWithCallback や uploadEventWithCallback のようなコールバック付き関数を使用する場合、errorCode 引数を持つ TDCallback.onError メソッドのコールバックを取得できます。この引数はエラーの原因タイプを知るのに役立ちます。以下のエラーコードがあります。
| エラーコード | 説明 |
|---|---|
init_error | 初期化に失敗しました。 |
invalid_param | API に渡されたパラメータが無効でした。 |
invalid_event | イベントが無効でした。 |
data_conversion | データの JSON への変換または JSON からの変換に失敗しました。 |
storage_error | ストレージ内のデータの読み取り/書き込みに失敗しました。 |
network_error | ネットワークの問題によりサーバーとの通信に失敗しました。 |
server_response | サーバーがエラーレスポンスを返しました。 |
API エンドポイント(デフォルト: [ https://us01.records.in.treasuredata.com ] )は変更できます。例えば:
td = new TreasureData(this, "your_api_key", "https://specifying-another-endpoint.com");TreasureData.initializeEncryptionKey で暗号化キーを設定した場合、SDK は TreasureData#addEvent または TreasureData.addEventWithCallback が呼び出されたときにイベントデータを暗号化して保存します。
TreasureData.initializeEncryptionKey("hello world");
:
td.addEventWithCallback(...) TreasureData.sharedInstance().setDefaultDatabase("default_db");
:
TreasureData.sharedInstance().addEvent("demotbl", …);このオプションはデフォルトで有効になっています。ローカルタイムスタンプがイベントの time キーに自動的に追加されます。イベントに time キーを追加せずに disableAutoAppendLocalTimestamp を実行すると、サーバーがサーバー側のタイムスタンプを time 列に追加します。カスタム列でローカル時刻を自動トラッキングすることもできます。その場合、time 列にはサーバー側のタイムスタンプが含まれます。
// ローカル時刻を `time` 列として使用
TreasureData.sharedInstance().enableAutoAppendLocalTimestamp();
// ローカル時刻をカスタマイズされた列名として追加
TreasureData.sharedInstance().enableAutoAppendLocalTimestamp("custom_time");
// ローカル時刻の自動追加を無効化
TreasureData.sharedInstance().disableAutoAppendLocalTimestamp();TreasureData#enableAutoAppendUniqId() を呼び出すと、デバイスの UUID が各イベントに自動的に追加されます。この値はアプリケーションがアンインストールされるまで変更されません。
td.enableAutoAppendUniqId();
:
td.addEvent(...);値は列名 td_uuid として出力されます。
TreasureData#resetUniqId() を使用して UUID をリセットし、古い UUID で forget_device_uuid イベントを送信できます。
enableAutoAppendRecordUUID を呼び出すと、UUID が各イベントレコードに自動的に追加されます。各イベントは異なる UUID を持ちます。
td.enableAutoAppendRecordUUID();
// 列名をカスタマイズしたい場合は、API に渡してください
// td.enableAutoAppendRecordUUID("my_record_uuid");
:
td.addEvent(...);デフォルトでは、値は列名 record_uuid として出力されます。
enableAutoAppendAdvertisingIdentifier を呼び出すと、広告 ID が各イベントレコードに自動的に追加されます。この機能を動作させるには、Google Play Service Ads (Gradle com.google.android.gms:play-services-ads) を依存関係としてインストールする必要があります。また、ユーザーがデバイスで広告トラッキングの制限機能をオンにしていない必要があります。そうでない場合、Treasure Data は広告 ID をレコードに添付できません。 広告 ID の取得は非同期であるため、enableAutoAppendAdvertisingIdentifier メソッドが呼び出された後、広告 ID が利用可能になるまでに時間がかかる場合があります。ただし、Treasure Data は広告 ID をキャッシュするため、広告 ID の取得タスクの完了を待つことなく、次のイベントに追加できます。
td.enableAutoAppendAdvertisingIdentifier();
// 列名をカスタマイズしたい場合は、API に渡してください
// td.enableAutoAppendAdvertisingIdentifier("my_advertising_id_column");
:
td.addEvent(...);デフォルトでは、値は列名 td_maid として出力されます。
TreasureData#enableAutoAppendModelInformation を呼び出すと、デバイスモデル情報が各イベントに自動的に追加されます。
td.enableAutoAppendModelInformation();
:
td.addEvent(...);以下の列名と値が出力されます:
td_board: android.os.Build#BOARDtd_brand: android.os.Build#BRANDtd_device: android.os.Build#DEVICEtd_display: android.os.Build#DISPLAYtd_model: android.os.Build#MODELtd_os_ver: android.os.Build.VERSION#SDK_INTtd_os_type: "Android"
TreasureData#enableAutoAppendAppInformation を呼び出すと、アプリケーションパッケージバージョン情報が各イベントに自動的に追加されます。
td.enableAutoAppendAppInformation();
:
td.addEvent(...);以下の列名と値が出力されます:
td_app_ver: android.content.pm.PackageInfo.versionName (Context.getPackageManager().getPackageInfo() から)td_app_ver_num: android.content.pm.PackageInfo.versionCode (Context.getPackageManager().getPackageInfo() から)
TreasureData#enableAutoAppendLocaleInformation を呼び出すと、ロケール設定情報が各イベントに自動的に追加されます。
td.enableAutoAppendLocaleInformation();
:
td.addEvent(...);以下の列名と値が出力されます:
td_locale_country: java.util.Locale.getCountry() (Context.getResources().getConfiguration().locale から)td_locale_lang: java.util.Locale.getLanguage() (Context.getResources().getConfiguration().locale から)
enableAutoTrackingIP を呼び出すと、デバイス IP が td_ip 列に各イベントに自動的に追加されます。トラッキングされる IP アドレスは、イベントを追加したときではなく、Treasure Data にイベントをアップロードしたときのものであることに注意してください。
TreasureData.sharedInstance().enableAutoTrackingIP();IP の自動トラッキングを無効にするには:
TreasureData.sharedInstance().disableAutoTrackingIP();Profiles API を使用してプロファイルを検索する方法の例を以下に示します。
// CDP エンドポイントを以下のいずれかに設定してください:
// https://cdp.in.treasuredata.com (US)
// https://cdp-tokyo.in.treasuredata.com (Tokyo)
// https://cdp-eu01.in.treasuredata.com (EU)
// https://cdp-ap02.in.treasuredata.com (Seoul)
// https://cdp-ap03.in.treasuredata.com (Tokyo)
TreasureData.sharedInstance().setCDPEndpoint("<your_cdp_endpoint>");
TreasureData.sharedInstance().fetchUserSegments(Arrays.asList("<your_profile_api_tokens>"),
Collections.singletonMap("<your_key_column>", "<value>"),
new FetchUserSegmentsCallback() {
@Override
public void onSuccess(List<Profile> profiles) {
System.out.println(profiles);
}
@Override
public void onError(Exception e) {
System.err.println(e);
}
}); TreasureData.enableLogging(); TreasureData.disableLogging();サポートされている Android バージョンのリストについては、GitHub リポジトリを参照してください。
追加情報については、Android SDK Github リポジトリを参照してください。