问题描述
我正在使用Android SoundPool类,以便通过我的应用播放UI声音。如预期的那样,当通过其集成扬声器在android设备上进行测试时,声音可以完美播放。但是,当我连接耳机时会出现问题。
当我将有线耳机连接到android设备时,声音不会传递到这些耳机。它将继续通过电话的内置扬声器播放。蓝牙耳机的问题仍然存在。
为确保我的耳机和设备正常工作:
- 我确保我的耳机已正确路由到其他应用程序。例如,我通过Spotify上的耳机播放音乐,然后返回到我的应用,其中音频切换为通过集成扬声器播放。
- 我在多个android设备上进行了测试,结果相同。
给我的印象是,音频路由将在应用程序范围之外自动处理。 Android Developer网站上有a section about handling audio,但是没有提及有关在连接设备时手动路由音频的任何内容。
SoundPool实现
这是在名为SoundManager的类中设置我的SoundPool的相关代码。
我使用了单例实现,因此我可以从不同的活动中引用此类,而不必每次都创建一个新实例。
/*
Audio Settings
*/
private final int MAX_STREAMS = 1;
private final int SRC_QUALITY = 1;
private final int STREAM_TYPE = AudioAttributes.USAGE_MEDIA;
/*
Audio Attributes
*/
private final int ATT_USAGE = AudioAttributes.USAGE_GAME;
private final int ATT_FLAG = AudioAttributes.FLAG_AUDIBILITY_ENFORCED;
private final int ATT_CONTENT = AudioAttributes.CONTENT_TYPE_SONIFICATION;
private SoundManager() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(ATT_USAGE)
.setFlags(ATT_FLAG)
.setContentType(ATT_CONTENT)
.build();
soundplayer = new SoundPool.Builder()
.setMaxStreams(MAX_STREAMS)
.setAudioAttributes(audioAttributes)
.build();
} else {
soundplayer = new SoundPool(MAX_STREAMS,STREAM_TYPE,SRC_QUALITY);
}
this.audioManager = (AudioManager) appActivity.getSystemService(Context.AUdio_SERVICE);
appActivity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
}
/*
Singleton implementation.
*/
public static synchronized SoundManager get(Context context,AppCompatActivity activity) {
if (soundManager == null) {
soundManager = new SoundManager(context,activity);
}
return soundManager;
}
/* Play A Loaded Clip */
public void play(SoundElement element) {
if (existsInLoadedClips(element)) {
int localId = element.getLocalId();
float volume = getVolume();
soundplayer.play(localId,volume,PRIORITY,LOOP,RATE);
}
}
这不是整个类,而是与我的SoundPool实例交互的所有部分。
流类型
我认为问题的可能根源是流类型:
private final int STREAM_TYPE = AudioAttributes.USAGE_MEDIA;
private final int ATT_USAGE = AudioAttributes.USAGE_GAME;
但是,无论我使用哪种流类型,问题仍然存在。
音量控制流
其次,我认为音量控制流与该问题有关:
appActivity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
但是,我也无法通过更改它来找到解决方案。
将问题简化为基础
为了消除问题的可能根源,我仅使用SoundPool对象和a barebones UI来建立一个新项目。
Button myBtn;
SoundPool soundplayer;
/*
Audio Settings
*/
private final int MAX_STREAMS = 1;
private final int SRC_QUALITY = 1;
private final int STREAM_TYPE = AudioAttributes.USAGE_GAME;
/*
Audio Attributes
*/
private final int ATT_USAGE = AudioAttributes.USAGE_GAME;
private final int ATT_FLAG = AudioAttributes.FLAG_AUDIBILITY_ENFORCED;
private final int ATT_CONTENT = AudioAttributes.CONTENT_TYPE_SONIFICATION;
/*
Playback Settings
*/
private final int PRIORITY = 1;
private final int LOOP = 0;
private final int RATE = 1;
int clipId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* Create Our SoundPool Object */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(ATT_USAGE)
.setFlags(ATT_FLAG)
.setContentType(ATT_CONTENT)
.build();
soundplayer = new SoundPool.Builder()
.setMaxStreams(MAX_STREAMS)
.setAudioAttributes(audioAttributes)
.build();
} else {
soundplayer = new SoundPool(MAX_STREAMS,SRC_QUALITY);
}
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
/*Find Button & Load A Clip */
myBtn = (Button) findViewById(R.id.button);
myBtn.setonClickListener(new ButtonListener());
this.clipId = loadClip();
}
public int loadClip() {
String fileName = "your_audio_file";
String resourceFolder = "raw";
int resId = this.getResources().getIdentifier(
fileName,resourceFolder,this.getPackageName());
int localId = soundplayer.load(this,resId,1);
return localId;
}
private void playSound() {
soundplayer.play(clipId,1,RATE);
}
private class ButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) {
playSound();
}
}
在这个简单的示例中,当按下按钮并连接耳机时,音频剪辑仍只会通过我的android设备的集成扬声器播放。
我似乎找不到此问题的根源。任何帮助将不胜感激。 让我知道是否可以提供有关代码或问题的更多详细信息。 我试图包括我认为相关的所有内容,但是也许需要更多信息。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)