本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

ビデオ・チャットを利用した Lotus Sametime Connect のプラグイン・アプリケーションの作成

小峯 宏秋 (hkomine@jp.ibm.com), ユニファイド・コミュニケーション & コラボレーション (UC²), ソフトウェア開発研究所, IBM
小峯宏秋は日本アイ・ビー・エム株式会社のソフトウェア開発研究所 WPLCプロジェクト推進に所属し、Lotus Sametime を中心とする Lotus の Unified Communication & Collaboration を世に知らしめる活動に取り組んでいます。 大学では理論量子力学を専攻し、外資系ミニコンメーカーとロータス株式会社を経て IBM に入社しました。北海道で8年ぶりにスキーをし、まだ十分滑れることに自信を持ちました。娘もスキーのできる歳になったので、失われた10年を経てまたスキーに取り組んでみようかと思っています。

概要: Lotus Sametime 8.0 は Eclipse のプラグイン・アーキテクチャーによる拡張性と、テレフォニーおよび映像と音声コミュニケーション技術を取り入れた製品です。本稿では Lotus Sametime クライアント・テレフォニー API を使用した Lotus Sametime Connect クライアントのプラグイン・アプリケーション開発について解説します。

日付:  2008年 3月 28日
レベル:  中級
アクティビティー: 2642 ビュー
お気軽にご意見・ご感想をお寄せください: 


はじめに

IBM Lotus Sametime は IBM のロータスブランドの提供する、リアルタイム・コラボレーションのソフトウェアです。1998年の初出荷からすでに10年がたつこの製品は、企業のビジネスコラボレーションの使用にも耐える、拡張性と高いセキュリティを持った即応性の高いコミュニケーション環境を提供します。

特に Lotus Sametime 7.5 は、新しいリアルタイム・コラボレーションの技術を、Eclipse を基盤とした Lotus Expeditor の上に構築した最初の製品となります。Lotus Sametime Connect 7.5 とそれ以降の製品において、Eclipse のプラグイン・フレームワークを使うことでアプリケーション 開発者は、過去のクライアントの製品では不可能であったさまざまな拡張を行うことができます。

Lotus Sametime 7.5 とそれに続くバージョンでは電話連携や映像と音声のコミュニケーションといった新しい機能が追加されました。Lotus Sametime 7.5 でボイス・チャット、Sametime 7.5.1 でビデオ・チャットが追加され、Lotus Sametime によるコミュニケーションとコラボレーションの能力が向上しました。これらの新しいツールにより、いままでのテキストだけの Lotus Sametime のチャットに、より効率的なコミュニケーション手段が加わったことになります。

Lotus Sametimeは各種のツールキットを利用することにより、機能を拡張したりサービスを追加することができます。Lotus Sametime Connect 7.5 では、開発者は Lotus Sametime Connect ツールキットにより、Lotus Sametime Connect クライアント自体を拡張することができるようになっています。また Lotus Sametime 7.5 では新しいテレフォニーのためのプログラム用インターフェースが追加されました。それはアプリケーション開発者が Lotus Sametime Connect の電話連携や映像と音声のサービスを利用するための API (アプリケーション・プログラム・インターフェース)と、サービス提供者がテレフォニー・サービスを拡張して、独自のテクノロジーに置き換えるための SPI (サービスプロバイダ・インターフェース)です。

現在の最新バージョンである Lotus Sametime 8.0 は 2007年11月にリリースされ、さらに新たな機能や拡張性を持っています。本稿では Lotus Sametime テレフォニー API と SPI の概要を説明します。さらにテレフォニー API を使用して Lotus Sametime Connect クライアントで動作する、映像と音声コミュニケーションの機能を持ったサンプル・プログラムを作成します。本稿のサンプル・プログラムは、最新バージョンである Lotus Sametime 8.0 で作成されていますが、Lotus Sametime 7.5.1 でも動作するでしょう。


Lotus Sametime テレフォニー・サービスの概要

Lotus Sametime Connect 8.0 では以下のようなテレフォニー・サービスを提供しています。

  • クリック・トゥー・コール: 企業内の構内交換機 (PBX) と連携した電話発信と電話会議のサービス
  • ボイス・チャットとビデオ・チャット: P2P の IP 技術による映像と音声コミュニケーション のサービス

これらのサービスの詳細はこの後の節で説明します。

Lotus Sametime は製品としてボイス・チャットとビデオ・チャットの機能を含んでおり、導入してすぐにこれらの機能を使えます。一方クリック・トゥー・コールは、UI などの基本実装は製品に含まれていますが、企業内の PBX のような電話サーバーと接続するモジュールを別途用意する必要があります。サービス・プロバイダ・モジュールと呼ばれるこのモジュールは通常は電話システム提供会社によって提供されます。

クリック・トゥー・コール

クリック・トゥー・コールにより、Lotus Sametime Connect クライアントの操作で電話発信をしたり、電話会議を始めたりすることができます。

このサービスで電話発信や電話会議をはじめると、リクエストが Lotus Sametime サーバーに送信され、Telephony Conferencing Service Provider Interface (TCSPI) を通じてサービス・プロバイダ・モジュールに送られます。サービス・プロバイダ・モジュールは PBX などの企業内の電話サーバーと連携し、指定されたユーザーへの電話発信を行います。

Lotus Sametime サーバーと外部の電話サーバーにをつなぐサービス・プロバイダ・モジュールは、電話サーバーの提供会社によって提供され、サーバー管理者によって導入されることになります。

ボイス・チャットとビデオ・チャット

ボイス・チャットとビデオ・チャットにより、Lotus Sametime Connect ユーザーは、クライアント PC 同士のピアツーピア (P2P) の音声と映像技術を使ってコミュニケーションを行います。

Lotus Sametime 製品には、GISP (グローバル IP ソリューション社) からライセンス提供されたテクノロジーを基にしたボイス・チャットとビデオ・チャットのエンジンが含まれており、ユーザーは導入してすぐに使うことができます。ボイス・チャットは最大で5ユーザーが同時に参加でき、ビデオ・チャットは一対一のコミュニケーションのみをサポートしています。

開発者やサード・パーティのプロバイダは既存の映像と音声エンジンを独自のものに置き換えることができます。


図 1. ビデオ・チャットのユーザー画面


Lotus Sametime Telephony のアーキテクチャ

以下の図2は、Lotus Sametime Connect クライアントとサーバーでの Lotus Sametime のテレフォニー・サービスのアーキテクチャを示しています。

クリック・トゥー・コールのサービスは「リモート TCSPI (Remote TCSPI) 」プラグインとして部分的にクライアント側にあり、主要な処理はサーバー側の、TCSPI に接続する「テレフォニー・プラグイン (Telephony Plug-in)」として提供されます。サーバー側のプラグインである、TCSPI を使用するクリック・トゥー・コールのサービスは Lotus Sametime Connect クライアントばかりではなく、Lotus Sametime Web 会議や Lotus Sametime Java Connect クライアント、Lotus Notes のベーシック・クライアントでも使用できます。

一方、ボイス・チャットとビデオ・チャットはその機能のすべてがクライアント・プラグインとして実装され、Lotus Sametime Connect クライアントからのみ利用できます。図2で「ボイス・チャット (Voice Chat)」と「統合 VoIP ボイス・チャット (Integrated VoIP Voice Chat)」として示されています。ビデオ・チャットとボイス・チャットのエンジンは Lotus Sametime 製品に含まれますが、開発者やサービス提供者が独自の実装をしたビデオとボイスのエンジンを提供して、既存のボイス・チャットやビデオ・チャットと置き換えることもできます。クライアント側の SPI はこのような独自の実装をするために用意されています。もしボイス・チャットやビデオ・チャットの独自実装が提供されると、製品に元からあったエンジンは利用できなくなります。

クリック・トゥー・コールやボイスとビデオ・チャットなどすべてのテレフォニー機能を利用できるよう、Lotus Sametime Connect ツールキットはクライアント・テレフォニー API (Client Telephony API) を公開しています。これによりアプリケーション開発者は独自の UI アプリケーションにボイス・チャットやビデオチャット、クリック・トゥー・コールの機能を埋め込むことができます。本稿の目的はビデオ・チャットの機能を埋め込んだアプリケーションを独自に作成することです。このアプリケーションでは、Lotus Sametime 製品に含まれる既存のビデオ・チャットの機能を、新しい独自の UI で表示することになります。


図 2. Lotus Sametime Telephony のアーキテクチャ


ビデオ・チャット・アプリケーションを作る

本稿ではLotus Sametime Connect クライアントの上でプラグイン・アプリケーションを作成し、Lotus Sametime のビデオ・チャットの機能を組み込みます。このようなアプリケーションは、オンライン・ゲームや遠隔地での顧客サポート・システムのような、二人とか数人がアプリケーションのデータを共有しつつ、音声と映像のコミュニケーションを行う対話型のアプリケーションのプロトタイプになります。このようなタイプのアプリケーションでは、その UI に特別なデザインが求められることがあります。たとえばアプリケーションの起動に合わせたビデオ・チャットの自動開始や、ビデオ・チャット画面をデータ表示部と一緒のアプリケーション・ウィンドウに埋めこむことなどです。本稿のサンプル・アプリケーションはこういった要望にこたえるものです。


図 3. 対話型のアプリケーションサンプル の例 (アプリケーション・データを共有しビデオ・チャットを使用している)

本稿で紹介するサンプル・アプリケーションは、Lotus Sametime をベースにしたリアルタイム・コラボレーションのアプリケーションを開発する最初のステップになります。

すべてのサンプルプログラムのコードは、Eclipse プロジェクトのアーカイブ・ファイルとしてダウンロードできます。このアーカイブをインポートする際には、あらかじめ Lotus Sametime Connect のプラグイン開発環境を Eclipse 上に構成してください。Lotus Sametime Connect プラグイン開発環境の構成方法については、Lotus Sametime 8.0 Connect Toolkit に含まれる「Lotus Sametime 8.0 Integration Guide」を参照してください。

ビデオ・チャット・アプリケーションを自分の環境で試すには、少なくとも2つの Lotus Sametime のユーザー ID が必要です。もし Lotus Sametime サーバーをご自分でお持ちであれば、テスト目的でユーザーを作成すればよいかもしれません。しかし、多くの読者はそのようなサーバーはお持ちでないでしょう。もうひとつの選択肢として「IBM Lotus Sametime 8 demo」にあるデモンストレーション用サーバーを使うという方法もあります。

サンプル・アプリケーションの概要.

本稿では以下のような機能を提供する簡単なビデオ・チャットアプリケーションを作成します。

  • Lotus Sametime Connect のミニ・アプリケーションとして動くプラグイン・アプリケーション
  • ビデオ・チャットの発信者は、アプリケーションの UI で受信者を指定してビデオ・チャットを開始できる。
  • ビデオ・チャットの受信者は、受け取ったビデオ・チャット招待に自動的参加する。
  • ビデオ・チャットの双方の参加者の画像は、アプリケーションに埋め込まれて表示される。

サンプル・アプリケーションの画面は図4 のようになります。Lotus Sametime Connect クライアントの下側にある「My Video Chat view」というタイトルのミニ・アプリケーションです。


図 4. サンプル・アプリケーションでのビデオ・チャット画面

アプリケーションの UI には4つのボタンがあります。2つのボタンは 「User ID」 テキスト・フィールドに指定した相手との間でビデオ・チャットの開始と終了をするためののものです。他の2つのボタンはローカルのビデオ画像のプレビューの開始と終了ををするためのものです。ローカル・プレビューでは実際のビデオ・チャットのセッションは張りません。

ビデオ・チャットとビデオ・プレビューのビデオ画像はアプリケーション UI の下側のキャンバスに表示されます。


図 5.サンプル・アプリケーションでローカルのビデオをプレビューする

本稿はクライアント・テレフォニー API でアプリケーションを作成する方法について説明することを目的にしています。そのためボタンやキャンバスといった SWT のコンポーネントをアプリケーションに配置する方法については触れません。そういった内容については、本稿の参考文献に列記したLotus Sametime Connect クライアントの拡張について記載した初級向けの記事をご参照ください。

ビデオ・チャットに招待する

ビデオ・チャットを始める前の準備

ビデオ・チャットのセッションを始める前に、発信者が Sametime にログインしていてビデオ・チャットを始めることができるか、そして相手がそのビデオ・チャットのセッションを受けることができるか、確認しなくてはなりません。

これらの確認は Louts Sametime Connect ツールキットで利用できる、Lotus Sametime コミュニティの機能によって行います。まず、Community クラスのインスタンスを作成します。これは CommunityService クラスのインスタンスから取得できます。これはサンプル・アプリケーションの MainView クラスのコンストラクタで以下のように実装されています。この手法は Lotus Sametime Connect ツールキットの標準的なやり方に従います。詳細は「Lotus Sametime 8.0 Integration Guide」を参照してください。

/*
 * variables for Sametime
 */
private CommunityService commSrv = null;
private Community community = null;
private LiveNameService lnSrv = null;
private PeopleService ppSrv = null;

/*
 * get Sametime CommunityService
 */
try {
	commSrv = (CommunityService) ServiceHub
			.getService(CommunityService.SERVICE_TYPE);
} catch (ServiceException e) {
	e.printStackTrace();

	MessageDialog.openError(PlatformUI.getWorkbench().getDisplay()
			.getShells()[0], "Video Start Listener Exception", e
			.getMessage()
			+ "\nAT: " + this.getClass().toString());

	return
}

/*
 * get Sametime Community instance
 */
community = commSrv.getDefaultCommunity();

アプリケーションで 「Start VideoChat」 ボタンを押すと、「User ID」 フィールドに指定された受信者に対してビデオ・チャットを開始します。このボタンが押されたというイベント処理は MainViewListener インナー・クラスの widgetSelected() に実装されています。

はじめに Lotus Sametime コミュニティにログインしているかどうかをチェックします。もしログインしていなければ、Lotus Sametime サービスを使用することができません。以下のコードでは Community クラスの isLoggedIn() メソッドでログインを確認し、もしログインしていなければエラー・ダイアログを表示します。

/*
 * Check if the caller has logged in.
 */
if (! community.isLoggedIn()) {
	MessageDialog.openError(comp.getShell(), 
				"Lotus Sametime error", 
				"Need to login Lotus Sametime");	
	return;
}

次に、ビデオ・チャットの受信者が Lotus Sametime コミュニティに存在していて、応答可能であるかを確認します。応答可能でないとビデオ・チャットの招待が相手に届きません。

これらの確認を行うために、受信者に対して LiveNameResolver クラスで名前解決された LiveName クラス・オブジェクトを取得します。もし受信者が Lotus Sametime コミュニティに存在してログインしていれば、ヌルでない LiveName クラスのインスタンスが取得できます。そして名前解決されたコンタクト ID とコミュニティ ID から Person クラスのインスタンスを取得し、ユーザーの状態が STATUS_AVAILABLE であるかどうか調べます。このステータスは受信者が Lotus Sametime コミュニティにログインし応答可能だということです。

/*
 * check if the participant is available on Sametime
 */
try {	/*
	 * The participant must be resolved with LiveNameResolver to
	 * start video chat
		 */
	lnSrv = (LiveNameService) ServiceHub
			.getService(LiveNameService.SERVICE_TYPE);
	LiveNameResolver lnRes = lnSrv.getLiveNameResolver();
	lnRes.resolve(targetUserId);

	LiveName ln = lnSrv.getResolvedLiveName(targetUserId);
	if (null == ln) {
		MessageDialog.openError(comp.getShell(),
			"Sametime error",
			"LiveName object is null for " + targetUserId);
		return;
	}

	/*
	 * get contact Id and community Id for the user
	 */
	String contactId = ln.getContactId();
	String communityId = ln.getCommunityId();

	/*
	 * get user online status. the participant must be available
	 * to start video chat
	 */
	ppSrv = (PeopleService) ServiceHub
			.getService(PeopleService.SERVICE_TYPE);
	person = ppSrv.getPerson(contactId, communityId, false);

	if (person.getStatus() != LiveName.STATUS_AVAILABLE) {
		MessageDialog.openError(comp.getShell(),
			"Sametime error", "Participant " + targetUserId
				+ " is not active.");
		return;
	}
} catch (Exception e) { ... }

ビデオ・チャットを開始する

ビデオ・チャットの準備が完了したので、ビデオ・チャットのセッションを開始し、受信者を招待します。サンプル・コードの VideoCallHandler クラスの StartVideoChat() メソッド がこれらの処理を行います。

public static void startVideoChat(String placeId, 
					Person targetPerson,
					Canvas remoteCanvas, Canvas localCanvas)
			throws VideoCallHandlerException {
	try {
		/*
		 * create option for video call
		 */
		 .....

		/*
		 * initiates a call using the specified options.
		 */
		 .....
	        
		/*
		 * create address for the participant and
		 * add  it to call participant 
		 */
		 .....
            
	        /*
	         * start displaying local and 
	         * remote video for this call on canvases
	         */
		 .....
			
	} catch (TelephonyServiceException e) {
		throw new VideoCallHandlerException(e.getMessage(), e);
	}
}

新しい Call オブジェクトを作成するにはコール・オプションの設定が必要です。コミュニティ ID プロパティは、ビデオ・チャットのセッションが新たに作成される Lotus Sametime コミュニティを指定します。サンプルのコードでは、ログインしているデフォルトの Lotus Sametime コミュニティの値としています。

ビデオ・チャットを含む Lotus Sametime コミュニティのすべてのコラボレーションには、ユーザーが落ち合うためのバーチャル・プレースが作成されます。ビデオ・チャットのセッションを始めるときにも、プレースを一意に区別するプレース ID を指定してバーチャル・プレースを作成しなくてはなりません。サンプル・プログラムでは、固定の文字列とランダムな数字により MainView クラスの generatePlaceId() メソッドでビデオ・チャットのプレース ID を生成しています。

また、ビデオ・チャットのセッションであることを示すフラグも、コール・オプションに設定します。

/*
 * create option for video call
 */
String communityId = CommunityUtil.getDefaultCommunity().getId();
Properties properties = new Properties();
properties.setProperty("placeId", placeId);
properties.setProperty("communityId", communityId);
CallOptions options = CallFactory.getInstance().createCallOptions();
options.setProperties(properties);
options.setVideoCall(true);

これらのオプションを設定して、CallManager クラスのインスタンスから Call オブジェクトを生成します。 サンプル・プログラムでは CallManager のクラスはあらかじめインスタンス化してあります。

/*
 * create CallManager for Video Chat.
 */
private static CallManager manager = CallFactory.getInstance()
		.createCallManager(CallManager.SERVICE_TYPE_VIDEO_CHAT);

/*
 * initiates a call using the specified options.
 */
Call call = manager.startCall(new Vector(), options, 
				CallListenerImpl.getInstance());  

受信者をビデオ・チャットのセッションに登録するために、受信者の Address オブジェクトを生成して Call オブジェクトに追加します。サンプル・プログラムでは createVideoAddress() メソッドで Person オブジェクトから Address オブジェクトを作成します。そして addParticipant() メソッドでコール・セッションに受信者を追加します。

/*
 * create address for the participant and 
 * add it to call participant 
 */
Address address = createVideoAddress(targetPerson);
call.addParticipant(address);

createVideoAddress() メソッドでは Address オブジェクトを生成して必要な値を設定します。受信者の URL は setAddressUrl()メソッドで設定しますが、その値には「video:」サフィックスをつける必要があります。これは Lotus Sametime クライアント・テレフォニーの仕様で規定されています。

private static Address createVideoAddress(Person person) {

	Address address = CallFactory.getInstance().createAddress();
	address.setAddressUri("video:" + person.getContactId());
	address.setParticipantId(person.getContactId());
	address.setParticipantName(person.getName());
	address.setCommunityId(person.getCommunityId());

	return address;
}

サンプル・プログラムは次に、ローカルとリモートのビデオ画像を、指定された SWT キャンバスに表示するよう startVideo() メソッドを呼び出します。

/*
 * Start displaying local and 
 * remote video for this call on canvases
 */
call.startVideo(remoteCanvas, localCanvas);

ここまでで、ビデオ・チャットを開始するための処理が完了しました。受信者はビデオ・チャットへの招待を受け取ることとなります。

ビデオ・チャットを受けて参加する

招待を受けるための準備

ビデオ・チャットのアプリケーションはビデオ・チャットの招待を受ける機能を実装しなくてはなりません。本稿で紹介しているサンプル・アプリケーションは、受信したコールの処理としてもっとも単純な方法をとっています。それは誰からのどんなコールへの招待もえり好みなく受けることです。

ビデオ・チャットの招待は Lotus Sametime のコール・イベントとして通知されます。アプリケーションはこのコール・イベントを監視する必要があります。そのためには CallListener インターフェース・クラスを CallListenerImpl として実装し、CallManager のインスタンスに設定します。サンプルコードでは VideoCallHandler クラスの startListening() メソッドで処理しています。

public static void startListening() throws VideoCallHandlerException
{
	if(!isListening)
		try {
			manager.addListener(CallListenerImpl.getInstance());
			isListening = true;
		} catch(TelephonyServiceException e) {
			throw new VideoCallHandlerException(e.getMessage(), e);
		}
}

サンプル・プログラムでは、もし Lotus Sametime コミュニティに既にログインしていれば MainView のコンストラクタでこの startListening() メソッドを呼んでいます。

/*
 * test login status and set CallListener to detect IncomingCallEvent
 */
if (community.isLoggedIn()) {
	try {
		VideoCallHandler.startListening();
	} catch (VideoCallHandlerException e) {
		e.printStackTrace();

		MessageDialog.openError(PlatformUI.getWorkbench().getDisplay()
				.getShells()[0], "Video Start Listener Exception", e
				.getMessage()
				+ "\nAT: " + this.getClass().toString());
	}
}

/*
 * in any case, set community listener to detect logged-in event
 */
commSrv.addCommunityListener(new CommunityListenerImpl());

しかし、ビューのコンストラクタは Lotus Sametime コミュニティにログインしていないうちに呼ばれることもあります。その場合、サンプル・プログラムではコミュニティ・リスナーのクラスを宣言し、そこでログイン・イベントを受けて startListening() メソッドを呼び出します。

Lotus Sametime Connect クライアントがログインすると handleCommunityLoginEvent() メソッドが呼ばれます。そこでコール・リスナーを設定する startListening() メソッドを呼びます。

public void handleCommunityLoginEvent(CommunityLoginEvent ev) {
		
	int type = ev.getType();

	if (CommunityLoginEvent.TYPE_LOGGED_IN == type) {
			
		/*
		 * set call listerner
		 */
		try {
			VideoCallHandler.startListening();
		} catch (VideoCallHandlerException e) {
			e.printStackTrace();

			MessageDialog.openError(MainView.getComposite().getShell(),
				"VideoC Start Listening Exception", e.getMessage()
					+ "\nAT: " + this.getClass().toString());
		}
			
	}

		.....
}

ビデオ・チャットに参加する

コール・イベントが発生すると、それは CallListener インターフェースの processCallEvent() メソッドで通知されます。受信したビデオ・チャットを受け入れるために、そのメソッドに必要な処理を記述します。まず、そのコール・イベントがビデオ・チャットの招待かどうかを確認します。サンプル・アプリケーションでは CallEvent オブジェクトが IncomingCallEvent クラスのインスタンスかどうかを確認し、さらに isVideoCall()true かどうかを調べます。

public void processCallEvent(CallEvent ev) throws TelephonyServiceException {
		
	if (ev instanceof IncomingCallEvent) {
			
		/*
		 * get IncomingCallEvent object
		 */
		final IncomingCallEvent icEv = (IncomingCallEvent) ev;
		if (! icEv.isVideoCall()) {
			System.out.println("As this is not video call, do nothing");
			return;
		}
			
		/*
		 * get call ID, community Id, and place ID for the incoming call
		 */
		.....
	
		/*
		 * get composite object of main view to show video images on it
		 */
		.....
	
		/*
		 * get local/remote canvases on which video images will be shown
		 */
		.....
			
		/*
		 * call attendVideoChat() to accept the incoming call invitation
		 */
		.....
			
	} else if  (CallEvent.EVENT_CALL_TERMINATED == ev.getEventType()) {
		.....
	}
		
}

コール・イベントがビデオ・チャットの招待であれば、コミュニティ ID、プレース ID そしてコール ID といったビデオ・チャットに参加するための情報を、IncomingCallEvent オブジェクトから取得します。

/*
 * get call ID, community Id, and place ID for the incoming call
 */
final String communityId = icEv.getCommunityId();
final String placeId = icEv.getPlaceId();
final String callId = ev.getCallId();

ビデオ・チャットの画像を表示する SWT UI コンポーネントを MainView より取得します。

/*
 * get composite object of main view to show video images on it
 */
final Composite comp = MainView.getComposite();
			
/*
 * get local/remote canvases on which video images will be shown
 */
final Canvas localCanvas = MainView.getDefault().getLocalCanvas();
final Canvas remoteCanvas = MainView.getDefault().getRemoteCanvas();

processCallEvent() メソッドの処理の最後で、VideoCallHandler クラスの attendVideoChat() メソッドを呼んで ビデオ・チャットの招待を受け入れます。この処理は UI コンポーネントの操作を伴うため、アプリケーションのメインとなるスレッド以外からの操作は許されていません。この問題を解決するために、サンプル・プログラムではメイン・ビューのコンポジットから Display オブジェクトを取得し、syncExec() メソッドを使用して attendVideoChat() メソッドを呼び出し、キャンバスにビデオのイメージを表示させています。

/*
 * call attendVideoChat() to accept the incoming call invitation
 */
/*
 * Although the attendVideChat will call startVideo with Canvas
 * class, it is not allowed for another thread to control UI
 * component. Therefore I create another thread to request UI
 * handling in the Composite Otherwise I will get "ViewPart
 * org.eclipse.swt.SWTException: Invalid thread access"
 */

if ((comp != null) && !(comp.isDisposed())) {
	comp.getDisplay().syncExec(new Runnable() {

		public void run() {
			try {
				/*
				 * accept the incoming video chat invitation
				 */
				VideoCallHandler.attendVideoChat(callId,
						communityId, placeId, localCanvas,
						remoteCanvas);

				/*
				 * set place ID for the incoming video chat session
				 */
				MainView.getView().setPlaceId(placeId);

			} catch (VideoCallHandlerException e) {
				e.printStackTrace();

				MessageDialog.openError(comp.getShell(),
					"Video Attending Exception", e.getMessage()
							+ "\nAT: "
							+ this.getClass().toString());
			}
		}
	});

}

VideoCallHandler クラスの attendVideoChat() メソッドの中身は startVideoChat() メソッドと似た処理になります。 その違いは受信者は新しいコール ID を設定する必要がないことと、ビデオ・チャットの相手を指定しなくて良いことです。

public static void attendVideoChat(String callId, 
					String communityId,
					String placeId, 
		Canvas remoteCanvas, Canvas localCanvas) 
		throws VideoCallHandlerException {
	try {

		/*
		 * create option for video call
		 */
		 Properties properties = new Properties();
		 properties.setProperty("placeId", placeId);
		 properties.setProperty("communityId", communityId);
		 CallOptions options = CallFactory.getInstance().
		 		 		 createCallOptions();
		 options.setProperties(properties);
		 options.setVideoCall(true);
        	
		/*
		 * initiates a call using the specified options.
		 */
		Call call = manager.connectIncomingCall(callId, options, 
			CallListenerImpl.getInstance());
		calls.put(placeId, call);
	        
		/*
		 * Start displaying both local and 
		 * remote video for this call on canvases
		 */
		call.startVideo(localCanvas, remoteCanvas);
			
	} catch (TelephonyServiceException e) {
			throw new VideoCallHandlerException(e.getMessage(), e);
	}			
}

ここまでの処理で、サンプル・アプリケーションは、呼び出し側のサンプル・アプリケーションから来たビデオ・チャットの招待を受けられるようになりました。


まとめ

Lotus Sametime クライント・テレフォニー API により、アプリケーション開発者は Eclipse のプラグイン技術を利用して、リアルタイム・コラボーレションのアプリケーションを開発することができます。

Lotus Sametime という製品自体が、企業ユーザーの要求に対応できる高いレベルのスケーラビリティとセキュリティを持っています。そのため Lotus Sametime Connect クライアントを企業内のユニファイド・コミュニケーション & コラボレーションのアプリケーション・プラットフォームとして使用することができます。皆さんにとって本稿が、Lotus Sametime の上に新しいコラボレーションのためのアプリケーションを開発するきっかけになることを期待しております。

本稿で紹介したクライアント・テレフォニーの機能は Lotus Expeditor 6.1.1 や Lotus Notes 8.0 に埋め込まれた Lotus Sametime でも利用できます。そして、それらのプラットフォームでも、同じようにユニファイド・コミュニケーション & コラボレーションのアプリケーションの技術でのアプリケーション開発ができます。



ダウンロード

内容ファイル名サイズダウンロード形式
Code sampley-lot-videchat-sample.zip11KBHTTP

ダウンロード形式について


参考文献

著者について

小峯宏秋は日本アイ・ビー・エム株式会社のソフトウェア開発研究所 WPLCプロジェクト推進に所属し、Lotus Sametime を中心とする Lotus の Unified Communication & Collaboration を世に知らしめる活動に取り組んでいます。 大学では理論量子力学を専攻し、外資系ミニコンメーカーとロータス株式会社を経て IBM に入社しました。北海道で8年ぶりにスキーをし、まだ十分滑れることに自信を持ちました。娘もスキーのできる歳になったので、失われた10年を経てまたスキーに取り組んでみようかと思っています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=297173
ArticleTitle=ビデオ・チャットを利用した Lotus Sametime Connect のプラグイン・アプリケーションの作成
publish-date=03282008
author1-email=hkomine@jp.ibm.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。