Riproduci audio su indossabili

Questa guida descrive come utilizzare le API Android che conosci per riprodurre audio nelle app Wear OS.

Rilevare i dispositivi audio

Un'app Wear OS deve prima rilevare se il dispositivo indossabile ha un'uscita audio appropriata. I dispositivi indossabili in genere hanno almeno uno dei seguenti output audio:

  • AudioDeviceInfo.TYPE_BUILTIN_SPEAKER: sui dispositivi con altoparlante integrato.
  • AudioDeviceInfo.TYPE_BLUETOOTH_A2DP: quando le cuffie Bluetooth sono accoppiate e connesse.
  • AudioDeviceInfo.TYPE_BLE_BROADCAST: quando un dispositivo del gruppo di trasmissione Bluetooth Low Energy (BLE) è accoppiato e connesso.
  • AudioDeviceInfo.TYPE_BLE_HEADSET: quando le cuffie BLE sono accoppiate e connesse.
  • AudioDeviceInfo.TYPE_BLE_SPEAKER: quando un altoparlante BLE è accoppiato e connesso.

Il seguente esempio utilizza il metodo getDevices() con il valore FEATURE_AUDIO_OUTPUT per verificare se è disponibile un tipo di output audio.

private val audioManager: AudioManager by lazy {
    getSystemService(AUDIO_SERVICE) as AudioManager
}

fun audioOutputAvailable(type: Int): Boolean {
    if (!packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
        return false
    }
    return audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).any { it.type == type }
}

Puoi quindi utilizzare questo metodo per verificare se è disponibile un tipo di uscita audio.

val hasSpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)
val hasBluetoothHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)
val hasBLEBroadcast = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)
val hasBLEHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)
val hasBLESpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)

Per offrire la migliore esperienza utente, riproduci i contenuti multimediali solo quando le cuffie o gli speaker Bluetooth sono connessi allo smartwatch.

Scegliere il dispositivo preferito per l'uscita audio

A seconda del caso d'uso della tua app e dell'importanza dell'audio per la sua esperienza principale, scegli in che modo gli utenti interagiscono con l'output audio della tua app.

Consenti all'utente di scegliere il dispositivo di uscita dei contenuti multimediali

A partire da Wear OS 5, il sistema fornisce un'interfaccia utente che consente agli utenti di scegliere il dispositivo che riproduce i contenuti multimediali e mostra informazioni sui contenuti multimediali attualmente in riproduzione.

Se la tua app rileva che non è connessa una cuffia Bluetooth quando vuoi fornire la riproduzione audio su dispositivi con Wear OS 5 o versioni successive, offriti di portare l'utente direttamente al selettore di output multimediale. Sui dispositivi che non supportano il selettore dell'output multimediale, richiama l'azione intent ACTION_BLUETOOTH_SETTINGS, che reindirizza l'utente alla pagina Bluetooth nelle impostazioni di sistema.

Il metodo launchOutputSelection(), parte della libreria Horologist su GitHub, mostra come consentire agli utenti di scegliere il dispositivo di output multimediale.

Auricolari Bluetooth

A differenza degli speaker integrati, che sono sempre disponibili se presenti sul dispositivo, le cuffie Bluetooth possono essere accoppiate o disaccoppiate durante l'esecuzione di un'app. Se la tua app richiede una cuffia per continuare, registra un callback per rilevare quando l'utente collega e scollega una cuffia Bluetooth utilizzando registerAudioDeviceCallback:

val audioDeviceCallback =
    object : AudioDeviceCallback() {
        override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) {
            super.onAudioDevicesAdded(addedDevices)
            if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) ||
                audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) ||
                audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) ||
                audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)
            ) {
                // A Bluetooth or BLE device is connected and available for playback.
            }
        }
        override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) {
            super.onAudioDevicesRemoved(removedDevices)
            if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)) &&
                !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)) &&
                !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)) &&
                !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER))
            ) {
                // No Bluetooth or BLE devices are connected anymore.
            }
        }
    }

audioManager.registerAudioDeviceCallback(audioDeviceCallback, /*handler=*/ null)

Se la tua app rileva che non è connessa una cuffia Bluetooth quando vuoi fornire l'output audio, non mostrare un messaggio di errore. Offriti invece di portare l'utente direttamente alle impostazioni Bluetooth per facilitare la connessione. A questo scopo, invia un intent con ACTION_BLUETOOTH_SETTINGS:

fun Context.launchBluetoothSettings(closeOnConnect: Boolean = true) {
    val intent = with(Intent(Settings.ACTION_BLUETOOTH_SETTINGS)) {
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        putExtra("EXTRA_CONNECTION_ONLY", true)
        if (closeOnConnect) {
            putExtra("EXTRA_CLOSE_ON_CONNECT", true)
        }
        putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", FILTER_TYPE_AUDIO)
    }
    startActivity(intent)
}

internal const val FILTER_TYPE_AUDIO = 1

Altoparlanti integrati

La maggior parte dei dispositivi Wear OS ha altoparlanti integrati. Se la tua app offre un caso d'uso non multimediale che utilizza l'audio, valuta la possibilità di utilizzare gli speaker per offrire una dimensione aggiuntiva di coinvolgimento. Ad esempio, un dispositivo Wear OS dotato di altoparlante potrebbe attivare una sveglia o un timer con una notifica audio e le app per il fitness potrebbero utilizzare l'altoparlante per fornire istruzioni per l'allenamento.

Per ulteriori dettagli, consulta WearSpeakerSample.

Riproduci l'audio

Dopo aver rilevato e scelto un'uscita audio adatta, la riproduzione audio su Wear OS è uguale a quella su dispositivi mobili o altri dispositivi. Per ulteriori informazioni, consulta la panoramica di MediaPlayer. Per accedere più facilmente alle funzionalità avanzate, ad esempio lo streaming e il download di contenuti multimediali, utilizza ExoPlayer. Segui le best practice per le app audio, ad esempio la gestione della messa a fuoco dell'audio.

Evitare la riproduzione involontaria di contenuti multimediali tramite gli altoparlanti integrati

Le app multimediali possono seguire queste indicazioni per evitare che l'app riproduca involontariamente contenuti multimediali sugli altoparlanti integrati dello smartwatch. Le indicazioni variano a seconda del player utilizzato dalla tua app.

ExoPlayer

Se la tua app utilizza ExoPlayer:

  1. Chiama il metodo setSuppressPlaybackOnUnsuitableOutput(true) durante la creazione dell'istanza ExoPlayer:

val exoPlayer = ExoPlayer.Builder(context)
    .setAudioAttributes(AudioAttributes.DEFAULT, true)
    .setSuppressPlaybackOnUnsuitableOutput(true)
    .build()

  1. Reagisci all'evento di eliminazione della riproduzione registrando WearUnsuitableOutputPlaybackSuppressionResolverListener listener come listener dell'istanza ExoPlayer:

exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))

Horologist Media toolkit

Horologist MediaToolkit contiene già la logica per impedire la riproduzione involontaria di contenuti multimediali sugli altoparlanti integrati dello smartwatch.

Altri media player