

# IVS Android Player SDK 시작하기
<a name="android-getting-started"></a>

이 문서에서는 Amazon IVS Android Player SDK 시작하기와 관련된 단계를 안내합니다.

## 라이브러리 설치
<a name="android-install"></a>

Amazon 개발 환경에 Amazon IVS Android 플레이어 라이브러리를 추가하려면 여기에 나온 것처럼(최신 버전의 Amazon IVS 플레이어용) 라이브러리를 모듈의 `build.gradle` 파일에 추가합니다.

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

또는 SDK를 수동으로 설치하려면 다음 위치에서 최신 버전을 다운로드하세요.
+ [https://search.maven.org/artifact/com.amazonaws/ivs-player](https://search.maven.org/artifact/com.amazonaws/ivs-player)

## 디버그 기호와 함께 SDK 사용
<a name="player-android-using-debug-symbols-ll"></a>

디버그 기호가 포함된 Android Player SDK 버전도 게시합니다. IVS Player SDK에서 충돌이 발생하는 경우(즉, `libplayercore.so`) 이 버전을 사용하여 Firebase Crashlytics의 디버그 보고서(스택 트레이스) 품질을 개선할 수 있습니다. 이러한 충돌을 IVS SDK 팀에 보고하는 경우 스택 추적 품질이 좋을수록 문제를 쉽게 수정할 수 있습니다.

이 버전의 SDK를 사용하려면 Gradle 빌드 파일에서 다음 줄을 바꿉니다.

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

다음으로 대체합니다.

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

### Firebase Crashlytics에 기호 업로드
<a name="player-android-debug-symbols-ll-firebase-crashlytics"></a>

Firebase Crashlytics에 Gradle 빌드 파일이 설정되어 있는지 확인합니다. 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
```

(기호를 자동 및 수동으로 두 번 업로드해도 문제가 되지 않습니다.)

### 릴리스 .apk가 커지지 않도록 방지
<a name="player-android-debug-symbols-ll-sizing-apk"></a>

릴리스 `.apk` 파일을 패키징하기 전에 Android Gradle 플러그인에서는 공유 라이브러리(IVS Player SDK의 `libplayercore.so` 라이브러리 포함)에서 디버그 정보를 자동으로 제거하려고 시도합니다. 그러나 가끔은 이 상황이 발생하지 않습니다. 이 경우 `.apk` 파일이 커질 수 있으며, 디버그 기호를 제거할 수 없고 `.so` 파일을 그대로 패키징하고 있다는 Android Gradle 플러그인의 경고 메시지가 표시될 수 있습니다. 이 상황이 발생하면 다음과 같은 작업을 수행합니다.
+ Android NDK를 설치합니다. 최신 버전이 작동합니다.
+ 애플리케이션의 `build.gradle` 파일에 `ndkVersion <your_installed_ndk_version_number>`를 추가합니다. 애플리케이션 자체에 네이티브 코드가 없더라도 이 작업을 수행합니다.

자세한 내용은 이 [문제 보고서](https://issuetracker.google.com/issues/353554169)를 참조하세요.

## 플레이어 생성 및 이벤트 리스너 설정
<a name="android-create-player"></a>

플레이어 인터페이스는 `com.amazonaws.ivs.player.Player`입니다. 아래 그림과 같이 초기화합니다.

```
// Create a player instance
// <this> refers to the current Android Activity
player = Player.Factory.create(this);

// Set up to receive playback events and errors 
player.addListener(this);
```

또는 `PlayerView`를 사용하여 초기화합니다.

```
// Create a player instance
// <this> refers to the current Android Activity
PlayerView playerView = new PlayerView(this);
Player player = playerView.getPlayer();
// Set up to receive playback events and errors 
player.addListener(this);
```

**참고:** 리스너 콜백 메서드는 Android 애플리케이션의 기본 스레드에서 실행됩니다.

## SurfaceView for Video 설정
<a name="android-set-surface-view"></a>

`PlayerView`를 사용하지 않는 경우 비디오를 표시하려면 `SurfaceView`를 Android UI 레이아웃에 추가합니다. `Surface`가 사용 가능해야 비디오 스트림을 재생할 수 있습니다. `getHolder()`를 호출하여 검색된 `SurfaceHolder` 인터페이스를 통해 기본 Surface에 액세스할 수 있습니다. (Android 개발자 참조의 [SurfaceView](https://developer.android.com/reference/android/view/SurfaceView.html)를 참조하세요.) `SurfaceHolder.Callback`을 사용하여 Surface 변경에 대한 이벤트를 수신합니다([SurfaceHolder.Callback](https://developer.android.com/reference/android/view/SurfaceHolder.Callback) 참조).

```
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
surfaceView.getHolder().addCallback(this);

@Override
public void surfaceCreated(SurfaceHolder holder) {
   this.surface = holder.getSurface();
   if (player != null) {
       player.setSurface(this.surface);
   }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
   this.surface = null;
   if (player != null) {
       player.setSurface(null);
   }
}
```

## 스트림 재생
<a name="android-play-stream"></a>

스트림이 비동기식으로 로드되기 때문에 애플리케이션에서 `play` 메서드를 호출하여 재생을 시작하기 전에 플레이어는 `READY` 상태여야 합니다. `Player.Listener` 인터페이스를 사용하여 플레이어가 올바른 상태인 시점을 확인할 수 있습니다.

다음 예제 코드를 참조하세요.

```
player.load(Uri.parse(url));

@Override
public void onStateChanged(Player.State state) {
    switch (state) {
        case BUFFERING:
            // player is buffering
            break;
        case READY:
            player.play();
            break;
        case IDLE:
            break;
        case PLAYING:
            // playback started
            break;
     }
}
```

## 플레이어 해제
<a name="android-release-player"></a>

플레이어가 더 이상 사용되지 않을 때 라이브러리에서 사용하는 리소스를 해제하려면 `player.release()` 메서드를 호출*해야* 합니다. 일반적으로 이 작업은 플레이어가 포함된 활동 또는 조각의 `onDestroy` 콜백에서 완료됩니다.

```
@Override
protected void onDestroy() {
    super.onDestroy();
    player.removeListener(this);
    player.release();
}
```

`player.release()` 메서드가 호출되면 플레이어를 더 이상 사용할 수 없습니다.

## 권한
<a name="android-permissions"></a>

Android 플레이어 SDK에는 다음 권한이 필요합니다.

```
<uses-permission android:name="android.permission.INTERNET" />
```

또한 다음과 같은 선택적 권한으로 재생 환경을 향상할 수 있습니다.

```
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
```

## 스레드 안전
<a name="android-thread-safety"></a>

플레이어 API는 스레드 안전 기능이 아닙니다. 플레이어 인스턴스에 대한 모든 직접 호출은 동일한 스레드에서 이루어져야 합니다.

## SDK 크기
<a name="android-sdk-size"></a>

Amazon IVS Player SDK는 최대한 가볍게 설계되었습니다. SDK 크기에 대한 최신 정보는 [릴리스 정보](release-notes.md)를 참조하세요.

**중요:** 크기 영향을 평가할 때 Android Studio에서 생성한 AAB/APK의 크기는 사용자 디바이스에 다운로드되는 앱의 크기를 나타내지 않습니다. Google Play 스토어에서는 최적화를 통해 앱의 크기를 줄입니다. [Android 앱 번들](https://developer.android.com/guide/app-bundle)을 사용하여 각 디바이스에 최적화된 앱을 제공하는 것이 좋습니다.