# アプリを構築してテストする

DevKit を使用してアプリを構築し、テストする方法をご紹介します。

[GitHub](https://github.com/stripe-samples/terminal-apps-on-devices) の Apps on Devices の導入サンプルリポジトリーにアクセスします。

SmartPOS DevKit デバイスを使用して、デプロイやアプリの審査、署名のプロセスを実行せずに、アプリケーションを繰り返しテストします。

DevKit デバイスが必要な場合は、ダッシュボードの[リーダー](https://dashboard.stripe.com/terminal)セクションから、[ユーザーあたり最大 5 台まで注文](https://docs.stripe.com/terminal/fleet/order-and-return-readers.md)できます。

> #### Verifone リーダーサポート
> 
> Verifone P630 と UX700 はアメリカで**一般提供**されています。Verifone V660p と M425 はアメリカおよびカナダで**公開プレビュー**の段階にあり、V660p、P630、UX700 はカナダ、ベルギー、イタリア、オランダ、ニュージーランド、ノルウェー、スペイン、スウェーデンでも**公開プレビュー**として提供されています。V660p、UX700、P630 は、アイルランド、イギリス、フランス、シンガポール (V660p, P630)、オーストラリアで**プライベートプレビュー**として提供されています。
> 
> Verifone リーダーのご注文またはプレビューへの参加については、[営業チームにお問い合わせください](https://stripe.com/contact/sales)。

## DevKit を設定する

DevKit を使用してアプリを開発する前に、以下を実行する必要があります。

1. 画面の指示に従ってネットワークに接続します。
2. デバイスをお使いの Stripe アカウントに[登録](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=internet#register-reader)します。
3. 利用可能なすべての更新をインストールします。

初期設定後は、いつでも別のアカウントや店舗に DevKit を登録できます。登録するには、DevKit をインターネットに接続し、手順に従って[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=internet#register-reader)します。

本番環境用デバイスと似ていますが、DevKit デバイスは次の点で異なります。

- [サンドボックス](https://docs.stripe.com/keys.md#test-live-modes)でのみ操作できます。
- [開発者向けオプション](https://developer.android.com/studio/debug/dev-options)と [Android Debug Bridge](https://developer.android.com/studio/command-line/adb) (`adb`) がデフォルトで有効になっている状態で出荷されます。
- デバイスがテスト専用で使用されていることを示すウォーターマークが画面上に表示されます。このウォーターマークは、デバイスの使用中に画面内を移動するため、ユーザーは画面のすべての部分を確認できます。

Terminal API は、登録済みの DevKit デバイスのターゲット設定をサポートします。

## Stripe デバイス向けのアプリを開発する

以下のステップを使用して、Stripe Android デバイス向けのアプリを開発します。これには、アプリの設定と Stripe リーダーアプリへのハンドオフが含まれます。

## アプリを設定する [クライアント側]

#### Android

まず、対面支払いの[導入を設定](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=android)します。その後に、以下の Apps on Devices の導入のガイダンスに従います。

### 依存関係を追加する

次の依存関係をプロジェクトの Gradle ビルドスクリプトに追加します。Apps on Devices の導入には、[Terminal Android SDK](https://github.com/stripe/stripe-terminal-android) バージョン `2.22.0` 以降が必要ですが、Stripe では[最新バージョン](https://github.com/stripe/stripe-terminal-android/releases)の導入をお勧めしています。

#### Kotlin

```kotlin
dependencies {
   implementation("com.stripe:stripeterminal-core:5.8.1")
   implementation("com.stripe:stripeterminal-appsondevices:5.8.1")
}
```

その他の Stripe Terminal SDK の依存関係を使用していないことを確認してください。たとえば、前に Terminal Android SDK を実装したことがある場合は、最上位の `com.stripe:stripeterminal` の依存関係 (例: `com.stripe:stripeterminal:5.8.1`) を使用しないでください。

[アプリのビルドスクリプトに依存関係を含める](https://github.com/stripe-samples/terminal-apps-on-devices/blob/718c2de38c7b8003fcf58c536c266bb990ad43a7/app/build.gradle.kts#L66)の例をご覧ください。

### アプリケーションを設定する

Stripe SDK にライフサイクルイベントを通知するには、[TerminalApplicationDelegate.onCreate()](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal-application-delegate/on-create.html) コールをアプリケーションサブクラスの [onCreate()](https://developer.android.com/reference/android/app/Application#onCreate\(\)) メソッドに追加します。

#### Kotlin

```kotlin
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        TerminalApplicationDelegate.onCreate(this)
    }
}
```

[アプリのマニフェスト](https://developer.android.com/guide/topics/manifest/manifest-intro) で、`android:name` 属性が含まれる `Application` サブクラスの名前を指定します。

> `Application` が Android 15 を実行するデバイスをサポートしていることを確認するには、`targetSdkVersion` を `24` 以降に設定します。

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name=".MyApp">
    <!-- App manifest contents -->
    </application>
</manifest>
```

[導入の設定](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=android)の詳細をご覧になるか、[Application サブクラスを正確に設定](https://github.com/stripe-samples/terminal-apps-on-devices/blob/718c2de38c7b8003fcf58c536c266bb990ad43a7/app/src/main/java/com/stripe/aod/sampleapp/MyApp.kt#L10)する例について Apps on Devices サンプルアプリの GitHub リポジトリーをご覧ください。

#### React Native

まず、対面支払いの[導入を設定](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=react-native)します。その後、以下の Apps on Devices の導入のガイダンスに従います。

### アプリケーションを設定する

Stripe SDK にライフサイクルイベントを通知するには、`TerminalApplicationDelegate.onCreate()` コールを Application サブクラスの [onCreate()](https://developer.android.com/reference/android/app/Application#onCreate\(\)) メソッドに追加します。

#### Kotlin

```kotlin
import com.stripeterminalreactnative.TerminalApplicationDelegate

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        TerminalApplicationDelegate.onCreate(this)
    }
}
```

[アプリのマニフェスト](https://developer.android.com/guide/topics/manifest/manifest-intro) で、`android:name` 属性が含まれる `Application` サブクラスの名前を指定します。

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name=".MainApplication">
    <!-- App manifest contents -->
    </application>
</manifest>
```

[Application サブクラスの設定](https://github.com/stripe/stripe-terminal-react-native/blob/main/dev-app/android/app/src/main/java/com/dev/app/stripeterminalreactnative/MainApplication.java#L58)の例を確認したい場合は、[導入の設定](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=react-native)の詳細をご覧になるか、または React Native GitHub リポジトリのサンプルアプリを参照してください。

### サーバーレス初期化

Apps on Devices では、バックエンドのトークンプロバイダーの代わりに `AppsOnDevicesConnectionTokenProvider` を使用できます。これにより、接続トークンを提供するバックエンドサーバーなしで初期化できます。

```js
import {
  StripeTerminalProvider,
  AppsOnDevicesConnectionTokenProvider,
} from '@stripe/stripe-terminal-react-native';

function Root() {
  return (
    <StripeTerminalProvider tokenProvider={AppsOnDevicesConnectionTokenProvider}>
      <App />
    </StripeTerminalProvider>
  );
}
```

## アプリを構築する [クライアント側]

Apps on Devices の導入については、以下のガイダンスに従います。

### リーダーを検出して接続する

#### Android

> Android SDK のバージョン `5.0.0` では、`easyConnect` メソッドを使用すると、リーダーの検出と接続を単一の API コールにまとめ、実装を簡素化できます。詳細については、[SDK 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md?terminal-sdk-platform=android#update-your-reader-connection-usage)をご覧ください。

新しい Stripe デバイスを新しい [Reader オブジェクト](https://docs.stripe.com/api/terminal/readers/object.md)としてアカウントに登録する必要があります。デバイスの管理者設定に表示される、[Reader オブジェクトの作成](https://docs.stripe.com/api/terminal/readers/create.md)に必要なペアリングコードを使用します。お使いのアプリは Stripe Terminal Android SDK を使用してデバイスを検出し、接続します。

Apps on Devices の導入サンプルの [GitHub](https://github.com/stripe-samples/terminal-apps-on-devices) リポジトリーで、ハンドオフモードを使用する[検出](https://github.com/stripe-samples/terminal-apps-on-devices/blob/718c2de38c7b8003fcf58c536c266bb990ad43a7/app/src/main/java/com/stripe/aod/sampleapp/model/MainViewModel.kt#L90)方法と[接続](https://github.com/stripe-samples/terminal-apps-on-devices/blob/718c2de38c7b8003fcf58c536c266bb990ad43a7/app/src/main/java/com/stripe/aod/sampleapp/model/MainViewModel.kt#L106)方法の例をご覧ください。

1. 登録済みのデバイスでアプリが実行されます。
2. アプリは、[AppsOnDevicesDiscoveryConfiguration](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-apps-on-devices-discovery-configuration/index.html) を使用して [discoverReaders](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) を呼び出すことでリーダーを検出します。
3. [connectReader](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) を使用してアプリをリーダーに接続します。

次の例は、Android アプリでハンドオフモードを使用して Stripe リーダーを検出し、接続する方法を示しています。

#### Kotlin

```kotlin
private fun discoverReaders() {
    Terminal.getInstance().discoverReaders(
        config = AppsOnDevicesDiscoveryConfiguration(),
        discoveryListener = object : DiscoveryListener {
            override fun onUpdateDiscoveredReaders(readers: List<Reader>) {
                // In Apps on Devices discovery, the list will
                // contain a single reader. Connect to
                // the reader after it is discovered.
                readers.firstOrNull()?.let { reader ->
                    connectReader(reader)
                }
            }
        },
        callback = object : Callback {
            override fun onSuccess() {
                // Handle successfully discovering readers
            }

            override fun onFailure(e: TerminalException) {
                // Handle exception while discovering readers
            }
        }
    )
}

private fun connectReader(reader: Reader) {
    Terminal.getInstance().connectReader(
        reader,
        AppsOnDevicesConnectionConfiguration(
            object : AppsOnDevicesReaderListener {
                override fun onDisconnect(reason: DisconnectReason) {
                    // Optionally get notified about reader disconnects (for example, reader was rebooted)
                }

                override fun onReportReaderEvent(event: ReaderEvent) {
                    // Optionally get notified about reader events (for example, a card was inserted)
                }
            }
        ),
        object : ReaderCallback {
            override fun onSuccess(reader: Reader) {
                // Handle successfully connecting to the reader
            }

            override fun onFailure(e: TerminalException) {
                // Handle exception when connecting to the reader
            }
        }
    )
}
```

#### React Native

> React Native SDK のバージョン `0.0.1-beta.29` では、[easyConnect](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#easyconnect) メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、導入を簡素化できます。

新しい Stripe デバイスを新しい [Reader オブジェクト](https://docs.stripe.com/api/terminal/readers/object.md)としてアカウントに登録する必要があります。デバイスの管理者設定に表示される、[Reader オブジェクトの作成](https://docs.stripe.com/api/terminal/readers/create.md)に必要なペアリングコードを使用してください。アプリが Stripe Terminal React Native SDK を使用してデバイスを検出し、接続します。

1. 登録済みのデバイスでアプリが実行されます。
2. アプリは、`appsOnDevices` [検出メソッド](https://stripe.dev/stripe-terminal-react-native/api-reference/modules/Reader.Android.html#DiscoveryMethod)を使用して [discoverReaders](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#discoverReaders) を呼び出すことでリーダーを検出します。
3. アプリは、[connectReader](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) 経由でリーダーに接続します。

以下の例は、React Native アプリで Apps on Devices モードを使用して Stripe リーダーを検出し、接続する方法を示しています。

```js
const { discoverReaders, connectReader, discoveredReaders } =
    useStripeTerminal({
      onUpdateDiscoveredReaders: async (readers) => {
        // After the SDK discovers a reader, your app can connect to it.
        // The discoverReaders method doesn't resolve until discovery completes,
        // so use this callback to handle discovered readers.
        if (readers.length > 0) {
          const { reader, error } = await connectReader({
              discoveryMethod: 'appsOnDevices',
              reader: readers[0],
          });

          if (error) {
            console.log('connectReader error:', error);
            return;
          }

          console.log('Reader connected successfully', reader);
        }
      },
    });

  const handleDiscoverReaders = async () => {
    const { error } = await discoverReaders({
      discoveryMethod: 'appsOnDevices',
    });

    if (error) {
      console.log('discoverReaders error:', error);
    }
  };

  useEffect(() => {
    handleDiscoverReaders();
  }, [discoverReaders]);
```

### 支払いを回収する

ハンドオフモードを使用してリーダーに接続すると、[支払いの回収](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=android#create-payment)を開始できます。

Stripe Reader アプリは、支払いの回収やその他の支払い操作 ([支払い情報の保存](https://docs.stripe.com/terminal/features/saving-payment-details/overview.md)など) を処理します。支払い操作を開始すると、Stripe Reader アプリがプライマリになり、全画面で起動します。その後、Stripe Reader アプリがフローを進め、支払いの完了 (成功または失敗) または顧客のキャンセル後に制御をアプリに戻します。制御がアプリに戻ると、Stripe Reader アプリはバックグラウンドで実行され続けます。

[Apps on Devices アプリで支払いを回収](https://github.com/stripe-samples/terminal-apps-on-devices/blob/718c2de38c7b8003fcf58c536c266bb990ad43a7/app/src/main/java/com/stripe/aod/sampleapp/model/CheckoutViewModel.kt#L82)する例をご覧ください。

#### オフラインで支払いを回収する

Apps on Devices は、[オフラインでの支払いの回収](https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments.md?terminal-sdk-platform=android&reader-type=internet)をサポートします。

## アプリの遷移アニメーションのカスタマイズ [クライアント側]

決済処理が開始されると、Stripe Reader アプリがフォアグラウンドに移り、お客様のアプリはバックグラウンドに遷移します。特に指定がない場合、遷移には Android システムのデフォルトアニメーション (右からスライド) が使用されます。

> カスタムトランジションアニメーションには、リーダーソフトウェアバージョン 2.42 以降が必要です。

#### Android

リーダーへの接続時に `appTransitionAnimation` パラメーターを `AppsOnDevicesConnectionConfiguration` に渡すことで、遷移をカスタマイズできます。

### プリセットアニメーションの使用

Terminal SDK には、追加設定不要のプリセットアニメーションが含まれています。`AppTransitionPreset` とともに `AppTransitionAnimation.Preset` を使用してください。

#### Kotlin

```kotlin
private fun connectReader(reader: Reader) {
    val config = AppsOnDevicesConnectionConfiguration(
        appsOnDevicesListener = object : AppsOnDevicesReaderListener {
            override fun onDisconnect(reason: DisconnectReason) {}
            override fun onReportReaderEvent(event: ReaderEvent) {}
        },
        appTransitionAnimation = AppTransitionAnimation.Preset(AppTransitionPreset.SLIDE_FROM_BOTTOM)
    )

    Terminal.getInstance().connectReader(
        reader,
        config,
        object : ReaderCallback {
            override fun onSuccess(reader: Reader) {
                // Handle successfully connecting to the reader
            }

            override fun onFailure(e: TerminalException) {
                // Handle exception when connecting to the reader
            }
        }
    )
}
```

`SLIDE_FROM_BOTTOM` プリセットを使用すると、Stripe Reader アプリが画面の下からスライドして表示されます。

### カスタムアニメーションの使用

アプリ用のカスタム Android アニメーションリソースを `res/anim/` ディレクトリに定義できます。その後、リソース ID を `AppTransitionAnimation.Custom` に渡します。`enterAnim` は Stripe Reader アプリの画面への表示方法を制御します。`exitAnim` はお客様のアプリの画面からの退出方法を制御します。

#### Kotlin

```kotlin
val config = AppsOnDevicesConnectionConfiguration(
    appsOnDevicesListener = object : AppsOnDevicesReaderListener {
        override fun onDisconnect(reason: DisconnectReason) {}
        override fun onReportReaderEvent(event: ReaderEvent) {}
    },
    appTransitionAnimation = AppTransitionAnimation.Custom(
        enterAnim = R.anim.slide_in_up,
        exitAnim = R.anim.slide_out_down
    )
)
```

### 遷移アニメーションの無効化

両方のパラメーターに `AppTransitionAnimation.Custom.NO_ANIMATION` を渡すことで、遷移アニメーションを無効化できます。一方向のみアニメーションを無効にする場合は、`enterAnim` または `exitAnim` のいずれかに `NO_ANIMATION` を渡します。

#### Kotlin

```kotlin
val config = AppsOnDevicesConnectionConfiguration(
    appsOnDevicesListener = listener,
    appTransitionAnimation = AppTransitionAnimation.Custom(
        enterAnim = AppTransitionAnimation.Custom.NO_ANIMATION,
        exitAnim = AppTransitionAnimation.Custom.NO_ANIMATION
    )
)
```

> アニメーションリソース ID が無効な場合、デバッグビルドでは接続時に SDK が例外をスローします。リリースビルドでは、SDK はシステムのデフォルト遷移を使用します。

#### React Native

リーダーに接続する際に、`ConnectAppsOnDevicesParams` または `EasyConnectAppsOnDevicesParams` に `appTransitionAnimation` パラメーターを渡すことで、遷移をカスタマイズできます。

### プリセットアニメーションの使用

SDK には、追加のセットアップが不要なプリセットアニメーションがバンドルされています。`{ type: 'preset', preset: AppTransitionPreset.SlideFromBottom }` を渡します。

```typescript
import {
  useStripeTerminal,
  AppTransitionPreset,
} from '@stripe/stripe-terminal-react-native';

const { connectReader } = useStripeTerminal();

const { reader, error } = await connectReader({
  discoveryMethod: 'appsOnDevices',
  reader: selectedReader,
  appTransitionAnimation: { type: 'preset', preset: AppTransitionPreset.SlideFromBottom },
});
```

`SlideFromBottom` プリセットを使用すると、Stripe Reader アプリが画面の下部からスライドアップします。

### カスタムアニメーションの使用

Android アプリの `res/anim/` ディレクトリで、カスタムの Android アニメーションリソースを定義できます。その後、リソース ID を `enterAnim` および `exitAnim` として渡します。`enterAnim` は、Stripe Reader アプリが画面に表示される方法を制御します。`exitAnim` は、アプリが画面から消える方法を制御します。

```typescript
// enterAnim and exitAnim are Android resource IDs (numbers) from your res/anim/ directory
const enterAnim: number = /* your enter animation resource ID */;
const exitAnim: number = /* your exit animation resource ID */;

const { reader, error } = await connectReader({
  discoveryMethod: 'appsOnDevices',
  reader: selectedReader,
  appTransitionAnimation: { type: 'custom', enterAnim, exitAnim },
});
```

### 遷移アニメーションの無効化

`enterAnim` と `exitAnim` の両方に `0` を渡すことで、遷移アニメーションを無効にできます。一方向のみアニメーションを無効にするには、`enterAnim` または `exitAnim` のいずれかに `0` を渡します。

```typescript
const { reader, error } = await connectReader({
  discoveryMethod: 'appsOnDevices',
  reader: selectedReader,
  appTransitionAnimation: { type: 'custom', enterAnim: 0, exitAnim: 0 },
});
```

> アニメーションリソース ID が無効な場合、デバッグビルドでは接続時に SDK が例外をスローします。リリースビルドでは、SDK はシステムのデフォルト遷移を使用します。

### システムのデフォルトアニメーションの使用

Android システムのデフォルトの遷移を使用するには、`appTransitionAnimation` を省略するか、`{ type: 'systemDefault' }` を渡します。

### デバイス設定を開く際の遷移のカスタマイズ

アプリからリーダーの[設定画面](https://docs.stripe.com/terminal/payments/setup-reader/stripe-reader-s700-s710.md#settings)を開き、Wi-Fi の設定、ソフトウェアアップデートの確認、デバイス環境設定の調整を行うことができます。これには `stripe://settings/` ディープリンクが使用され、標準的な Android アクティビティの遷移がトリガーされます。

[リーダーの接続](https://docs.stripe.com/terminal/features/apps-on-devices/build.md#customize-transitions)時に設定された `appTransitionAnimation` パラメーターは、これらの遷移には適用されません。これは、決済操作中に SDK がトリガーするアニメーションのみを制御します。デバイス設定に移動する際に一貫した遷移を作成するには、SDK に組み込まれているアニメーションのプリセットとともに `ActivityOptions.makeCustomAnimation` を使用します。

Terminal SDK には、各プリセット用のアニメーションリソースファイルが含まれています。`.enterAnim` および `.exitAnim` を使用して、`AppTransitionPreset.SLIDE_FROM_BOTTOM` から開始および終了アニメーションのリソース ID にアクセスできます。現在、利用可能なプリセットは `SLIDE_FROM_BOTTOM` のみです。

#### Kotlin

```kotlin
import android.app.ActivityOptions
import com.stripe.stripeterminal.appsondevices.extensions.enterAnim
import com.stripe.stripeterminal.appsondevices.extensions.exitAnim
import com.stripe.stripeterminal.external.models.AppTransitionPreset

val options = ActivityOptions.makeCustomAnimation(
    this,
    AppTransitionPreset.SLIDE_FROM_BOTTOM.enterAnim,
    AppTransitionPreset.SLIDE_FROM_BOTTOM.exitAnim,
)
startActivity(
    Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse("stripe://settings/")),
    options.toBundle()
)
```

アニメーションを無効にするには、両方のアニメーションパラメーターに `0` を渡します。

#### Kotlin

```kotlin
val options = ActivityOptions.makeCustomAnimation(this, 0, 0)
startActivity(
    Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse("stripe://settings/")),
    options.toBundle()
)
```

## デバイス管理 [クライアント側]

アプリは特定のデバイス設定画面に直接ディープリンクできるため、ユーザーは管理メニュー全体を移動しなくても、必要な設定にアクセスできます。たとえば、「WiFi 設定」ボタンを追加してネットワーク設定を開いたり、最上位の設定メニューで操作しなくてもスタッフが画面の明るさを調整できるようにしたりできます。

### 利用可能なディープリンク

Android `ACTION_VIEW` インテントを使用して、次のいずれかの URI を起動します。

| デスティネーション | URI | 管理者 PIN が必要 |
| --- | --- | --- |
| すべての設定 | `stripe://settings/` | 常時 |
| ネットワーク | `stripe://settings/network/` | 常時 |
| 詳細設定 | `stripe://settings/advanced/` | 常時 |
| 登録コード | `stripe://settings/registration_code/` | 常時 |
| 外観 | `stripe://settings/appearance/` | スキップ可能 |
| 言語 | `stripe://settings/language/` | スキップ可能 |
| バグレポート | `stripe://settings/bug_report/` | スキップ可能 |

**スキップ可能**とマークされている画面は、デフォルトで管理者 PIN の入力を求めますが、アプリでプロンプトをスキップできます。以下の[管理者 PIN をスキップする](https://docs.stripe.com/terminal/features/apps-on-devices/build.md#bypass-the-admin-pin)をご覧ください。

- **ネットワーク**では、ユーザーが静的 IP やカスタム DNS 設定などの WiFi ネットワークを選択して設定できます。
- **詳細設定**では、[診断](https://docs.stripe.com/terminal/readers/stripe-reader-s700-s710.md#diagnostics)や出荷時設定へのリセットなどの追加設定にアクセスできます。
- **登録コード**は、Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/fleet/register-readers.md#smart-readers)するためのペアリングコードを生成します。
- **外観**は、画面の明るさとテーマを制御します。
- **バグレポート**は、デバイスのログと診断情報を収集し、トラブルシューティングのために Stripe サポートに送信します。
- **言語**は、リーダーの表示言語を制御します。

### 設定画面の起動

標準の Android `ACTION_VIEW` インテントを使用して設定画面を開きます。移行アニメーションをカスタマイズするには、[デバイスの設定を開く際の遷移をカスタマイズする](https://docs.stripe.com/terminal/features/apps-on-devices/build.md#customize-transitions-when-opening-device-settings)で説明されているように `ActivityOptions` バンドルを渡します。

動作する完全な例については、[Apps on Device のサンプルアプリ](https://github.com/stripe-samples/terminal-apps-on-devices)をご覧ください。

#### Kotlin

```kotlin
startActivity(
    Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse("stripe://settings/network/"))
)
```

### 管理者 PIN をスキップする

外観、言語、バグレポートの画面では、デバイスのデフォルト設定により管理者 PIN の入力が求められます。このプロンプトは、インテントに `bypass_admin_menu_passcode` エクストラを追加することでスキップできます。スタッフが毎回 PIN を入力する必要のない、リスクの低い画面で使用します。

#### Kotlin

```kotlin
startActivity(
    Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse("stripe://settings/appearance/"))
        .putExtra("bypass_admin_menu_passcode", true)
)
```

> 管理者 PIN は、機密性のない画面でのみスキップしてください。すべての設定、ネットワーク、詳細、登録コードの画面では、このフラグに関係なく常に PIN が必要です。

## アプリを測定する [クライアント側]

Stripe は、アプリケーションレベルの測定ソリューションを提供していません。アプリケーションのクラッシュやその他のログを追跡するには、Sentry や Crashlytics などのサードパーティーのライブラリを使用できます。

## デバイスのロケールを設定する [クライアント側]

デバイスユーザーが選択した言語 (国ではなく) は、[Locale.getDefault()](https://developer.android.com/reference/java/util/Locale#getDefault\(\)) によって返される値に入力されます。デバイスの言語は管理者設定で変更できます。

## 画面の向き [クライアント側]

Stripe Android デバイスでは、_自動回転画面_設定がデフォルトで有効になっています。アプリでは、UI を特定の画面の向きにロックすることで、この設定を上書きできます。

これは、マニフェストで関連する `<activity>` タグに [screenOrientation](https://developer.android.com/guide/topics/manifest/activity-element#screen) 属性を設定することで行えます。

```xml
<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait">
</activity>
```

あるいは、`Activity` クラスの [Activity::setRequestedOrientation](https://developer.android.com/reference/android/app/Activity#setRequestedOrientation(int) を使ってプログラムで設定することもできます。

#### Kotlin

```kotlin
class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Lock to portrait orientation
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

        // Or, lock to landscape orientation
        // requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
    }
}
```

## 制限 [クライアント側]

Stripe Android デバイスでは、戻るボタンやステータスバーなどのシステム UI は表示されません。

アプリでバッテリー残量、充電状態、接続状態をユーザーに伝える必要がある場合は、以下の Android API ドキュメントを参照してください:

- [電池残量と充電状態を監視する](https://developer.android.com/training/monitoring-device-state/battery-monitoring)
- [接続のステータスと種類をモニタリングする](https://developer.android.com/training/monitoring-device-state/connectivity-status-type)

## デバイスアクセサリーを扱う [クライアント側]

Stripe リーダーがドックに接続または切断すると、Android オペレーションシステムは[設定の変更](https://developer.android.com/guide/topics/resources/runtime-changes)をトリガーします。

デフォルトでは、設定が変更されるとアプリのアクティビティーは自動的に再作成されます。

ドックの接続時または切断時にアクティビティーの自動再作成を無効にするには、`AndroidManifest.xml` ファイルの `<activity>` エントリーに `android:configChanges="uiMode"` を追加します。

```xml
<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />
```

[Activity::onConfigurationChanged](https://developer.android.com/reference/android/app/Activity#onConfigurationChanged\(android.content.res.Configuration\)) を実装することにより、アクティビティーで設定変更が通知されるようにすることができます。このメソッドは、マニフェストで `android:configChanges` 属性で処理する設定を指定している場合にのみ呼び出されます。

```kotlin
class MainActivity : Activity() {
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // implement custom configuration change handling logic
    }
}
```

## アプリをテストする

S700 DevKit デバイスを使用して、Stripe ダッシュボードでアプリをテストするか、Android Debug Bridge (`adb`) を使用してアプリをテストします。

#### Android Debug Bridge (adb)

USB-A to USB-C ケーブルを使用して、DevKit デバイスをコンピューターに接続できます。次に、`adb` を使用して、アプリの構築済みの APK を DevKit デバイスに直接インストールします。

> #### 取引後の動作
> 
> カスタムアプリを直接インストールする場合、DevKit の優先キオスクアプリを設定することはできません。取引が完了すると、DevKit は常にデフォルトの Stripe リーダーアプリに戻ります。アプリを DevKit の優先キオスクアプリにするには、ダッシュボードの手順で説明されているように、デプロイグループを使用する必要があります。

以下の例では、アプリケーションの[パッケージ名](https://developer.android.com/studio/build/configure-app-module)が `com.example.myapp` で、[主要なアクティビティー](https://developer.android.com/reference/android/content/Intent.html#ACTION_MAIN)が `MainActivity` であると想定しています。

```
$ adb install myapp.apk
```

インストールが完了したら、アプリを起動します。

```
$ adb shell am start com.example.myapp/.MainActivity
```

管理者設定を開始します。

```
$ adb shell am start -d "stripe://settings/"
```

必要に応じて、アプリをアンインストールします。

```
$ adb uninstall com.example.myapp
```

Google の [Android Debug Bridge のドキュメント](https://developer.android.com/studio/command-line/adb) では、`adb` の使用に関する包括的なガイドが提供されています。

#### ダッシュボード

ダッシュボードでアプリをテストするには、以下の手順を実行します。

1. サンドボックスで、[Terminal リーダー](https://dashboard.stripe.com/test/terminal/readers)ページを開きます。
2. まだの場合は、**リーダーを登録**をクリックして、DevKit デバイスをアカウントに[登録](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=internet#register-reader)します。
3. **Terminal**\> **Software** をクリックします。
4. [Software](https://dashboard.stripe.com/terminal/software)タブで、デプロイするアプリを選択します。デプロイする新しいアプリを作成することもできます。
5. アプリの詳細ページで、**バージョンをデプロイする**をクリックします。
6. アプリの最新バージョンを選択して、**次へ**をクリックします。
7. [デプロイグループ](https://docs.stripe.com/terminal/features/apps-on-devices/deploy-in-dashboard.md)で DevKit デバイス用のものを選択して、**Next** をクリックします。
8. 優先キオスクアプリを選択し、 **次へ** をクリックします。Stripe リーダーは、電源を入れたときと各取引の後にこのアプリを起動します。デプロイするアプリが 1 つしかない場合は、そのアプリを選択します。
9. デプロイの詳細を確認して、**Deploy (デプロイ)** をクリックします。
10. DevKit デバイスを再起動して、アプリをデバイスにデプロイします。

### トラブルシューティング

以前にサイドロードでアプリをインストールしていた場合、再びデプロイを行おうとすると、`Failed to apply updates. Code: A9-com.example.posapp` (更新の適用に失敗しました。コード: A9-com.example.posapp) というエラーが表示されることがあります。

以下のコマンドを実行して、サイドロードされたアプリを手動でアンインストールする必要があります。

```
adb uninstall com.example.posapp
```

## 支払いをテストする

DevKit デバイスは、[ダッシュボード](https://dashboard.stripe.com/terminal/shop/thsku_FmpZaTqwezTFvS)で注文できる Stripe のテスト用の物理カードを使用してテスト支払いを処理できます。[支払いをテストする](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards)際に、小数を使用する金額を使用して特定の結果を生成することができます。

> DevKit デバイスで支払いをテストするときに、実際のカードを使用しないでください。

## 次のステップ

- [アプリの審査に向けて準備する](https://docs.stripe.com/terminal/features/apps-on-devices/app-review.md)
- [アプリを提出する](https://docs.stripe.com/terminal/features/apps-on-devices/submit.md)
