在我的应用程序中,有一个使用设备音频插孔的读卡器。现在,我的问题是,当读卡器在设备的耳机插孔中完好无损时,我想从内置扬声器中发出声音。
以下是我尝试过的代码:
1) 使用反射方法
Class audioSystemClass;
try {
audioSystemClass = Class
.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod(
"setForceUse", int.class, int.class);
// First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go
// back to the default
// behavior, use FORCE_NONE (0).
setForceUse.invoke(null, 1, 1);
final float maxVolume = mAudioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);
} catch (ClassNotFoundException e) {
Log.e("Test", e.toString());
e.printStackTrace();
} catch (NoSuchMethodException e) {
Log.e("Test", e.toString());
e.printStackTrace();
} catch (IllegalAccessException e) {
Log.e("Test", e.toString());
e.printStackTrace();
} catch (IllegalArgumentException e) {
Log.e("Test", e.toString());
e.printStackTrace();
} catch (InvocationTargetException e) {
Log.e("Test", e.toString());
e.printStackTrace();
}
2)使用setMode方法
mAudioManager.setMode(AudioManager.MODE_IN_CALL);
mAudioManager.setSpeakerphoneOn(true);
float maxVolume = mAudioManager
.getStreamMaxVolume(AudioManager.STREAM_RING);
soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);
但这两种代码仅在具有默认FM应用程序的设备中运行。但我想在所有设备中都具有此功能。
请分享你的经验!!
在这里,我已经启动了一个SoundPool并加载了一个beep。
SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_VOICE_CALL, 0);
soundPool
.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool,
int sampleId, int status) {
loaded = true;
}
});
soundID = soundPool.load(ApplicationChexology.getContext(), R.raw.beep_single, 1);
现在,在加载声音后,我将AudioManager设置为MODE_IN_COMMUNICATION并播放声音。播放声音后,将音频管理器的模式设置为mode_NORMAL。
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(true);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
if (loaded)
soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);
Timer timer = new Timer();
TimerTask delayedThreadStartTask = new TimerTask() {
@Override
public void run() {
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(false);
}};
timer.schedule(delayedThreadStartTask, 500);
您的第二种方法setMode适用于具有默认Fm播放器的手机。
但是,对于没有默认FM的设备,我尝试了以下代码:
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioManager.setSpeakerphoneOn(true);
这段代码在没有默认Fm播放器的手机上运行良好。我用了一个装有氧气操作系统的一加设备,工作正常。希望这有所帮助。
或者,如果您将 SoundPool 初始化为STREAM_VOICE_CALL,则为:
SoundPool spool=新的声音池(1,AudioManager.STREAM_VOICE_CALL,0)
那么您的音频也应该以您上面提到的任何方式路由到扬声器。我试过了,即使没有默认FM,它也可以在手机上工作。
我想用插入式耳机通过扬声器播放音频文件。 但我得到了 IllegalStateException 有什么想法可以解决这个问题吗?
我在我的应用程序中为某些通知添加声音,就像这样: 播放通知声音时,即使将耳机插入手机,也会通过扬声器播放,因此扬声器和耳机都会播放该声音。 如果插上耳机,有没有办法只通过耳机播放声音?
问题的标题可能看起来重复,但我的问题有时是一个问题,会导致故障。当插入耳机时,我使用以下代码通过扬声器播放。 上面的代码以以下方式播放音频:1.很少时候,它可以完美播放。2.大多数时候,它在背景中播放循环声音。3.很少时候,它什么都不播放。 插入耳机时,系统声音播放似乎没有错误。例如-设置铃声正确播放相应的铃声,没有任何故障。请帮助我了解如何在插入耳机的情况下通过扬声器正确播放声音。
我正在寻找一种方法来播放Android设备扬声器中的音频,即使是在插入耳机的情况下。 事实上,典型的行为是,当插入耳机时,扬声器不会输出任何音频。然而,一些应用程序,例如默认的时钟应用程序(com.google.android.deskclock),即使插入耳机,也能够将音频路由到扬声器。 如何以编程方式获得此行为? 我正在寻找(至少)在Nexus 5设备上运行KitKat(Android 4.4
我试图让用户能够在我的应用程序中切换音频输出,我可以使用AVAudioSession在扬声器和背部之间切换,但我找不到在连接的蓝牙设备和耳机之间切换的方法,以任何顺序。 谢谢你的帮助。
在某些Android设备中尝试在听筒上播放音频文件时似乎存在问题。预期的行为是它应该在听筒中播放音频文件,但在某些设备中,如三星Galaxy Note 2(Android版本4.4.2)和Sony Xperia XA(Android版本6.0),它通过扬声器播放它们。 然而,在摩托罗拉moto g(Android版本6.0)和nexus 5X(Android版本7.0)等设备中,它工作正常。 该应