在我的应用程序中,有一个读卡器使用设备的音频插孔。现在,我的问题是我想在设备的HeadPhone插孔中读卡器完好时从内置扬声器发出声音。
以下是我尝试的代码:
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应用程序的设备中运行。但我希望在所有设备中都具有此功能。
请分享您的经验!!
答案 0 :(得分:0)
您的第二种方法setMode适用于具有默认Fm播放器的手机。
但是对于没有默认FM的设备,我尝试了以下代码:
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioManager.setSpeakerphoneOn(true);
此代码适用于没有默认Fm播放器的手机。我使用带有Oxygen OS的OnePlus设备并且工作正常。希望这会有所帮助。
答案 1 :(得分:0)
或者,如果您将SoundPool初始化为STREAM_VOICE_CALL,则为:
SoundPool spool = new SoundPool(1,AudioManager.STREAM_VOICE_CALL, 0)
然后您的音频也应该以您上面提到的方式路由到扬声器。即使没有默认FM,我也尝试过在手机上工作。
答案 2 :(得分:0)
在这里,我发起了一个SoundPool并加了一声哔哔声。
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);