tencent cloud

フィードバック

GMEルーム管理機能の導入

最終更新日:2024-01-18 15:47:47
    ご注意:
    GME 3.xバージョンは現在、ルーム管理機能をサポートしていません。
    ここでは、開発者がルーム管理サービスに素早くアクセスできるように、ルーム管理サービスのユースケースとアクセスの流れについて紹介します。

    機能の説明

    クライアントルーム管理インターフェースにより、ルームメンバーの管理、ルームメンバーのマイクのオン・オフ管理を簡単に実現することができます。

    シナリオ

    例えば、人狼ゲームのシナリオでは、ホストとしてEnableMicで他のプレイヤーのマイクオンをコントロールできます。あるプレイヤーが「死亡」し、ルームの音声を聞いたりマイクを操作して話す必要がない場合、ForbidUserOperationインターフェースを介してそのプレイヤーのデバイス操作を禁止します。

    前提条件

    リアルタイム音声サービスが有効になっていること音声サービス有効化ガイドをご参照ください。
    GME SDK導入済み:コアインターフェースとリアルタイム音声インターフェースの導入を含みます。詳細については、Native SDKクイックスタートUnity SDKクイックスタートUnreal SDKクイックスタートをご参照ください。
    説明:
    この機能はH5 SDKではサポートされていません。

    導入プロセス

    クラス名:ITMGRoomManager

    GMEルーム管理機能は、ルームに入ってから呼び出し、ルーム内のメンバーの状態のみを変更できます。 すべてのインターフェースの結果はITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATORによってコールバックされます。コールバックの詳細については、コールバック処理をご参照ください。

    インターフェースリスト

    タイプ
    インターフェース
    収集制御
    EnableMic、EnableAudioCaptureDevice、EnableAudioSend
    再生制御
    EnableSpeaker、EnableAudioPlayDevice、EnableAudioRecv
    機器状態の取得
    GetMicState、GetSpeakerState
    敏感なインターフェース
    ForbidUserOperation

    収集管理の関連インターフェース

    収集管理インターフェースには、マイク管理オーディオアップリンク管理および収集ハードウェアデバイス管理が含まれます。その中で、マイク管理は、オーディオアップリンク管理と収集ハードウェアデバイス管理に相当します。

    収集管理

    このインターフェースを呼び出して、ルームにいるユーザーのマイクをオンまたはオフにします。呼び出しが成功すると、そのユーザーのマイクはオフまたはオンになります。
    EnableMicはEnableAudioSendとEnableAudioCaptureDeviceを同時に呼び出すことに相当します。

    関数のプロトタイプ

    Android
    iOS
    public abstract int EnableMic(boolean isEnabled,String receiverID);
    -(QAVResult)EnableMic:(BOOL)enable Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定のユーザーのマイクをオンにします。NO:特定のユーザーのマイクをオフにします
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_MIC_OP。

    オーディオストリーム送信管理

    このインターフェースを呼び出して、ルーム内のユーザーのオーディオ上りをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ上りはオフまたはオンになりますが、マイクの収集には影響しません。

    関数のプロトタイプ

    Android
    iOS
    public abstract int EnableAudioSend(boolean isEnabled,String receiverID);
    -(QAVResult)EnableAudioSend:(BOOL)enable Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定のユーザーのアップリンクをオンにします。NO:特定のユーザーのアップリンクをオフにします
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP。

    オーディオ収集ハードウェア管理

    このインターフェースを呼び出して、ルーム内のユーザーのオーディオ収集ハードウェアデバイスをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ収集ハードウェアデバイスはオフまたはオンになりますが、上りには影響しません。

    関数のプロトタイプ

    Android
    iOS
    public abstract int EnableAudioCaptureDevice(boolean isEnabled,String receiverID);
    -(QAVResult)EnableAudioCaptureDevice:(BOOL)enabled Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定のユーザーのオーディオ収集ハードウェアデバイスをオンにします。NO:特定のユーザーのオーディオ収集ハードウェアデバイスをオフにします
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_CAPTURE_OP。

    再生管理の関連インターフェース

    再生管理インターフェイスには、スピーカー管理オーディオダウンストリーム管理および再生ハードウェアデバイス管理が含まれます。その中で、スピーカー管理は、オーディオダウンリンク管理と再生ハードウェアデバイス管理に相当します。

    再生管理

    このインターフェースを呼び出して、ルーム内のユーザーのスピーカーをオンまたはオフにします。呼び出しが成功すると、そのユーザーのスピーカーがオフまたはオンになり、室内のオーディオ音が聞こえるようになります。 EnableSpeakerはEnableAudioRecvとEnableAudioPlayDeviceを同時に呼び出すことに相当します。

    関数のプロトタイプ

    Android
    iOS
    public abstract int EnableSpeaker(boolean isEnabled,String receiverID);
    -(QAVResult)EnableSpeaker:(BOOL)enable Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定のユーザーのスピーカーをオンにします。NO:特定のユーザーのスピーカーをオフにします
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_SPEAKER_OP。

    オーディオストリーム受信管理

    このインターフェースを呼び出して、ルーム内のユーザーのオーディオ下りをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ下りはオフまたはオンになりますが、再生デバイスには影響しません。

    関数のプロトタイプ

    Android
    iOS
    public abstract int EnableAudioRecv(boolean isEnabled,String receiverID);
    -(QAVResult)EnableAudioRecv:(BOOL)enabled Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定のユーザーのダウンリンクをオンにします。NO:特定のユーザーのダウンリンクをオフにします
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_AUDIO_REC_OP。

    オーディオ再生ハードウェア管理

    このインターフェースを呼び出して、ルーム内のユーザーのオーディオ再生ハードウェアデバイスをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ再生ハードウェアデバイスがオフまたはオンになりますが、下りには影響しません。

    関数のプロトタイプ

    Android
    iOS
    public abstract int EnableAudioPlayDevice(boolean isEnabled,String receiverID);
    -(QAVResult)EnableAudioPlayDevice:(BOOL)enabled Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定のユーザーのオーディオ再生ハードウェアデバイスをオンにします。NO:特定のユーザーのオーディオ再生ハードウェアデバイスをオフにします
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_PLAY_OP。

    メンバー状態取得インターフェース

    特定ユーザーの収集状態の取得

    このインターフェースを呼び出して、ルーム内のメンバーのマイク状態を取得します。

    関数のプロトタイプ

    Android
    iOS
    public abstract int GetMicState(String receiverID);
    -(QAVResult)GetMicState:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_GET_MIC_STATE。

    特定ユーザーの再生状態の取得

    このインターフェースを呼び出して、ルーム内のメンバーのスピーカー状態を取得します。

    関数のプロトタイプ

    Android
    iOS
    public abstract int GetSpeakerState(String receiverID);
    -(QAVResult)GetSpeakerState:(NSString *)receiverID;

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE。

    特定のメンバーによる収集および再生操作の禁止

    メンバーがルームに入ると、デフォルトでマイクとスピーカーの操作が許可されます。このインターフェースを呼び出すと、ルームのメンバーがマイクとスピーカーを操作できなくなります。この機能は、メンバーがルームを出ると無効になります。
    Android
    iOS
    public abstract int ForbidUserOperation(boolean isEnabled,String receiverID);
    -(QAVResult)ForbidUserOperation:(BOOL)enable Receiver:(NSString *)receiverID;
    パラメータ
    タイプ
    意味
    enable
    BOOL
    YES:特定ユーザーによるデバイスの操作を禁止します。NO:特定ユーザーによるデバイスの操作を許可します
    receiverID
    NSString*
    ターゲットユーザーOpenIdを入力します

    コールバック

    コールバックパラメータはITMG_ROOM_MANAGERMENT_FOBIN_OP。

    コールバック処理

    GMEの他のコールバックと同様に、ルーム管理のコールバックもOnEventで処理されます。イベント名はITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATORで、イベントは次のような構造体を返します。

    コールバックパラメータ

    パラメータ
    タイプ
    意味
    SenderID
    NSString
    イベント送信者IDです。自身のOpenIdと同じ場合は、ローカルから送信されたコマンドです
    ReceiverID
    NSString
    イベント受信者IDです。自身のOpenIdと同じ場合は、ローカルが受信したコマンドです
    OperateType
    NSNumber
    イベントタイプ
    Result
    NSNumber
    イベント結果です。0は成功を意味します
    OperateValue
    NSNumber
    コマンドの詳細

    OperateType

    数値
    イベントタイプ
    意味
    0
    ITMG_ROOM_MANAGEMENT_CAPTURE_OP
    収集デバイスのハードウェアコールバックの制御
    1
    ITMG_ROOM_MANAGEMENT_PLAY_OP
    再生デバイスのハードウェアコールバックの制御
    2
    ITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP
    アップリンクコールバックの制御
    3
    ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP
    ダウンリンクコールバックの制御
    4
    ITMG_ROOM_MANAGEMENT_MIC_OP
    マイクコールバックの制御
    5
    ITMG_ROOM_MANAGEMENT_PLAY_OP
    スピーカーコールバックの制御
    6
    ITMG_ROOM_MANAGEMENT_GET_MIC_STATE
    マイク状態の取得
    7
    ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE
    スピーカー状態の取得
    8
    ITMG_ROOM_MANAGERMENT_FOBIN_OP
    マイクイベントとスピーカーイベントの操作を禁止します

    OperateValue

    メンバー
    意味
    boolValue
    0:コマンドをオフにします。1:コマンドをオンにします

    サンプルコード

    Android
    iOS
    public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
    if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR== type) {
    
    ArrayList<String> operatorArr = new ArrayList<String>();
    operatorArr.add("収集");
    operatorArr.add("再生");
    operatorArr.add("上り");
    operatorArr.add("下り");
    operatorArr.add("上り収集");
    operatorArr.add("下り再生");
    operatorArr.add("mic状態");
    operatorArr.add("spk状態");
    operatorArr.add("mic/speak操作禁止");
    
    String SenderID = data.getStringExtra("SenderID");
    String ReceiverID = data.getStringExtra("ReceiverID");
    int OperateType = data.getIntExtra("OperateType",-1000);
    
    int Result =data.getIntExtra("Result",-1000);
    boolean OperateValue = data.getBooleanExtra("OperateValue",false);
    if (OperateType == -1000 ||Result == -1000) {
    return;
    }
    if (SenderID.equals(identifier)) {
    if (OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE) {
    Toast.makeText(getActivity(), String.format("id:%sへの%s操作、結果:%s", ReceiverID, operatorArr.get(OperateType), OperateValue ? "オン" : "オフ"), Toast.LENGTH_LONG).show();
    }else{
    Toast.makeText(getActivity(), String.format("id:%sへの%s%s操作、結果:%d", ReceiverID, operatorArr.get(OperateType), OperateValue ? "オン" : "オフ", Result), Toast.LENGTH_LONG).show();
    }
    
    } else if (ReceiverID.equals(identifier)||ReceiverID.equals("ALL")) {
    if (Result == 0) {
    switch (OperateType) {
    case ITMGContext.ITMG_ROOM_MANAGEMENT_CAPTURE_OP:
    {
    if (!OperateValue) {
    mSwitchCapture.setChecked(OperateValue);
    }else{
    AlertDialog.Builder dialog = new AlertDialog.Builder (getActivity()); //オブジェクト作成
    dialog.setTitle("機器収集をオンにしますか");
    dialog.setMessage("");
    dialog.setCancelable(false);
    dialog.setPositiveButton("オン", new DialogInterface.OnClickListener() {
    //OKボタンのクリックイベントを設定
    @Override
    public void onClick(DialogInterface dialog, int which) {
    mSwitchCapture.setChecked(true);
    ITMGContext.GetInstance(getActivity()).GetAudioCtrl().EnableAudioCaptureDevice(true);
    }
    });
    dialog.setNegativeButton("オフ", new DialogInterface.OnClickListener() {
    //キャンセルボタンのクリックイベントを設定
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
    });
    dialog.show();
    }
    
    }
    break;
    case ITMGContext.ITMG_ROOM_MANAGEMENT_PLAY_OP:
    {
    mSwitchPlayDevice.setChecked(OperateValue);
    }
    break;
    case ITMGContext.ITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP:
    {
    if (!OperateValue) {
    mSwitchSend.setChecked(OperateValue);
    }else{
    AlertDialog.Builder dialog = new AlertDialog.Builder (getActivity()); //オブジェクト作成
    dialog.setTitle("上りをオンにしますか");
    dialog.setMessage("");
    dialog.setCancelable(false);
    dialog.setPositiveButton("オン", new DialogInterface.OnClickListener() {
    //OKボタンのクリックイベントを設定
    @Override
    public void onClick(DialogInterface dialog, int which) {
    mSwitchSend.setChecked(true);
    ITMGContext.GetInstance(getActivity()).GetAudioCtrl().EnableAudioSend(true);
    }
    });
    dialog.setNegativeButton("オフ", new DialogInterface.OnClickListener() {
    //キャンセルボタンのクリックイベントを設定
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
    });
    dialog.show();
    }
    }
    break;
    case ITMGContext.ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP:
    {
    mSwitchRecv.setChecked(OperateValue);
    }
    break;
    case ITMGContext.ITMG_ROOM_MANAGEMENT_MIC_OP:
    {
    if (!OperateValue) {
    mSwitchCapture.setChecked(OperateValue);
    mSwitchSend.setChecked(OperateValue);
    }else{
    AlertDialog.Builder dialog = new AlertDialog.Builder (getActivity()); //オブジェクト作成
    dialog.setTitle("収集と上りをオンにしますか");
    dialog.setMessage("");
    dialog.setCancelable(false);
    dialog.setPositiveButton("オン", new DialogInterface.OnClickListener() {
    //OKボタンのクリックイベントを設定
    @Override
    public void onClick(DialogInterface dialog, int which) {
    mSwitchCapture.setChecked(true);
    mSwitchSend.setChecked(true);
    ITMGContext.GetInstance(getActivity()).GetAudioCtrl().EnableMic(true);
    }
    });
    dialog.setNegativeButton("オフ", new DialogInterface.OnClickListener() {
    //キャンセルボタンのクリックイベントを設定
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
    });
    dialog.show();
    }
    }
    break;
    case ITMGContext.ITMG_ROOM_MANAGEMENT_SPEAKER_OP:
    {
    mSwitchPlayDevice.setChecked(OperateValue);
    mSwitchRecv.setChecked(OperateValue);
    }
    break;
    
    }
    }
    if (OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE)
    {
    Toast.makeText(getActivity(), String.format("id:%sからの%s操作、結果:%s",SenderID,operatorArr.get(OperateType),OperateValue?"オン":"オフ"), Toast.LENGTH_LONG).show();
    }
    else if (OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_SPEAKER_OP || OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP|| OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_PLAY_OP|| OperateType == ITMGContext.ITMG_ROOM_MANAGERMENT_FOBIN_OP){
    Toast.makeText(getActivity(), String.format("id:%sからの%s%s操作、結果:%d",SenderID,operatorArr.get(OperateType),OperateValue?"オン":"オフ",Result), Toast.LENGTH_LONG).show();
    } else if (OperateValue == false) {
    Toast.makeText(getActivity(), String.format("id:%sからの%s%s操作、結果:%d",SenderID,operatorArr.get(OperateType),OperateValue?"オン":"オフ",Result), Toast.LENGTH_LONG).show();
    }
    }
    }
    -(void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data{
    NSString *log = [NSString stringWithFormat:@"OnEvent:%d,data:%@", (int)eventType, data];
    [self showLog:log];
    NSLog(@"====%@====", log);
    switch (eventType) {
    case ITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR:
    {
    NSArray *operatorArr = @[@"収集",@"再生",@"上り",@"下り",@"上り収集",@"下り再生",@"メンバー追放",@"mic状態",@"spk状態",@"禁止操作mic/speak"];
    // _openId
    NSString *SenderID = [data objectForKey:@"SenderID"];
    NSString *ReceiverID = [data objectForKey:@"ReceiverID"];
    NSNumber *OperateType = [data objectForKey:@"OperateType"];
    NSNumber *Result = [data objectForKey:@"Result"];
    NSNumber *OperateValue = [data objectForKey:@"OperateValue"];
    
    ///自分が出したコマンド
    if ([SenderID isEqualToString:_openId]) {
    if (OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE) {
    NSString *alterString = [NSString stringWithFormat:@"id:%@への%@操作、結果:%@",ReceiverID,operatorArr[OperateType.intValue],OperateValue.boolValue?@"オン":@"オフ"];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    }
    else
    {
    NSString *alterString = [NSString stringWithFormat:@"id:%@への%@%@操作、結果:%@",ReceiverID,OperateValue.boolValue?@"オン":@"オフ",operatorArr[OperateType.intValue],Result];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    }
    
    
    }
    else if([ReceiverID isEqualToString:_openId] ){ //他人からのコマンド
    if (Result.intValue == 0) {
    switch (OperateType.intValue) {
    case ITMG_ROOM_MANAGEMENT_CAPTURE_OP:{
    [_micSwitch setOn:OperateValue.boolValue animated:true];
    }
    break;
    case ITMG_ROOM_MANAGEMENT_PLAY_OP:{
    [_speakerSwitch setOn:OperateValue.boolValue animated:true];
    }
    break;
    case ITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP:{
    [_sendSwitch setOn:OperateValue.boolValue animated:true];
    }
    break;
    case ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP:{
    [_recvSwitch setOn:OperateValue.boolValue animated:true];
    }
    break;
    case ITMG_ROOM_MANAGEMENT_MIC_OP:{
    [_micSwitch setOn:OperateValue.boolValue animated:true];
    [_sendSwitch setOn:OperateValue.boolValue animated:true];
    }
    break;
    case ITMG_ROOM_MANAGEMENT_SPEAKER_OP:{
    [_speakerSwitch setOn:OperateValue.boolValue animated:true];
    [_recvSwitch setOn:OperateValue.boolValue animated:true];
    
    }
    break;
    default:
    break;
    }
    
    if (OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE) {
    NSString *alterString = [NSString stringWithFormat:@"id:%@からの%@操作、結果:%@",SenderID,operatorArr[OperateType.intValue],OperateValue.boolValue?@"オン":@"オフ"];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    }
    else{
    NSString *alterString = [NSString stringWithFormat:@"id:%@からの%@%@操作、結果:%@",SenderID,OperateValue.boolValue?@"オン":@"オフ",operatorArr[OperateType.intValue],Result];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    }
    }
    }
    }
    break;
    }
    
    お問い合わせ

    カスタマーサービスをご提供できるため、ぜひお気軽にお問い合わせくださいませ。

    テクニカルサポート

    さらにサポートが必要な場合は、サポートチケットを送信して弊社サポートチームにお問い合わせください。24時間365日のサポートをご提供します。

    電話サポート(24 時間365日対応)