Androidの基本クライアントの設定
このチュートリアルでは、Vonage Video API を使用する基本的な Android クライアントを設定する手順を順を追って説明します。
概要
Vonage Video API を使用するすべてのアプリケーションには、以下の両方が必要です。 クライアント そして サーバー コンポーネント。クライアントサイドのコードとは、エンドユーザーのデバイス(スマートフォン、パソコン)に読み込まれ、OpenTokの機能の大部分を処理するもので、これには以下が含まれます。 接続 に対する セッション, 出版 オーディオ・ビデオ ストリーム をセッションに追加し 購読 を他のクライアントのストリームに追加する。クライアント、サーバー、セッションの詳細については、以下を参照のこと。 ビデオAPIの基礎.
このチュートリアルでは OpenTok Android SDK、Androidデバイス向けのOpenTokクライアントサイドライブラリを使用して、リアルタイムの双方向ビデオアプリケーションを迅速かつ簡単に構築できます。
このチュートリアルでは、以下の項目について解説します:
- 必要条件
- ステップ1:新しいプロジェクトの作成
- ステップ 2: OpenTok Android SDK の追加
- ステップ3:認証の設定
- ステップ4:権限の要求
- ステップ 5:セッションへの接続
- ステップ 6: サンプルアプリの UI を調整する
- ステップ 7: ストリームをセッションに公開する
- ステップ 8: 他のクライアントストリームの購読
- ステップ9:アプリの実行
- 次のステップ
- サーバーの設定
完成予想時間:25分
このチュートリアルをスキップしたい? 完成したAndroidクライアントのコードは ベーシック・ビデオチャット-Java のフォルダにあります。 Androidサンプルアプリレポ をGitHubにアップした。このレポには、コードを実行し探索するためのドキュメントを含むREADMEが含まれています。また、このチュートリアルではAndroidサンプルアプリのJavaバージョンについて説明します。ドキュメント付きのKotlinバージョンについては Androidサンプルアプリレポ.
必要条件
このチュートリアルを完成させるために必要なもの:
- 有効なVonage Video APIアカウント - お持ちでない場合は、以下のことが可能です。 無料体験を申し込む
- アンドロイドスタジオ
ステップ1:新しいプロジェクトの作成
-
Android Studioを開き 新プロジェクト より ファイル メニューがある。
-
アプリの最小SDKをAPI 16(Android 4.1、Jelly Bean)に設定してください。
-
ウィザードをクリックし 空のアクティビティ が選択されている。を残す。 活動名 に設定する。
MainActivityを残す。 レイアウト名 に設定する。activity_main.
ステップ 2: OpenTok Android SDK の追加
このアプリでは、Maven を使用して OpenTok Android SDK を読み込んでいます:
-
プロジェクトのルートで)プロジェクトのbuild.gradleを編集し、以下のコード・スニペットを
allprojects/repositoriesセクションを参照されたい:mavenCentral()この時点で、build.gradleファイルは以下のようになっているはずだ:
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:4.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir } -
あなたのモジュールのbuild.gradle(app/build.gradleファイル)を修正し、dependenciesセクションに以下のコード・スニペットを追加する:
implementation 'com.opentok.android:opentok-android-sdk:2.22.0'OpenTok Android 2.16.0 以降を使用する場合は、以下の内容を
androidセクションも同様だ:compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }この時点で、モジュールのbuild.gradleファイルは以下のようになっているはずだ:
apply plugin: 'com.android.application' android { compileSdkVersion 32 defaultConfig { applicationId "com.example.myapplication" minSdkVersion 16 targetSdkVersion 32 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.annotation:annotation:1.1.0' implementation 'com.opentok.android:opentok-android-sdk:2.22.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } -
プロジェクトを同期する。
ステップ3:認証の設定
OpenTokセッションに接続するには、クライアントは認証情報(つまり、 APIキー, セッションIDそして トークン.本番アプリケーションでは、これらの認証情報は サーバー、ですが、作業を効率化するため、ひとまず値を直接記述することにします:
-
を作成する。
OpenTokConfigクラス([ファイル] | [新規作成] | [Javaクラス])を作成し、APIキー、セッションID、トークンを格納するための静的変数をいくつか追加します。また、ログメッセージの識別子や権限用の定数もいくつか追加します:public class OpenTokConfig { public static final String API_KEY = ""; public static final String SESSION_ID = ""; public static final String TOKEN = ""; } -
の値をハードコーディングしてコードを調整する。
API_KEY,SESSION_IDそしてTOKEN.これを行うには、ご自身のアカウントにログインして Video APIアカウント, 新しいOpenTok APIプロジェクトを作成するか、既存のOpenTok APIプロジェクトを使用し、プロジェクトページに移動して、ページを下へスクロールして プロジェクトツール セクションを参照してください。そこから、セッションIDとトークンを手動で生成することができます。プロジェクトのAPIキーと、生成したセッションIDとトークンを使用してください。
重要だ: テストや開発中は、引き続きAccountからセッションIDやトークンの値を取得できますが、本番環境に移行する前にサーバーを設定する必要があります。これについては、 次のステップ このチュートリアルの最後で。
セッション、トークン、サーバーの詳細については、以下を参照してください。 ビデオAPIの基礎.
ステップ4:権限の要求
私たちのアプリは、ユーザーのデバイスからオーディオとビデオを使用するため、オーディオとビデオの許可を要求するコードを追加する必要があります。そのために イージー・パーミッション ライブラリでこれを行う。
-
プロジェクトにEasyPermissionsライブラリを追加することから始めます。 build.gradle を作成し(app/build.gradleファイル)、dependenciesセクションに以下のコード・スニペットを追加します:
implementation 'pub.devrel:easypermissions:3.0.0' -
あなたの AndroidManifest.xml ファイル内に次のコード・スニペットを追加する。
manifestのタグがある:<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> -
あなたの MainActivity.java という新しいメソッドを追加する。
onRequestPermissionsResult:@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }これはEasyPermissionsライブラリを使用するためのボイラープレートコードです。
重要だ: をクリックして、手動でインポートを追加する必要があります。 イージー・パーミッション (赤文字)を選択し、macOS では Option + Enter、Windows では Alt + Enter のキーコンビネーションを押します。コードを貼り付ける際に、この手順が必要になる場合があります。また、「即座に明確なインポートを追加」オプション(環境設定 | エディタ | 自動インポート)を有効にすると、インポートが自動的に追加されます。
-
を追加する。
PERMISSIONS_REQUEST_CODEプロパティの先頭にある MainActivity.java ファイル:private static final int PERMISSIONS_REQUEST_CODE = 124; -
次に
requestPermissions()メソッドを使用する:@AfterPermissionGranted(PERMISSIONS_REQUEST_CODE) private void requestPermissions() { String[] perms = { Manifest.permission.INTERNET, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO }; if (EasyPermissions.hasPermissions(this, perms)) { // initialize and connect to the session } else { EasyPermissions.requestPermissions(this, "This app needs access to your camera and mic to make video calls", PERMISSIONS_REQUEST_CODE, perms); } }これは、パーミッションがすでに付与されているかどうかをチェックします。もしまだ許可されていなければ、カメラとマイクの許可を求めるために
EasyPermissions.requestPermissionsメソッドを使用する。パーミッションが付与されると、このメソッドは
@AfterPermissionGranted(PERMISSIONS_REQUEST_CODE)アノテーションを追加します。これからのステップで、セッションオブジェクトとビューオブジェクトを初期化するコードを追加します。 -
を加える。
requestPermission();の中のメソッドを呼び出す。onCreate()メソッドを使用する:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermissions(); }
ステップ 5:セッションへの接続
次に、OpenTokセッションに接続します。セッションに音声・映像ストリームを配信したり、他の参加者のストリームを視聴したりするには、この操作を先に完了しておく必要があります。
-
追加
sessionプロパティをMainActivityクラスに追加します。 ステップ3):private Session session;Session クラスは、OpenTok Android SDK で定義されています。このクラスは OpenTok セッションを表しており、セッションを操作するためのメソッドが含まれています。
-
ログ記録を容易にするために、次のコードを追加してください。
TAGプロパティの先頭にあるMainActivityクラスである:private static final String TAG = MainActivity.class.getSimpleName(); -
の中で
requestPermissions()メソッドの下に以下のコードを追加します。// initialize and connect to the sessionコメントでセッション・オブジェクトをインスタンス化し、そのconnect(token)メソッドを使用する:initializeSession(OpenTokConfig.API_KEY, OpenTokConfig.SESSION_ID, OpenTokConfig.TOKEN); -
のすぐ下にある
requestPermissions()メソッドに以下のコードを追加する:private void initializeSession(String apiKey, String sessionId, String token) { Log.i(TAG, "apiKey: " + apiKey); Log.i(TAG, "sessionId: " + sessionId); Log.i(TAG, "token: " + token); session = new Session.Builder(this, apiKey, sessionId).build(); session.setSessionListener(sessionListener); session.connect(token); }このコードでは
Session.Builder()でセッションオブジェクトをインスタンス化します。コンストラクタは3つのパラメータを取ります:- このプロセスに関連付けられたAndroidアプリケーションコンテキスト
- OpenTok API キー
- セッションID
について
Session.Builder.build()メソッドは新しい Session インスタンスを返します。について
Session.setSessionListener()メソッドは、SessionListener インターフェースを実装するオブジェクトを設定します。このインターフェイスは、セッション関連のイベントに応答して呼び出されるコールバックメソッドを含んでいます。(次のステップで実装します)。について
Session.connect()のメソッドを使用する。sessionこのオブジェクトは、クライアントアプリケーションを OpenTok セッションに接続します。セッション内で音声・映像ストリームを送受信する前(あるいは、セッションに対して何らかの操作を行う前)に、接続を行う必要があります。このconnect()このメソッドは、1つのパラメータを受け取ります。それは、このクライアントがOpenTokセッションに接続するための認証トークンです。 -
次に
sessionListenerプロパティを追加する。以下のコードをMainActivityクラスである:private Session.SessionListener sessionListener = new Session.SessionListener() { @Override public void onConnected(Session session) { Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId()); } @Override public void onDisconnected(Session session) { Log.d(TAG, "onDisconnected: Disconnected from session: " + session.getSessionId()); } @Override public void onStreamReceived(Session session, Stream stream) { Log.d(TAG, "onStreamReceived: New Stream Received " + stream.getStreamId() + " in session: " + session.getSessionId()); } @Override public void onStreamDropped(Session session, Stream stream) { Log.d(TAG, "onStreamDropped: Stream Dropped: " + stream.getStreamId() + " in session: " + session.getSessionId()); } @Override public void onError(Session session, OpentokError opentokError) { Log.e(TAG, "Session error: " + opentokError.getMessage()); } };-
クライアントが OpenTok セッションに接続すると、
SessionListener.onConnected(session)メソッドが呼び出される。 -
クライアントが OpenTok セッションから切断されると、
SessionListener.onDisconnected(session)メソッドが呼び出される。 -
クライアントが OpenTok セッションへの接続に失敗した場合、
SessionListener.onError(session, error)メソッドが呼び出される。 -
別のクライアントが OpenTok セッションにストリームを配信すると、
SessionListener.onStreamReceived(session, stream)メソッドが呼び出される。 -
別のクライアントが OpenTok セッションへのストリームの配信を停止すると、
SessionListener.onStreamDropped(session, stream)メソッドが呼び出される。
今のところ、これらのイベントが発生すると、アプリはデバッガー・コンソールにプリントする。
-
アプリケーションをデバッグしてください。アプリが OpenTok セッションに正常に接続できれば、 SessionListener.onConnected(session) メソッドはデバッグコンソールにログを記録する。
-
以下のメソッドを
MainActivityクラスを使用して、アクティビティのライフサイクルイベントをセッションに通知します:@Override protected void onPause() { super.onPause(); if (session != null) { session.onPause(); } } @Override protected void onResume() { super.onResume(); if (session != null) { session.onResume(); } }
ステップ 6: サンプルアプリの UI を調整する
OpenTok Android SDK では、配信および購読する動画が View オブジェクトとして公開されます。これらを ViewGroup オブジェクトを使用します。このサンプルアプリでは FrameLayout オブジェクト(これは ViewGroup)をパブリッシャーとサブスクライバーのビューのコンテナとして使用します:
-
Android Studio で、app/res/layout/activity_main.xml ファイルを開きます。エディタの下部にある「Text」タブをクリックして、そのファイルの XML コードを表示します。
-
ファイルの内容を以下のコードに置き換える:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <FrameLayout android:id="@+id/subscriber_container" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <FrameLayout android:id="@+id/publisher_container" android:layout_width="90dp" android:layout_height="120dp" android:layout_gravity="bottom|end" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginBottom="16dp" android:background="#CCCCCC" android:padding="2dp" /> </FrameLayout> </androidx.constraintlayout.widget.ConstraintLayout>の内容全体を置き換えるようにしてください。
<TextView>要素を(閉じた/>タグ)。 -
今宣言する
publisherViewContainerそしてsubscriberViewContainerの宣言の直後)。sessionプロパティ):private FrameLayout publisherViewContainer; private FrameLayout subscriberViewContainer; -
最後に、既存の
onCreate()メソッドの下に以下のコードを追加して、これらのレイアウト・ビュー・オブジェクトを初期化します。setContentView()メソッドを呼び出す:publisherViewContainer = findViewById(R.id.publisher_container); subscriberViewContainer = findViewById(R.id.subscriber_container);この時点で
onCreate()メソッドは次のようになるはずだ:コピー@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); publisherViewContainer = findViewById(R.id.publisher_container); subscriberViewContainer = findViewById(R.id.subscriber_container); requestPermissions(); }
上記のステップでは、このアプリのサンプルレイアウトをセットアップしただけです。あなたのアプリは、パブリッシャーと購読者ビューを他の ViewGroup オブジェクト
ステップ 7: ストリームをセッションに公開する
アプリが OpenTok セッションに接続した際、カメラとマイクを使用して、そのセッションに音声・動画ストリームを送信するようにしたい:
-
追加
publisherプロパティをMainActivityクラスに追加します。sessionプロパティ):private Publisher publisher;Publisher クラスは、OpenTok Android SDK に定義されています。
-
の実装を変更する。
SessionListener.onConnected()メソッドに、ストリームをセッションに公開するコードを追加します:@Override public void onConnected(Session session) { Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId()); publisher = new Publisher.Builder(MainActivity.this).build(); publisher.setPublisherListener(publisherListener); publisher.getRenderer().setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL); publisherViewContainer.addView(publisher.getView()); if (publisher.getView() instanceof GLSurfaceView) { ((GLSurfaceView) publisher.getView()).setZOrderOnTop(true); } session.publish(publisher); }上記のコードでは
Publisher.Builder()を使用して、Publisher オブジェクトをインスタンス化します。コンストラクタは1つのパラメータを受け取ります。このプロセスに関連付けられたコンテキストです(ただし、本番アプリでは異なる場合があります)。について
Publisher.setPublisherListener()メソッドは PublisherListener インターフェースを実装するオブジェクトを設定します。このインターフェイスには、パブリッシャー関連のイベントに応答して呼び出されるコールバックメソッドが含まれています。重要だ: 使用するコンテキストは、特定のユースケースによって異なります。しかし、通常は、セッションがアクティビティの外(たとえば、アクティビティとアクティビティの間)に存在することが望まれます。本番アプリケーションでは、アクティビティコンテキストではなく、アプリケーションコンテキストを使うのが便利です。
このコードでは、パブリッシャー・オブジェクトを
Session.publish()メソッド。このメソッドは、Androidデバイスのカメラとマイクを使用して、OpenTokセッションに音声・動画ストリームを送信します。(なお、Android仮想デバイスでは、OpenTok Android SDKはストリームを送信する際にテスト用動画を使用します)。パブリッシャ・オブジェクトは
getView()を返し、Android Viewオブジェクトを返します。このビューは、デバイスのカメラからキャプチャされたビデオを表示します。このコードでは、このビューをpublisherViewContainerオブジェクトがある。 -
イベントを記録するには
publisherListenerプロパティをsessionListenerのMainActivity:private PublisherKit.PublisherListener publisherListener = new PublisherKit.PublisherListener() { @Override public void onStreamCreated(PublisherKit publisherKit, Stream stream) { Log.d(TAG, "onStreamCreated: Publisher Stream Created. Own stream " + stream.getStreamId()); } @Override public void onStreamDestroyed(PublisherKit publisherKit, Stream stream) { Log.d(TAG, "onStreamDestroyed: Publisher Stream Destroyed. Own stream " + stream.getStreamId()); } @Override public void onError(PublisherKit publisherKit, OpentokError opentokError) { Log.e(TAG, "PublisherKit onError: " + opentokError.getMessage()); } };なお、Publisher クラスは PublisherKit クラス(これも OpenTok Android SDK で定義されています)を継承しています。PublisherKit クラスは、高度なパブリッシャー(カスタムビデオキャプチャやレンダラーを使用するパブリッシャーなど)を作成するために使用できる基底クラスです。
これは PublisherListener のメソッドがある:
-
onStreamCreated(publisherKit, stream)— パブリッシャーが OpenTok セッションへのストリーミングを開始したときに呼び出されます。 -
onStreamDestroyed(publisherKit, stream)— パブリッシャーが OpenTok セッションへのストリーミングを停止したときに呼び出されます。 -
onError(error)— クライアントが OpenTok セッションへの公開に失敗した際に呼び出されます。OpentokErrorオブジェクトがメソッドに渡される。
ステップ 8: 他のクライアントストリームの購読
私たちはクライアントに次のことを望んでいる。 サブスクライブ セッション内の他のクライアントのストリームにアクセスする(または表示する):
-
追加
subscriberプロパティをMainActivityクラスに追加します。publisherプロパティ):private Subscriber subscriber;Subscriber クラスは、OpenTok Android SDK で定義されています。このクラスは、クライアントが別のクライアントによって公開されたストリームを購読(閲覧)するために使用するオブジェクトを定義しています。
-
の実装を変更する。
onStreamReceived(session, stream)メソッド(SessionListenerコールバックの1つ)に、他のクライアントのセッションストリームを購読するコードを含める:@Override public void onStreamReceived(Session session, Stream stream) { Log.d(TAG, "onStreamReceived: New Stream Received " + stream.getStreamId() + " in session: " + session.getSessionId()); if (subscriber == null) { subscriber = new Subscriber.Builder(MainActivity.this, stream).build(); subscriber.getRenderer().setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL); subscriber.setSubscriberListener(subscriberListener); session.subscribe(subscriber); subscriberViewContainer.addView(subscriber.getView()); } } -
イベントを記録するには
subscriberListenerすぐ下にある物件sessionListenerのMainActivity:SubscriberKit.SubscriberListener subscriberListener = new SubscriberKit.SubscriberListener() { @Override public void onConnected(SubscriberKit subscriberKit) { Log.d(TAG, "onConnected: Subscriber connected. Stream: " + subscriberKit.getStream().getStreamId()); } @Override public void onDisconnected(SubscriberKit subscriberKit) { Log.d(TAG, "onDisconnected: Subscriber disconnected. Stream: " + subscriberKit.getStream().getStreamId()); } @Override public void onError(SubscriberKit subscriberKit, OpentokError opentokError) { Log.e(TAG, "SubscriberKit onError: " + opentokError.getMessage()); } };
別のクライアントがセッションにストリームを公開すると、このメソッドが呼び出され、Stream オブジェクトが引数として渡されます。Stream クラスは OpenTok Android SDK で定義されており、OpenTok セッション内の音声・動画ストリームを表します。
このコードは、OpenTok Android SDK で定義されている Subscriber クラスのインスタンスを初期化します。この Subscriber.Builder() コンストラクターは2つのパラメーターを取る:
-
このプロセスに関連付けられたAndroidアプリケーション・コンテキスト。
-
Streamオブジェクト(表示したいストリーム用)
について Session.subscribe(subscriber) このメソッドは、先ほど受信したストリームを購読します。
subscriberViewContainer.addView(subscriber.getView()) は、新しい購読ストリームのビューをスクリーンに配置する。
-
の実装を変更する。
onStreamDropped(Session session, Stream stream)メソッド(SessionListenerコールバックのもう1つ)を呼び出します:@Override public void onStreamDropped(Session session, Stream stream) { Log.i(TAG, "Stream Dropped"); if (subscriber != null) { subscriber = null; subscriberViewContainer.removeAllViews(); } }subscriberViewContainer.removeAllViews()は、ストリームがドロップされると、サブスクライバのビューを削除します。
ステップ9:アプリの実行
コードが完成したら、Android Studioエミュレーターでアプリを実行できます。エミュレーターはあなたのウェブカメラにアクセスできないので、パブリッシャービデオはあなたのカメラ映像の代わりにアニメーショングラフィックを表示します。
2つ目のパブリッシャー(エミュレーターではサブスクライバーとして表示されます)を追加するには、接続したAndroidデバイスでアプリを2回実行するか、または OpenTok プレイグラウンド 以下の手順に従って、サポートされているウェブブラウザでセッションに接続してください:
-
こちらへ OpenTok プレイグラウンド (にログインしている必要があります。 Account)
-
を選択する。 既存のセッションに参加する タブ
-
MainActivity.javaファイルで使用したセッションIDをコピーし、次の場所に貼り付けます。 セッションID 入力フィールド
-
クリック セッションに参加する
-
次の画面で 接続をクリックする。 ストリームを公開する
-
パブリッシャーのオプション(必須ではありません)を調整できます。 続ける に接続し、公開と購読を開始する。
この時点で、ウェブカメラから公開されるストリームと、エミュレータから公開されるストリームが表示されるはずです。エミュレータに戻ると、エミュレートされた画面に新しいパブリッシャーが表示されているはずです。

おめでとうございます!基本的なAndroidクライアントのセットアップ」チュートリアルを終了しました。
ここで開発したコードを、アプリケーションのクライアント・サイドに適用するために、引き続き弄ったり調整したりすることができる。 サーバーコンポーネント を参照)。 サーバーの設定 下記参照)。
このサンプルアプリの完成版は ベーシック・ビデオチャット-Java のフォルダにある。 vonage-video-android-sdk-サンプル レポをGitHubに追加した。この完成版では、セッションID、トークン、APIキーを(ハードコードされた値を使う代わりに)ウェブサービスから読み込むコードが追加されている。
次のステップ
ここでの作業が終わったら、以下の役立つリソースを活用して、OpenTokアプリケーションの構築と機能強化を続けてください:
- サーバーの設定 — 本番環境に移行する前に、認証情報を生成するためのサーバーを設定する必要があります
- Video API の基礎 — まだご覧になっていない方は、OpenTok がどのように機能するのかを詳しく理解するために、数分間お時間を割いてください
- コードサンプル — OpenTokのさまざまな機能やユースケースを紹介するサンプルアプリのコレクション
- 開発者向けガイド — OpenTokのすべての機能に関する詳細なドキュメント
- その他のチュートリアル — その他のOpenTok機能やユースケースを実装するための手順解説
- Android SDK リファレンス — OpenTok Android SDK に関連するメソッドやイベントについて詳しく見る
サーバーの設定
上記のチュートリアルでは、皆さんに 認証情報をハードコードする。しかし、本番環境のアプリケーションでは、 sessionId そして token コード内の値は、アプリケーションサーバーによって生成され、クライアントに渡される必要があります。 本番環境のアプリに認証情報をハードコーディングすべきではない理由をいくつか挙げます:
- トークンは(生成時に指定された)一定時間が経過すると有効期限が切れるため、定期的に新しいトークンを生成する必要があります
- 新しいセッションを動的に作成することはできないため、アプリを利用するすべてのユーザーは1つの「ルーム」に閉じ込められた状態になってしまいます。
ハードコーディングされた値を使ってアプリケーションのテストを続けることもできますが、サーバーをセットアップする段階になったら、その方法にはいくつかあります:
サーバーオプション 1 — ワンクリックで Heroku 上にシンプルな REST サーバーを起動する
これはおそらく、サーバーを立ち上げて稼働させる最も手っ取り早い方法ですが、機能には制限があります。以下の「Heroku」ボタンをクリックするだけで、Herokuのウェブサイトに遷移し、OpenTokのAPIキーとAPIシークレットの入力を求められます。これらの値は、プロジェクトページで取得できます。 Video APIアカウント. HerokuのAccountをお持ちでない場合は、登録する必要があります(無料です)。
コードを詳しく見てみたいですか? 上のボタンをクリックすると、 learning-opentok-php GitHubのリポジトリ。リポジトリにアクセスして、コードや追加のドキュメントを確認してください。また、リポジトリをフォークして、デプロイ前に変更を加えることも可能です。
Node.jsの方がお好みですか? をご覧ください。 learning-opentok-node Node.js を使用した同様の機能を提供するリポジトリ(Heroku へのデプロイボタン付き)。
Herokuにサーバーをデプロイしたら、サーバーから認証情報を取得するために、プロジェクトにコードを追加する必要があります。クライアントの実装については、 ベーシック・ビデオチャット-Java / Kotlinによる基本的なビデオチャット プロジェクト。
サーバーオプション 2 — サーバー SDK を使用して一から構築する
オプション 1 では、クライアントへの認証情報の送信に REST エンドポイントを使用していますが、これは OpenTok を使用してサーバーを実装する多くの方法のうちの 1 つにすぎません。より高度なカスタマイズをご希望の場合は、OpenTok の サーバー SDK のドキュメント お好みのサーバーサイド言語用(利用可能な言語は PHP, Node.js, ジャワ, .NET, パイソン そして ルビー). このドキュメントでは、セットアップの手順や、セッションやトークンを生成するために必要なさまざまな方法、およびその他のサーバーサイド機能について解説しています。