0

Nous essayons de jouer des alertes audio à partir de notre application Android (informations sur la circulation) sur les autoradios Bluetooth connectés. Si nous passons l'entrée audio stéréo de voiture à Bluetooth, l'audio de l'application joue. Si elle est sur une autre source, l'audio de l'application ne joue pas, que ce soit à partir de la chaîne stéréo ou de l'appareil. Ce que nous voulons faire, est de permettre aux utilisateurs de garder l'entrée audio stéréo sur la radio DAB/FM ou autre source, mais d'avoir une interruption audio de l'application à certains moments et de lire ces alertes, comme la façon dont VOIP à faire (comme Facebook Messenger), et l'application de téléphonie appel téléphonique intégré parvient à faire.Interrupt autoradio android bluetooth

Voici le code que nous utilisons à l'heure actuelle:

MainActivity.java

package com.robbresearch.ttsandroidtest; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.content.Context; 
import android.media.AudioManager; 

public class MainActivity extends AppCompatActivity { 

    private Button speakNowButton; 
    private TextView textView; 
    TTSManager ttsManager = null; 
    AudioManager am; 

    AudioManager.OnAudioFocusChangeListener afChangeListener = 
     new AudioManager.OnAudioFocusChangeListener() { 
      public void onAudioFocusChange(int focusChange) { 
       if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) { 
        // Pause playback 
       } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
        // Resume playback 
       } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { 
        //am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); 
        am.abandonAudioFocus(afChangeListener); 
        // Stop playback 
       } 
      } 
     }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Context mContext = getApplicationContext(); 

     ttsManager = new TTSManager(); 
     ttsManager.init(this); 

     am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 

     // Request audio focus for playback 
     int result = am.requestAudioFocus(afChangeListener, 
       // Use the music stream. 
       AudioManager.STREAM_VOICE_CALL, 
       // Request permanent focus. 
       AudioManager.AUDIOFOCUS_GAIN); 

     if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 
      //am.registerMediaButtonEventReceiver(RemoteControlReceiver); 
      // Start playback. 
     } 

     am.setMode(AudioManager.MODE_IN_CALL); 
     android.os.Process.setThreadPriority(
       android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

     textView = (TextView) findViewById(R.id.input_text); 
     speakNowButton = (Button) findViewById(R.id.speak_now); 
     speakNowButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       String text = textView.getText().toString(); 
       ttsManager.initQueue(text); 
      } 
     }); 
    } 

    /** 
    * Releases the resources used by the TextToSpeech engine. 
    */ 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     ttsManager.shutDown(); 
    } 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="10dp" 
    android:orientation="vertical" 
    android:padding="20dp" > 

    <TextView 
     android:id="@+id/input_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="20dp" 
     android:ems="10" 
     android:padding="10dp" 
     android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." /> 

    <Button 
     android:id="@+id/speak_now" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Speak Now" /> 

</LinearLayout> 

Nous avons ces autorisations supplémentaires dans le manifeste android:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

Nous vous serions reconnaissants des conseils sur la façon d'y parvenir, merci :)

Nous avons seulement besoin de soutenir les nouvelles versions d'Android si nécessaire.

+0

Est-ce que 'audio ducking' fonctionne http://stackoverflow.com/a/36925768/1256219 – brandall

+0

J'ai essayé de demander la mise au point audio avec AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK et cela n'a fait aucune différence - c'est ce que vous vouliez dire? – peterfhannon

Répondre

0

j'ai pu le faire fonctionner avec le code suivant:

audioM.setMode(audioM.MODE_IN_COMMUNICATION); 
audioM.setBluetoothScoOn(true); 
audioM.startBluetoothSco(); 
audioM.setSpeakerphoneOn(false); 

Et les autorisations suivantes:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.BROADCAST_STICKY" /> 

Il n'y avait pas besoin de définir une priorité ou une demande fil mise au point audio.

Notez que je reçois actuellement un délai de 15 secondes entre l'appel de TextToSpeech.speak() et l'écoute de l'audio sur l'autoradio. Quand j'ai résolu que je vais mettre à jour cette réponse.

+0

Bon à savoir ... Le retard semble être un problème commun ... Vous pouvez trouver une solution stackoverflow elle-même à ce sujet .. – aksonlyaks

1

Pour parvenir à une solution à votre problème, nous devons d'abord comprendre ce que le système audio de voiture fournit avec bluetooth.

Le système audio de la voiture prend en charge le profil A2DP avec le profil HandsFree pour répondre aux appels. Maintenant, lorsque Bluetooth est sélectionné comme source, tout ce qui est joué par votre application sur le profil A2DP sera lu par le système audio. Cependant, une fois que vous avez basculé vers une autre source comme la radio, même si votre appareil est connecté avec le profil A2DP avec le système audio de la voiture, vous n'aurez plus rien à faire. Cependant, peu de choses qui peuvent être essayées ici, ce qui interrompt le jeu de la radio et sont les suivants:

  1. Nous savons que lorsqu'un appel arrive, nous obtenons alerte avec le numéro de téléphone, même quand nous sommes à l'écoute de la radio. Cette partie d'alerte que vous pouvez utiliser pour votre solution. Cependant, je ne sais pas grand chose si nous pouvons envoyer une alerte de sonnerie de l'application. Ces alertes sont au niveau inférieur juste les commandes AT. Certaines recherches seraient nécessaires pour vérifier cela.
  2. Dans certains systèmes audio de voiture, il est possible que lorsque le SMS arrive, il vous prévienne. Cette partie d'alerte peut également être explorée.

Je pouvais voir ces deux options qui pourraient vous aider. Mais ce n'est pas la seule option que je suppose. S'il vous plaît essayer de trouver la fiche technique des systèmes audio de voiture bluetooth. Là, vous pouvez savoir quelles autres fonctionnalités d'alerte Bluetooth ils fournissent.

Je vais mettre à jour cette réponse Je trouve un indice sur ma suggestion ci-dessus.

Merci

+0

J'ai demandé la spécification audio bluetooth pour la stéréo du modèle que j'utilise pour tester (Jaguar XF), je verrai si je travaille sur quelque chose à partir de cela. – peterfhannon