이 Android 채팅 SDK 튜토리얼에서는 Agora Video SDK for Android를 사용하여 가상 미팅을 위한 기본 1대1 비디오 채팅 앱을 10단계로 쉽게 구축해 보겠습니다.
업데이트: 2020년 5월 24일
이 1대1 비디오 채팅 앱 튜토리얼과 프로젝트는 Agora Video for Android SDK의 v3.4.1 버전을 사용하도록 업데이트되었습니다.
채팅 앱 튜토리얼 – 안드로이드 사전 요구 사항
- Android Studio
- (https://developer.android.com/studio)
- 자바 및 안드로이드 SDK에 대한 기본 지식
- (https://developer.android.com/training/basics/firstapp)
- Agora 개발자 계정
- (참고: Agora 시작하기)
단계 1: 앱 ID 획득
가입 과정을 완료하면 Agora 콘솔로 자동으로 이동됩니다. 왼쪽 네비게이션의 ‘프로젝트’ 탭을 열어 기본 프로젝트의 앱 ID를 확인하세요.
JCenter 통합
프로젝트 수준 /app/build.gradle
에 다음 줄을 추가하세요:
allprojects {
repositories { ...// Jit pack
maven { url ‘https://www.jitpack.io' }
}
}
다음 줄을 프로젝트의 /app/build.gradle 파일의 끝에 추가하세요:
dependencies {
...//Agora RTC SDK for video call
implementation 'com.github.agorabuilder:native-full-sdk:3.4.1'
}

수동 통합
최종 프로젝트에서는 업데이트를 쉽게 하기 위해 JCenter를 사용하지만, SDK를 수동으로 추가하는 방법을 보여주는 것도 좋습니다. 먼저, 온라인 Agora Developer Center에서 Agora Video SDK for Android를 다운로드합니다.

빈 Android 프로젝트에 SDK 라이브러리 폴더를 Android 프로젝트의 libs 폴더에 추가합니다 (파일 탐색기에서):

libs 폴더의 위치를 build.gradle 파일과 관련하여 반드시 기록해 두세요. 다음으로, app/src/main/build.gradle 의 의존성 목록에 libs 폴더의 저장 디렉토리를 설정해야 합니다. Gradle은 build.gradle
파일 상대 경로를 읽기 때문에, Gradle이 libs 폴더를 포함하도록 알려주기 위해 이 fileTree
선언을 추가할 수 있습니다.

다음으로, sourceSets
를 build.gradle 내에 추가하십시오. 다시 한 번 libs 폴더의 경로가 build.gradle 파일 상대 경로인지 확인하십시오.

Agora 앱 ID 설정
다음으로, Agora 앱 ID (단계 1 참조)를 Android 프로젝트의 Strings.xml (app/src/main/res/values/Strings.xml)에 추가합니다.
<resources>
<string name="app_name">Agora-Android-Video-Tutorial</string>
<string name="agora_app_id"><#YOUR APP ID#></string>
</resources>

참고: 이 가이드에서는 토큰 인증을 구현하지 않습니다. 토큰 인증은 모든 RTE 앱이 생산 환경에서 실행될 때 권장됩니다.
Agora 플랫폼 내 토큰 기반 인증에 대한 자세한 내용은 다음 가이드를 참조하세요:
다음 단계는 Manifest.xml 내부에 적절한 권한을 추가하는 것입니다.

마지막 단계는 Agora 클래스의 난독화를 방지하는 것입니다. 이 과정은 복잡해 보일 수 있지만, 실제로는 매우 간단합니다. proguard-rules.pro
파일에서 Agora SDK에 대한
-keep
클래스 구성을 추가합니다.
-keep class io.agora.**{*;}

참고: 이 프로젝트에 Android NDK 플러그인이 설치되고 설정되어 있는지 확인하세요.
단계 4: 뷰 설정
Agora Video SDK를 통합했으니 이제 Android 1대1 비디오 채팅 앱의 UI를 설정해 보겠습니다. 표준 UI 요소를 사용하기 때문에 이 부분은 간단히 설명하겠습니다.

예제에서 저는 다양한 UI 요소로 ImageView
를 Button
대신 사용했습니다. 둘 다 가능합니다. 중요한 점은 onClick
속성을 사용하여 연결하는 기능이 있다는 것입니다.
단계 5: 권한 확인
당신은 아마도 “이미 권한을 설정하지 않았나요?”라고 생각하실 것입니다. 이전에 우리는 Android 라이브 비디오 채팅 앱이 사용할 권한을 애플리케이션의 Manifest에 알려주었지만, 라이브 비디오 통화 중에 사용자에게 이 권한을 명시적으로 요청해야 합니다. 걱정 마세요—이것은 기본 프로젝트를 실행하기 위한 마지막 단계이며, 매우 간단합니다.
먼저 요청할 권한을 선언해 보겠습니다:
// Permissions
private static final int PERMISSION_REQ_ID = 22;
private static final String[] REQUESTED_PERMISSIONS = {Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA};
다음으로, 작업을 돕기 위해 몇 가지 함수를 설정합니다.

먼저, 특정 권한 문자열과 코드에 대한 권한을 요청하는 방법이 있습니다.
다음으로, 사용자가 권한 요청 창에 응답한 후 호출되는 콜백 메서드가 있습니다.
마지막으로, 우리 클래스의 onCreate
메서드에서 권한이 부여되었는지 확인합니다. 권한이 부여되지 않았다면 위의 메서드들이 요청을 처리합니다.

단계 6: Agora SDK 초기화
이제 뷰를 준비했으므로 Agora 비디오 통화 API를 사용하여 Agora 비디오 SDK를 초기화하고 프로필을 설정하며 비디오 품질 설정을 조정할 수 있습니다.
이전 단계에서 initAgoraEngine()
라는 이름을 사용한 부분이 몇 군데 있었을 것입니다. 초기화 과정에 들어가기 전에, 현재 활동이 Agora RtcEngine 인스턴스에 접근할 수 있는지 확인해야 합니다.

MainActivity
클래스에서 RtcEngine 인스턴스를 저장하기 위해 클래스 속성을 선언해야 합니다.
private RtcEngine mRtcEngine;
이제 초기화 단계입니다. 모든 기본 설정이 완료되었으니, 드디어 1대1 비디오 채팅 앱에서 Agora 엔진을 사용해 볼 수 있는 단계에 이르렀습니다!
클래스 내에 initAgoraEngine()
메서드를 선언하세요. 이 함수 내에서 baseContext, Agora 앱 ID(위에서 선언됨), 그리고 RtcEngineEventHandler의 인스턴스를 사용하여 RtcEngine의 새 인스턴스를 생성할 것입니다(이 부분은 나중에 자세히 설명하겠습니다).
새로운 인스턴스를 생성한 후에는 사용자의 세션을 설정해야 합니다. 여기에서 채널 프로필을 '통신'으로 설정합니다. 이는 라이브 비디오 통화이기 때문에 방송이 아니기 때문입니다. 또한 여기에서 비디오 인코더 설정을 구성합니다.

참고: 이 빌드 단계에서는 에뮬레이터를 사용하여 작업을 테스트할 수 있지만, 저는 모바일 기기를 사용하기로 선택했습니다.
단계 7: 비디오 스트림 연결
라이브 비디오 통화에 참여하기 전에, 이전에 설정된 UI 요소(step 4)를 통해 사용자에게 로컬 비디오 스트림을 표시할 수 있어야 합니다. 참고로, 아래는 로컬 비디오가 렌더링될 UI 요소의 ID입니다:
android:id="@+id/floating_video_container"
첫 번째 줄에서 비디오 스트림의 부모 뷰로 사용할 UI 요소의 참조를 얻습니다. 두 번째 단계는 RtcEngine
를 사용하여 전면 카메라에서 스트림을 렌더링하는 SurfaceView를 생성합니다. 또한 새로운 videoSurface
를 부모 뷰 위에 렌더링되도록 설정합니다. 다음 단계는 videoSurface
를 UI 요소의 하위 뷰로 추가하는 것입니다. 마지막으로, VideoCanvas
객체의 일부로 videoSurface를 엔진에 전달합니다. uid 매개변수는 빈 상태로 두어 SDK가 각 사용자를 위해 동적 ID를 생성하도록 합니다.
이제 로컬 비디오 피드가 설정되었으므로, 유사한 기능을 사용하여 원격 비디오 스트림을 연결해야 합니다.
원격 비디오와 로컬 비디오의 주요 차이점은 VideoCanvas
객체를 통해 엔진에 전달되는 사용자 ID 매개변수입니다. 마지막 줄은 대체 옵션을 설정합니다: 비디오 품질이 저하되면 엔진은 오디오만 재생합니다:

단계 8: SDK 이벤트 핸들러 설정
이전 단계에서 RtcEngineEventHandler에 참조를 추가했으며, 이제 이 클래스를 MainActivity
클래스의 속성으로 선언해야 합니다. 엔진은 RtcEngineEventHandler에서 이 메서드들을 호출합니다.
각 이벤트는 비교적 간단한 기능을 트리거하며, 이 중 하나는 이전 단계에서 작성한 기능입니다. 간결성을 위해 아래에 코드를 제공하지만, 자세한 설명은 생략합니다.
의문이 있는 부분이 있다면 언제든지 댓글을 남겨주세요
단계 9: 채널 가입 및 탈퇴
단계 9라고요?! 걱정 마세요 — 다음 두 단계는 매우 간단합니다. 먼저 통화 참여부터 시작해 보겠습니다.
참고: 채널에 참여할 때 uid를 지정하지 않으면 엔진이 자동으로 할당합니다.
첫 번째 줄에서 볼 수 있듯이 Agora 비디오 통화 API는 매우 간단합니다: 엔진은 joinChannel
를 호출하며, 채널 이름을 전달한 후 로컬 비디오 스트림을 설정하는 호출(Step 7)을 수행합니다.
참고: 동영상 제거 방법은 단계 8에서 사용된 방법과 동일합니다.
채널을 떠나는 것은 더 간단합니다: 엔진은 leaveChannel
를 호출합니다. 위에서 각 UI 요소에서 동영상 스트림 서브뷰를 제거하는 몇 줄의 코드가 있음을 확인할 수 있습니다.
단계 10: 기타 기능 추가
남은 부분은 로컬 장치에서 마이크 및 동영상 스트림을 토글하기 위해 UI 요소를 연결하는 것과 관련됩니다. 먼저 오디오 토글 기능을 시작해 보겠습니다.
먼저 버튼의 참조를 얻은 후 isSelected()
를 사용하여 버튼이 켜져 있는지 꺼져 있는지 확인합니다. UI 요소 상태를 업데이트한 후 버튼의 업데이트된 상태를 RtcEngine
에 전달합니다.
비디오 토글로 넘어갑니다:
오디오 토글과 마찬가지로, 버튼의 상태를 isSelected()
를 사용하여 확인하거나 업데이트한 후 이를 RtcEngine
에 전달합니다. 비디오가 음소거되었음을 시각적으로 더 명확하게 표시하기 위해 videoSurface
를 숨기거나 표시합니다.

Agora SDK를 사용하여 안드로이드용 1대1 비디오 채팅 앱을 함께 만들어가는 과정이 즐거우셨기를 바랍니다.
전체 소스 코드:

질문이나 의견이 있으시면, Agora Developer Slack 커뮤니티에 참여해 주시기를 초대합니다.