🎧

【Unity/Android】Vivoxで、AndroidでBluetoothイヤホンから音が出ない問題(Permissionについて)

2024/01/02に公開

概要

  • UnityでAndroid(モバイル)向けのアプリを開発している。ボイスチャットライブラリとしてVivoxを採用している。
  • Vivoxが繋がると、Bluetoothイヤホンをつけているのに端末から音が出力される問題が発生した。
  • Android 12以降を搭載したデバイスでは、AndroidManifestで android.permission.BLUETOOTH_CONNECTを宣言するとともに、ランタイムで権限リクエストをする必要がある。

環境

  • Unity 2022.3.10f1
  • Vivox 16.0.0pre1

問題の詳細

  • Android 12以降のデバイスでは、Vivoxによる音声通話が始まると、Bluetoothイヤホンではなく、端末自体から音が出力される。
    • Vivoxが繋がる前の段階ではBluetoothイヤホンから音が出力される。
  • Bluetoothイヤホンではなく、有線のイヤホンであれば問題は発生しない。
  • iOSでは問題は発生しない。

解決

  • Vivoxの公式ドキュメントで、AndroidのPermissionについて指示されている。
    • ランタイムでアクセス許可のリクエストを送る必要がある。

android.permission.BLUETOOTH_CONNECT - Allows access to Bluetooth devices on Android version 12 and later

Note: On Android 12 (Android SDK version 31) and later, you need to request the android.permission.BLUETOOTH_CONNECT permission at runtime. For more information, see the Android developer documentation on Bluetooth permissions.

実装

  • マイク自体の権限許可と合わせて、以下のようなスクリプトを作成した
    • なお、自分たちが開発しているアプリはQuestなどのAndroid製スタンドアロンVRにも対応している。VR状態のときはBLUETOOTH_CONNECT権限はリクエストしていない
using System.Collections;
using UnityEngine;

#if PLATFORM_ANDROID
using UnityEngine.Android;
#endif

public class PermissionRequester : MonoBehaviour
{
#if PLATFORM_ANDROID
    private static readonly string BluetoothConnectPermission = "android.permission.BLUETOOTH_CONNECT";
    
    IEnumerator Start()
    {
        if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))
        {
            yield return RequestUserPermission(Permission.Microphone);
        }
        
        if (!Permission.HasUserAuthorizedPermission(BluetoothConnectPermission))
        {
            yield return RequestUserPermission(BluetoothConnectPermission);
        }
        yield break;
    }

    IEnumerator RequestUserPermission(string permission)
    {
        Permission.RequestUserPermission(permission);
        yield break;
    }
#endif
}
  • 実際のリクエスト画面


マイクアクセス自体のPermission

BluetoothのPermission

  • AndroidManifestへの android.permission.BLUETOOTH_CONNECTへの追加は自動で行われる模様。

補足: AndroidのPermissionについて

  • Androidでの権限には、インストール時の権限と、実行時(ランタイム)での権限がある。
  • 実行時の権限について

実行時の権限の多くは、非公開のユーザーデータ(機密情報を含む可能性のある特別なタイプの制限付きデータ)にアクセスします。非公開のユーザーデータの例としては、位置情報や連絡先情報などがあります。

実行時の権限にはdangerousの保護レベルが割り当てられます。

Discussion