我们正试图通过蓝牙连接的汽车音响从我们的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。
答案 0 :(得分:1)
为了解决您的问题,我们必须首先了解汽车音响系统为蓝牙提供的设施。
汽车音响系统支持A2DP配置文件以及HandsFree配置文件以获得通话。现在,当选择蓝牙作为源时,您的应用在A2DP配置文件上播放的任何内容都将由音频系统播放。但是,一旦您切换到其他来源,如收音机,即使您的设备与汽车音频系统的A2DP配置文件连接,也不会播放您现在面对的任何内容。但是,这里可以尝试的一些事情,也就是中断了广播剧:
我可以看到这两个可以帮助你的选项。但这不是我猜的唯一选择。请尝试查找汽车音响系统蓝牙规格表。在那里你可以知道他们提供的其他蓝牙警报功能。
我会更新这个答案,我发现上述建议有任何暗示。
由于
答案 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秒的延迟。当我解决了,我会更新这个答案。