

# IVS Android Broadcast SDK の開始方法 \$1 Low-Latency Streaming
<a name="broadcast-android-getting-started"></a>

このドキュメントでは、Amazon IVS Low-Latency Streaming Android Broadcast SDK の使用を開始するための手順について説明します。

## ライブラリのインストール
<a name="broadcast-android-install"></a>

Amazon IVS Android Broadcast ライブラリを Android 開発環境に追加するには、ライブラリを以下に示すモジュールの `build.gradle` ファイル (最新バージョンの Amazon IVS Broadcast SDK) に追加します。

```
repositories {
    mavenCentral()
}
dependencies {
     implementation 'com.amazonaws:ivs-broadcast:1.40.0'
}
```

または、SDK を手動でインストールするには、次の場所から最新バージョンをダウンロードします。
+ [https://search.maven.org/artifact/com.amazonaws/ivs-broadcast](https://search.maven.org/artifact/com.amazonaws/ivs-broadcast)

## デバッグ情報を含む SDK の使用
<a name="broadcast-android-using-debug-symbols-ll"></a>

また、デバッグ情報を含む Android Broadcast SDK のバージョンも公開しています。このバージョンを使用すると、IVS Broadcast SDK (つまり、`libbroadcastcore.so` ) でクラッシュした場合、Firebase Crashlytics のデバッグレポート (スタックトレース) の品質を向上させることができます。これらのクラッシュを IVS SDK チームに報告すると、高品質のスタックトレースにより、問題の修正が容易になります。

このバージョンの SDK を使用するには、Gradle ビルドファイルに以下を含めます。

```
implementation "com.amazonaws:ivs-broadcast:$version:unstripped@aar"
```

以下の代わりに上記の行を使用します。

```
implementation "com.amazonaws:ivs-broadcast:$version@aar"
```

### Firebase Crashlytics へのシンボルのアップロード
<a name="android-debug-symbols-ll-firebase-crashlytics"></a>

Gradle ビルドファイルが Firebase Crashlytics 用に設定されていることを確認します。以下の Google の指示に従ってください。

[https://firebase.google.com/docs/crashlytics/ndk-reports](https://firebase.google.com/docs/crashlytics/ndk-reports)

`com.google.firebase:firebase-crashlytics-ndk` を依存関係として必ず含めてください。

リリース用にアプリを構築する場合、Firebase Crashlytics プラグインは情報を自動的にアップロードするはずです。情報を手動でアップロードするには、次のいずれかを実行します。

```
gradle uploadCrashlyticsSymbolFileRelease
```

```
./gradlew uploadCrashlyticsSymbolFileRelease
```

(情報が自動と手動の両方で 2 回アップロードされても問題ありません)。

### Release .apk の肥大化を防ぐ
<a name="android-debug-symbols-ll-sizing-apk"></a>

リリース `.apk` ファイルをパッケージ化する前に、Android Gradle Plugin は共有ライブラリ (IVS Broadcast SDK の `libbroadcastcore.so` ライブラリを含む) からデバッグ情報を自動的に削除しようとします。ただし、これはときに動作しないことがあります。その結果、`.apk` ファイルが肥大化し、Android Gradle プラグインから、「デバッグ情報を削除できず、そのまま `.so` ファイルをパッケージ化している」という警告メッセージが表示される可能性があります。このような場合は、以下のことを試してみます。
+ Android NDK をインストールします。すべての最新バージョンが機能します。
+ `ndkVersion <your_installed_ndk_version_number>` をアプリケーションの `build.gradle` ファイルに追加します。アプリケーション自体にネイティブコードが含まれていない場合でも、これを行います。

詳細については、「[問題レポート](https://issuetracker.google.com/issues/353554169)」を参照してください。

## イベントリスナーの作成
<a name="broadcast-android-create-event-listener"></a>

イベントリスナーを設定すると、状態更新、デバイス変更通知、エラー、およびセッションオーディオ情報を受信できます。

```
BroadcastSession.Listener broadcastListener = 
          new BroadcastSession.Listener() {
    @Override
    public void onStateChanged(@NonNull BroadcastSession.State state) {
        Log.d(TAG, "State=" + state);
    }

    @Override
    public void onError(@NonNull BroadcastException exception) {
        Log.e(TAG, "Exception: " + exception);
    }
};
```

## 必要なアクセス許可
<a name="broadcast-android-permissions"></a>

アプリはユーザーのカメラとマイクへのアクセス許可を要求する必要があります。(これは、Amazon IVS に特有なものではなく、カメラやマイクにアクセスする必要があるアプリケーションには必須です。)

ここでは、ユーザーがすでにアクセス許可を付与しているかどうかを確認し、付与していない場合は、許可を求めます。

```
final String[] requiredPermissions =
         { Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO };

for (String permission : requiredPermissions) {
    if (ContextCompat.checkSelfPermission(this, permission) 
                != PackageManager.PERMISSION_GRANTED) {
        // If any permissions are missing we want to just request them all.
        ActivityCompat.requestPermissions(this, requiredPermissions, 0x100);
        break;
    }
}
```

ここでは、ユーザーの応答を取得します。

```
@Override
public void onRequestPermissionsResult(int requestCode, 
                                      @NonNull String[] permissions,
                                      @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode,
               permissions, grantResults);
    if (requestCode == 0x100) {
        for (int result : grantResults) {
            if (result == PackageManager.PERMISSION_DENIED) {
                return;
            }
        }
        setupBroadcastSession();
    }
}
```

## ブロードキャストセッションの作成
<a name="broadcast-android-create-session"></a>

ブロードキャストインターフェースは `com.amazonaws.ivs.broadcast.BroadcastSession` です。以下に示すように、プリセットを使用して初期化します。初期化中にエラーが発生した場合（コーデックの設定に失敗など）、`BroadcastListener` にエラーメッセージが表示され、`broadcastSession.isReady` が `false` になります。

**重要:** Amazon IVS Broadcast SDK for Android へのすべての呼び出しは、SDK がインスタンス化されたスレッドで行う必要があります。***別のスレッドからの呼び出しにより、SDK は致命的なエラーをスローし、ブロードキャストを停止します*。

```
// Create a broadcast-session instance and sign up to receive broadcast
// events and errors.
Context ctx = getApplicationContext();
broadcastSession = new BroadcastSession(ctx,
                       broadcastListener,
                       Presets.Configuration.STANDARD_PORTRAIT,
                       Presets.Devices.FRONT_CAMERA(ctx));
```

また、「[ブロードキャストセッションの作成 (詳細バージョン)](broadcast-android-use-cases.md#broadcast-android-create-session-advanced)」も参照してください。

## プレビュー用に ImagePreviewView を設定する
<a name="broadcast-android-set-imagepreviewview"></a>

アクティブなカメラデバイスのプレビューを表示する場合は、デバイスのプレビュー `ImagePreviewView` をビュー階層に追加します。

```
// awaitDeviceChanges will fire on the main thread after all pending devices 
// attachments have been completed
broadcastSession.awaitDeviceChanges(() -> {
    for(Device device: session.listAttachedDevices()) {
        // Find the camera we attached earlier
        if(device.getDescriptor().type == Device.Descriptor.DeviceType.CAMERA) {
            LinearLayout previewHolder = findViewById(R.id.previewHolder);
            ImagePreviewView preview = ((ImageDevice)device).getPreviewView();
            preview.setLayoutParams(new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT));
            previewHolder.addView(preview);
        }
    }
});
```

## ブロードキャストを開始する
<a name="broadcast-android-start"></a>

`GetChannel` オペレーションの `ingestEndpoint` レスポンスフィールドで受信するホスト名には、`rtmps://` を先頭に追加して `/app` を末尾に追加する必要があります。URL は、`rtmps://{{ ingestEndpoint }}/app` の形式にする必要があります。

```
broadcastSession.start(IVS_RTMPS_URL, IVS_STREAMKEY);
```

Android Broadcast SDK は RTMPS 取り込みのみをサポートしています (安全ではない RTMP 取り込みはサポートしていません)。

## ブロードキャストを停止する
<a name="broadcast-android-stop"></a>

```
broadcastSession.stop();
```

## ブロードキャストセッションを解放する
<a name="broadcast-android-release-session"></a>

`broadcastSession.release()` メソッドは、ブロードキャストセッションが使用されなくなったときに呼び出され、ライブラリが使用するリソースを解放する必要があります。**

```
@Override
protected void onDestroy() {
    super.onDestroy();
    previewHolder.removeAllViews();
    broadcastSession.release();
}
```