Android SDK
🚀 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.id
と encode
引数にペーストしてください。
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
した stream
は subscribe
できないことに注意してください。
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