Riproduci audio su indossabili

Questa guida descrive in che modo le app su Wear OS possono usare le familiari API Android per riprodurre audio.

Rileva dispositivi audio

Un'app Wear OS deve prima rilevare se il dispositivo indossabile dispone di un'uscita audio appropriata. Gli sviluppatori possono aspettarsi che gli indossabili abbiano a disposizione almeno una delle seguenti uscite audio:

Nell'esempio seguente, l'app utilizza il metodo getDevices() insieme al valore di FEATURE_AUDIO_OUTPUT per enumerare tutte le uscite audio.

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

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 }
}

// True if the device has a speaker
audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)

// True if a Bluetooth headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)

// True if a BLE broadcast group device is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)

// True if a BLE headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)

// True if a BLE speaker is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)

Per offrire un'esperienza utente ottimale, la tua app deve garantire la riproduzione di contenuti multimediali solo quando all'orologio sono collegati auricolari o altoparlanti Bluetooth.

Scegli il dispositivo preferito per l'uscita audio

A seconda del caso d'uso della tua app e dell'importanza dell'audio per l'esperienza di base dell'app, scegli in che modo vuoi che gli utenti interagiscano con l'output audio dell'app.

Auricolari Bluetooth

A differenza degli altoparlanti integrati, che sono sempre disponibili se presenti sul dispositivo, le cuffie Bluetooth possono essere accoppiate o disaccoppiate durante l'esecuzione di un'app. Se l'app richiede le cuffie per continuare,

registra un callback per rilevare quando l'utente connette e disconnette le cuffie Bluetooth utilizzando registerAudioDeviceCallback:

audioManager.registerAudioDeviceCallback(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.
        }
    }
}, null)
  

Se l'app rileva che non sono collegate le cuffie Bluetooth quando vuoi fornire l'output audio, non mostrare un messaggio di errore. Proponi invece di indirizzare l'utente direttamente alle impostazioni Bluetooth per facilitare la connessione. Per farlo, invia un intent con ACTION_BLUETOOTH_SETTINGS:

  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)
      putExtra("EXTRA_CLOSE_ON_CONNECT", true)
      putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", 1)
  }
  startActivity(intent)
  

Speaker

La maggior parte dei dispositivi Wear OS è dotata di altoparlanti. Se la tua app offre un caso d'uso non multimediale che incorpora l'audio, valuta la possibilità di utilizzare altoparlanti per offrire un ulteriore livello di coinvolgimento con l'utente. Ad esempio, un dispositivo Wear OS dotato di altoparlante potrebbe attivare un orologio o una sveglia con timer, completa di notifica audio, e le app per l'attività fisica potrebbero utilizzare l'altoparlante per fornire istruzioni per l'esercizio fisico.

Nota : gli speaker non offrono la migliore esperienza per l'ascolto di contenuti multimediali in quanto non sono progettati per questo scopo.

Per informazioni dettagliate, consulta WearSpeakerSample.

Riproduci audio

Dopo aver rilevato e scelto un'uscita audio adatta, la procedura per la riproduzione dell'audio su Wear OS è la stessa utilizzata sui dispositivi mobili o su altri dispositivi. Per ulteriori informazioni, consulta la panoramica di MediaPlayer. Per semplificare l'accesso alle funzionalità più avanzate, come lo streaming e il download di contenuti multimediali, utilizza ExoPlayer. Assicurati di seguire le best practice per le app audio, ad esempio per la gestione dell'audio.

Impedire la riproduzione di contenuti multimediali indesiderati tramite gli altoparlanti

Le app multimediali possono seguire le indicazioni riportate di seguito per assicurarsi che non riproducono involontariamente contenuti multimediali sugli altoparlanti dell'orologio integrati. Le indicazioni variano in base al player utilizzato dall'app.

ExoPlayer

Se la tua app utilizza ExoPlayer:

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

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. Reagisci all'evento di soppressione della riproduzione registrando WearUnsuitableOutputPlaybackSuppressionResolverListener come listener dell'istanza ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Toolkit per i media degli orologi

L'Horologist MediaToolkit contiene già una logica per impedire la riproduzione involontaria di contenuti multimediali sugli altoparlanti dell'orologio integrati.

Altri media player