# Android SDK クイックスタート

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](https://github.com/treasure-data/td-android-sdk/releases)へのアクセス
- GDPR への準拠の確認


## バージョン 1.0.0 への移行

バージョン 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`](#auto-tracking-device-ip) および [`disableAutoTrackingIP`](#auto-tracking-device-ip) API を使用してください。


## インストール

以下の動画は Android SDK のインストール方法を示しています。

iframe
### ライブラリのインストール

Treasure Data ライブラリをプロジェクトに追加します。Gradle、Maven、および Jar ファイルを使用する例を以下に示します。


```java Gradle
// build.gradle に以下を追加
dependencies {
    implementation 'com.treasuredata:td-android-sdk:1.0.0'
}
```


```xml Maven
// pom.xml に以下を追加
  <dependency>
    <groupId>com.treasuredata</groupId>
    <artifactId>td-android-sdk</artifactId>
    <version>1.0.0</version>
  </dependency>
```


```text Jar File
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 アプリケーションプロジェクト](https://github.com/treasure-data/td-android-sdk/tree/master/example)があります。pom.xml が良い参考になります。

### 必要な Android パーミッションの有効化

まだ存在しない場合は、AndroidManifest.xml ファイルに `INTERNET` パーミッションを追加します。以下のエントリは `<manifest> .. </manifest>` タグの間に記述する必要があります。


```xml
<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 の例](https://github.com/treasure-data/td-android-sdk/blob/master/example/src/main/AndroidManifest.xml)をご覧ください。

## GDPR - 個人情報のトラッキング

注意
会社のデータプライバシー責任者および法務顧問とデータ収集ポリシーを確認し、どのような個人情報を収集すべきかを判断する必要があります。個人のトラッキングを有効にする場合は、個人ユーザーのトラッキングへのオプトインを追跡するために、同意管理システムも統合することをお勧めします。

さまざまな領域、特に EU の GDPR におけるデータプライバシー規制に準拠するため、Treasure Data Android SDK は個人を特定できる特定のイベントメタデータをデフォルトでは収集しません。具体的には、以下の情報はデフォルトでは収集されません:

- `td_uuid` - クライアントの識別子で、このデバイス上のこのアプリケーションのこのインストールに固有です。


`td_uuid` は、個々のユーザーを追跡し、ユーザーセッション内およびセッション間でデータを分析し、追跡された行動を実在の個人と関連付けるなどを行う場合に必要です。

ユーザーの同意を得た後、個人データの収集を有効にできます。例:


```java
td.enableAutoAppendUniqId();
```

テスト時には、収集している情報を確認し、意図した個人情報のみが含まれ、それ以上のものが含まれていないことを確認してください。

[Android SDK の UUID](https://developer.android.com/reference/java/util/UUID) について詳しく学んでください。

## 基本的な使用方法

### ライブラリの初期化

効率的な API 呼び出しのために、Application サブクラスの `onCreate()` メソッドで `TreasureData` 共有インスタンスを初期化することを強くお勧めします。


```java
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 キーは、Treasure コンソール のプロファイルから取得できます。[Write-only API key](/products/my-settings/getting-your-api-keys) の使用が推奨されます。

その後、`TreasureData.sharedInstance()` メソッドを使用して、どこからでも共有インスタンスを使用できます。


```java
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 を呼び出します。


```java シンプル
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);
  }
});
```


```java コールバック付き
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 を使用します。

アプリケーションのニーズによって、バッファされたイベントをいつ、どのくらいの頻度でアップロードするかが決まります。以下をお勧めします:

- 現在の画面が閉じているとき、またはバックグラウンドに移動するとき
- アプリケーションを閉じるとき



```java シンプル
findViewById(R.id.upload).setOnTouchListener(new OnTouchListener() {
   @Override
   public boolean onTouch(View view, MotionEvent motionEvent) {

     // この API を呼び出して、いつでもバッファされたイベントをアップロードできます。
     td.uploadEvents();

     return false;
  }
});
```


```java コールバック付き
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 レコード以内のいずれか早い方で見られた場合に、重複レコードを識別するベストエフォートシステムです。

### デフォルト値

テーブル、データベース、または任意のテーブルやデータベースに追加されたイベントに対して、キーの値を自動的に設定したい場合は、デフォルト値を設定します。同じキーに複数のデフォルト値が設定されている場合、新しく追加されたイベントには、以下の順序でデフォルト値が適用され、上書きされます:

1. すべてのテーブルとデータベースを対象とするデフォルト値が最初に適用されます。
2. データベース内のすべてのテーブルを対象とするデフォルト値が適用されます。
3. イベントが追加されるテーブルを対象とするデフォルト値が適用されます。
4. イベントが追加されるテーブルとデータベースを対象とするデフォルト値が適用されます。
5. 最後に、イベントがキーの値を持っている場合、その値がすべてのデフォルト値を上書きします。


#### デフォルト値の設定


```java
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" を対象
```

#### デフォルト値の取得


```java
String defaultValue = (String) TreasureData.sharedInstance().getDefaultValue("database_name", "table_name", "key"); // データベース "database_name" とテーブル "table_name" を対象とするキーのデフォルト値を取得
```

#### デフォルト値の削除


```java
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"`} を含むイベントを追加します。


```java
@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` と同じセッションとして扱いたい場合です。



```java
@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 を取得できます。


```java
@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 ルールをプロジェクトに追加する必要があります。


```java
-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 ] )は変更できます。例えば:


```java
td = new TreasureData(this, "your_api_key", "https://specifying-another-endpoint.com");
```

### 暗号化キー

`TreasureData.initializeEncryptionKey` で暗号化キーを設定した場合、SDK は `TreasureData#addEvent` または `TreasureData.addEventWithCallback` が呼び出されたときにイベントデータを暗号化して保存します。


```java
    TreasureData.initializeEncryptionKey("hello world");
        :
    td.addEventWithCallback(...)
```

### デフォルトデータベース


```java
  TreasureData.sharedInstance().setDefaultDatabase("default_db");
    :
  TreasureData.sharedInstance().addEvent("demotbl", …);
```

### 各イベントレコードへのローカルタイムスタンプの自動追加

このオプションはデフォルトで有効になっています。ローカルタイムスタンプがイベントの `time` キーに自動的に追加されます。イベントに `time` キーを追加せずに `disableAutoAppendLocalTimestamp` を実行すると、サーバーがサーバー側のタイムスタンプを `time` 列に追加します。カスタム列でローカル時刻を自動トラッキングすることもできます。その場合、`time` 列にはサーバー側のタイムスタンプが含まれます。


```java
    // ローカル時刻を `time` 列として使用
    TreasureData.sharedInstance().enableAutoAppendLocalTimestamp();

    // ローカル時刻をカスタマイズされた列名として追加
    TreasureData.sharedInstance().enableAutoAppendLocalTimestamp("custom_time");

    // ローカル時刻の自動追加を無効化
    TreasureData.sharedInstance().disableAutoAppendLocalTimestamp();
```

### 各イベントへのデバイスの UUID の自動追加

`TreasureData#enableAutoAppendUniqId()` を呼び出すと、デバイスの UUID が各イベントに自動的に追加されます。この値はアプリケーションがアンインストールされるまで変更されません。


```java
  td.enableAutoAppendUniqId();
    :
  td.addEvent(...);
```

値は列名 `td_uuid` として出力されます。

`TreasureData#resetUniqId()` を使用して UUID をリセットし、古い UUID で `forget_device_uuid` イベントを送信できます。

### 各イベントレコードへの UUID の自動追加

`enableAutoAppendRecordUUID` を呼び出すと、UUID が各イベントレコードに自動的に追加されます。各イベントは異なる UUID を持ちます。


```java
  td.enableAutoAppendRecordUUID();
  // 列名をカスタマイズしたい場合は、API に渡してください
  // td.enableAutoAppendRecordUUID("my_record_uuid");
    :
  td.addEvent(...);
```

デフォルトでは、値は列名 `record_uuid` として出力されます。

### 各イベントレコードへの広告 ID の自動追加

`enableAutoAppendAdvertisingIdentifier` を呼び出すと、広告 ID が各イベントレコードに自動的に追加されます。この機能を動作させるには、Google Play Service Ads (Gradle `com.google.android.gms:play-services-ads`) を依存関係としてインストールする必要があります。また、ユーザーがデバイスで広告トラッキングの制限機能をオンにしていない必要があります。そうでない場合、Treasure Data は広告 ID をレコードに添付できません。
広告 ID の取得は非同期であるため、`enableAutoAppendAdvertisingIdentifier` メソッドが呼び出された後、広告 ID が利用可能になるまでに時間がかかる場合があります。ただし、Treasure Data は広告 ID をキャッシュするため、広告 ID の取得タスクの完了を待つことなく、次のイベントに追加できます。


```java
td.enableAutoAppendAdvertisingIdentifier();
// 列名をカスタマイズしたい場合は、API に渡してください
// td.enableAutoAppendAdvertisingIdentifier("my_advertising_id_column");
:
td.addEvent(...);
```

デフォルトでは、値は列名 `td_maid` として出力されます。

### 各イベントへのデバイスモデル情報の自動追加

`TreasureData#enableAutoAppendModelInformation` を呼び出すと、デバイスモデル情報が各イベントに自動的に追加されます。


```java
  td.enableAutoAppendModelInformation();
    :
  td.addEvent(...);
```

以下の列名と値が出力されます:

- `td_board` : android.os.Build#BOARD
- `td_brand` : android.os.Build#BRAND
- `td_device` : android.os.Build#DEVICE
- `td_display` : android.os.Build#DISPLAY
- `td_model` : android.os.Build#MODEL
- `td_os_ver` : android.os.Build.VERSION#SDK_INT
- `td_os_type` : "Android"


### 各イベントへのアプリケーションパッケージバージョン情報の自動追加

`TreasureData#enableAutoAppendAppInformation` を呼び出すと、アプリケーションパッケージバージョン情報が各イベントに自動的に追加されます。


```java
  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` を呼び出すと、ロケール設定情報が各イベントに自動的に追加されます。


```java
  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 から)


### デバイス IP の自動トラッキング

`enableAutoTrackingIP` を呼び出すと、デバイス IP が `td_ip` 列に各イベントに自動的に追加されます。トラッキングされる IP アドレスは、イベントを追加したときではなく、Treasure Data にイベントをアップロードしたときのものであることに注意してください。


```
TreasureData.sharedInstance().enableAutoTrackingIP();
```

IP の自動トラッキングを無効にするには:


```
TreasureData.sharedInstance().disableAutoTrackingIP();
```

### Profiles API

[Profiles API](https://docs.treasuredata.com/products/customer-data-platform/audience-studio/profiles) を使用してプロファイルを検索する方法の例を以下に示します。


```java
// 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);
                                                    }
                                                });
```

### デバッグログの有効化と無効化


```java
  TreasureData.enableLogging();
```


```java
  TreasureData.disableLogging();
```

## Android バージョンのサポート

サポートされている Android バージョンのリストについては、[GitHub リポジトリ](https://github.com/treasure-data/td-android-sdk/tree/master?tab=readme-ov-file#android-version-support)を参照してください。

## 参考資料

追加情報については、[Android SDK GitHub リポジトリ](https://github.com/treasure-data/td-android-sdk)を参照してください。