🚀 Quick start

This page has not been translated yet.

このセクションでは、SkyWay Android SDK を利用した最小限のアプリケーションを開発する方法について掲載しています。 はじめて Android SDK を利用する方はこちらを参考に導入してください。

Android プロジェクト の作成

Android Developer の公式ウェブサイトを参考に、Android プロジェクトを作成します。

https://developer.android.com/training/basics/firstapp/creating-project?hl=ja

「Language」は kotlin を選択してください。また、「Minimum SDK」は Android 6.0(API Level: 23) 以降を選択してください。

Android SDKのインストール

Maven Packageを利用する場合

settings.gradle へ以下のように記述します。

maven { url = uri("https://maven.pkg.github.com/skyway/android-sdk") credentials { username = 'Your GitHub username' password = 'Your Github access token' } }

build.gradle へ以下のように記述します。

//skyway implementation 'com.ntt.skyway:libwebrtc:1.0.0' implementation 'com.ntt.skyway:core:1.0.0' implementation 'com.ntt.skyway:sfubot:1.0.0' implementation 'com.ntt.skyway:room:1.0.0'

AARライブラリを利用する場合

GitHubからダウンロードします。

プロジェクトに skyway.aar, libwebrtc.aar をインポートします。 aar ファイルをインポートする手順は下記の記事を参考にしてください。

https://developer.android.com/studio/projects/android-library?hl=ja#psd-add-aar-jar-dependency

以下に build.gradle への記述例を示します。

//skyway implementation files('libs/libwebrtc.aar') implementation files('libs/skyway-core.aar') implementation files('libs/skyway-sfubot.aar') implementation files('libs/skyway-room.aar')

依存ライブラリのインポート

Android SDKをMavenからインポートした場合はこの手順は不要です。 Android SDK が依存しているライブラリをインポートする必要があります。 module の build.gradle に記述します。

// WebSocket implementation "com.squareup.okhttp3:okhttp:4.10.0" implementation "com.squareup.okhttp3:logging-interceptor:4.10.0" // gson implementation 'com.google.code.gson:gson:2.9.0'

パーミッションの設定

Android SDK の動作に必要なパーミッションを AndroidManifest.xml に記述します。

以下に、映像・音声の通信をする際に必要なパーミッションの例を示します。

<!-- ネットワーク接続に必要なパーミッション --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- カメラ映像・マイク音声の取得に必要なパーミッション --> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

その他、画面共有など利用する機能に応じてパーミッションを追加してください。

通話アプリケーションの実装

画面に Video 表示コンポーネントを配置する

res/layout 以下のレイアウト定義ファイル(activity_main.xml など)に Video 表示コンポーネントを記述します。

以下にローカルとリモートの 2 つの映像についてコンポーネントを記述する例を示します。

<!-- ローカルのビデオ --> <com.ntt.skyway.content.sink.SurfaceViewRenderer android:id="@+id/local_renderer" android:layout_width="150dp" android:layout_height="150dp"/> <!-- リモートのビデオ --> <com.ntt.skyway.content.sink.SurfaceViewRenderer android:id="@+id/remote_renderer" android:layout_width="150dp" android:layout_height="150dp" android:layout_marginStart="20dp"/>

SkyWay Auth Token の作成

SkyWay を利用するためには、初めに jwt(authToken) を用いて SkyWayContext を初期化します。 認証認可について、詳しくはこちらをご覧ください。

SkyWay Auth Token は本来サーバーサイドで生成するため、Android SDK にはトークンの生成機能はございません。 ここでは JavaScript SDK で配布しているライブラリを利用し、サーバーから認可された後トークンを取得してきたとしましょう。

npm がインストールされた環境でライブラリをインストールします。

$ mkdir skyway_token && cd skyway_token $ npm i @skyway-sdk/token

次に token.js を作成します。

$ touch token.js

ファイルを開き以下のコードをペーストします。

先ほど作成したアプリケーション ID とシークレットキーをスコープの app.idencode 引数にペーストしてください。

const { SkyWayAuthToken, uuidV4 } = require('@skyway-sdk/token'); const token = new SkyWayAuthToken({ jti: uuidV4(), iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24, scope: { app: { id: 'ここにアプリケーションIDをペーストしてください', turn: true, actions: ['read'], channels: [ { id: '*', name: '*', actions: ['write'], members: [ { id: '*', name: '*', actions: ['write'], publication: { actions: ['write'], }, subscription: { actions: ['write'], }, }, ], sfuBots: [ { actions: ['write'], forwardings: [ { actions: ['write'], }, ], }, ], }, ], }, }, }).encode('ここにシークレットキーをペーストしてください'); console.log(token);

node で token.js を実行すると SkyWay Auth Token が生成されます。このトークンは後程使うのでコピーしてください。

$ node token.js eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxOTA1MzU5Yi0xOGY3LTRhOWMtYmU4Zi1kMTgxMTQ0OTY1MjMiLCJpYXQiOjE2NzQxOTg3MDQsImV4cCI6MTY3NDI4NTEwNCwic2NvcGUiOnsiYXBwIjp7ImlkIjoi44GT44GT44Gr44Ki44OX44Oq44Kx44O844K344On44OzSUTjgpLjg5rjg7zjgrnjg4jjgZfjgabjgY_jgaDjgZXjgYQiLCJ0dXJuIjp0cnVlLCJhY3Rpb25zIjpbInJlYWQiXSwiY2hhbm5lbHMiOlt7ImlkIjoiKiIsIm5hbWUiOiIqIiwiYWN0aW9ucyI6WyJ3cml0ZSJdLCJtZW1iZXJzIjpbeyJpZCI6IioiLCJuYW1lIjoiKiIsImFjdGlvbnMiOlsid3JpdGUiXSwicHVibGljYXRpb24iOnsiYWN0aW9ucyI6WyJ3cml0ZSJdfSwic3Vic2NyaXB0aW9uIjp7ImFjdGlvbnMiOlsid3JpdGUiXX19XSwic2Z1Qm90cyI6W3siYWN0aW9ucyI6WyJ3cml0ZSJdLCJmb3J3YXJkaW5ncyI6W3siYWN0aW9ucyI6WyJ3cml0ZSJdfV19XX1dfX19.qmLpoOjou0S5JwxAiaBvH0KaGzZqN4-0t1xq708_b3M

なお、このトークンの有効期限は生成から1日です。

SkyWayContext の初期化

アクティビティまたは Application から SkyWayContext.setup を呼び出します。

val option = SkyWayContext.Options( // 先ほど生成したトークンを渡します authToken = authToken, logLevel = Logger.LogLevel.VERBOSE ) val result = SkyWayContext.setup(context, option) if (result) { Log.d("App", "Setup succeed") }

カメラからの映像取得と UI への表示、マイクからの音声取得

カメラ映像を取得します。

val device = CameraSource.getFrontCameras(context).first() // camera映像のキャプチャを開始します val cameraOption = CameraSource.CapturingOptions(800, 800) CameraSource.startCapturing(context, device, cameraOption) // 描画やpublishが可能なStreamを作成します val localVideoStream = CameraSource.createStream() // SurfaceViewRenderer を取得して描画します runOnUiThread { val localVideoRenderer = findViewById<SurfaceViewRenderer>(R.id.local_renderer) localVideoRenderer.setup() localVideoStream.addRenderer(localVideoRenderer) }

音声を取得します。AudioSource は object であることに注意してください。

利用するためには初めに setup を呼び出します。

// 音声入力を開始します AudioSource.start() // publishが可能なStreamを作成します val localAudioStream = AudioSource.createStream()

Room の作成

入退室可能な Room を作成します。 ネットワークを通した操作は非同期処理のため、coroutine スコープ内で実行してください。

val room = P2PRoom.findOrCreate(name = "room")

Room への参加

Room に参加し、publish/subscribe が可能な LocalRoomMember を取得します。

val memberInit = RoomMember.Init(name = "member001") val localRoomMember = room?.join(memberInit)

Stream の Publish

Room に入室させているメンバーから Stream を公開(publish)をします。

val publication = localRoomMember?.publish(localVideoStream)

これにより、 Room に入室している他のメンバーからも Publication を認知できるようになります。 publication が追加されたことを検知するには、予めRoom に handler を追加してください。

room?.onStreamPublishedHandler = { Log.d("room", "onStreamPublished: ${it.id}") }

Stream の Subscribe

Room に入室させた別のメンバーから購読(subscribe)をします。

自身で publish した streamsubscribe できないことに注意してください。

val subscription = localRoomMember?.subscribe(publication) // SurfaceViewRenderer を取得します val remoteVideoRenderer = findViewById<SurfaceViewRenderer>(R.id.remote_renderer) remoteVideoRenderer.setup() val remoteStream = subscription?.stream when(remoteStream?.contentType) { // コンポーネントへの描画 Stream.ContentType.VIDEO -> (remoteStream as RemoteVideoStream).addRenderer(remoteVideoRenderer) else -> {} }

なお、 AudioStream の場合は subscribe を完了したタイミングでスピーカーから音声が流れます。

動作確認

Android Studio の Run ボタンを押下してアプリケーションを実行してください。

注意

カメラなどにアクセスする許可が必要なので、初回実行時はユーザーにリクエストすることをおすすめします。

参考: https://developer.android.com/training/permissions/requesting?hl=ja

This website uses cookies to improve website performance and for other purposes.
By clicking "Accept Cookies," you agree to the use of cookies. For more information, click here.