Android 中断车载收音机和蓝牙

Android 中断车载收音机和蓝牙,android,bluetooth,text-to-speech,voip,android-audiomanager,Android,Bluetooth,Text To Speech,Voip,Android Audiomanager,我们正在尝试通过蓝牙车载立体声系统播放来自android应用程序(交通信息)的音频警报。如果我们将汽车立体声音频输入切换到蓝牙,应用程序音频将播放。如果应用程序音频位于任何其他来源,则应用程序音频不会从立体声或设备播放 我们想做的是,允许用户在DAB/FM收音机或其他来源上保持立体声音频输入,但在某些时间让我们的应用程序音频中断并播放这些交通信息警报,如VOIP应用程序如何管理(如Facebook messenger),以及内置电话呼叫应用程序如何管理 下面是我们目前使用的代码: MainAct

我们正在尝试通过蓝牙车载立体声系统播放来自android应用程序(交通信息)的音频警报。如果我们将汽车立体声音频输入切换到蓝牙,应用程序音频将播放。如果应用程序音频位于任何其他来源,则应用程序音频不会从立体声或设备播放

我们想做的是,允许用户在DAB/FM收音机或其他来源上保持立体声音频输入,但在某些时间让我们的应用程序音频中断并播放这些交通信息警报,如
VOIP
应用程序如何管理(如Facebook messenger),以及内置电话呼叫应用程序如何管理

下面是我们目前使用的代码:

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\u 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>

我们在android清单中有这些附加权限:

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

如果您能就如何实现这一目标提供任何建议,我们将不胜感激,谢谢:)


我们只需要在必要时支持较新版本的android。

要解决您的问题,我们必须首先了解汽车音响系统提供的蓝牙功能

汽车音响系统支持A2DP模式和免提模式,以实现通话。现在,当选择蓝牙作为源时,您的应用程序在A2DP配置文件上播放的任何内容都将由音频系统播放。然而,一旦您切换到其他来源,如收音机,即使您的设备连接了A2DP配置文件和汽车音响系统,也不会播放您现在面对的任何内容。然而,在这里可以尝试的干扰广播剧的事情很少有:

  • 我们知道,当接到任何电话时,即使在收听广播时,我们也会收到电话号码提醒。此警报部分可用于解决方案。然而,我不知道我们是否可以从应用程序发送电话铃声警报。这些警报仅在命令中处于较低级别。需要一些搜索来检查这一点
  • 在一些汽车音响系统中,有一个设施,当短信到来时,它会提醒你。也可以浏览此警报部分 我可以看到这两个选项可以帮助你。但我想这不是唯一的选择。请尝试查找汽车音响系统蓝牙规格表。在那里,您可以了解他们提供的其他蓝牙警报功能

    如果我发现以上建议有任何暗示,我会更新这个答案


    谢谢

    我能够使用以下代码使其工作:

    audioM.setMode(audioM.MODE_IN_COMMUNICATION);
    audioM.setBluetoothScoOn(true);
    audioM.startBluetoothSco();
    audioM.setSpeakerphoneOn(false);
    
    以及以下权限:

    <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" />
    
    
    
    不需要设置线程优先级或请求音频焦点


    请注意,我目前在调用TextToSpeech.speak()和通过车载收音机收听音频之间有15秒的延迟。当我解决了这个问题后,我会更新这个答案。

    音频回避有效吗?我已经尝试过向AudioManager请求音频聚焦。音频聚焦\u增益\u瞬态\u可能\u回避,这没有什么区别-这是你的意思吗?我已经为我正在测试的车型(捷豹XF)的立体声请求了蓝牙音频规格,我会看看我能不能从中找到什么好消息。。延迟似乎是一个常见的问题。。。关于这一点,你可能会找到一些解决方案,stackoverflow本身..嗯,这对其他人来说可能是显而易见的,但我花了一些时间才意识到,我还必须用am.stopbuetoothsco()再次关闭一切;(非常简单)和am.setMode(AudioManager.MODE_正常);(这个花了我很长时间.)