中断汽车收音机android蓝牙

时间:2016-10-14 10:19:51

标签: android bluetooth text-to-speech voip android-audiomanager

我们正试图通过蓝牙连接的汽车音响从我们的Android应用程序(交通信息)播放音频警报。如果我们将汽车立体声音频输入切换到蓝牙,则会播放应用音频。如果它位于任何其他来源,则无法从立体声或设备播放应用音频。

我们想要做的是,允许用户将立体声音频输入保留在DAB / FM收音机或其他来源上,但在特定时间让我们的应用程序音频中断并播放这些交通信息警报,例如{{1}应用程序管理(如Facebook Messenger),内置的电话电话应用程序可以做。

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

MainActivity.java

VOIP

activity_main.xml:

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();
    }
}

我们在Android清单中有这些额外的权限:

<?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。

2 个答案:

答案 0 :(得分:1)

为了解决您的问题,我们必须首先了解汽车音响系统为蓝牙提供的设施。

汽车音响系统支持A2DP配置文件以及HandsFree配置文件以获得通话。现在,当选择蓝牙作为源时,您的应用在A2DP配置文件上播放的任何内容都将由音频系统播放。但是,一旦您切换到其他来源,如收音机,即使您的设备与汽车音频系统的A2DP配置文件连接,也不会播放您现在面对的任何内容。但是,这里可以尝试的一些事情,也就是中断了广播剧:

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

    我会更新这个答案,我发现上述建议有任何暗示。

    由于

答案 1 :(得分:1)

我能够使用以下代码:

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秒的延迟。当我解决了,我会更新这个答案。