我正在寻找一种方法来播放Android设备扬声器中的音频,即使是在插入耳机的情况下。
事实上,典型的行为是,当插入耳机时,扬声器不会输出任何音频。然而,一些应用程序,例如默认的时钟应用程序(com.google.android.deskclock),即使插入耳机,也能够将音频路由到扬声器。
如何以编程方式获得此行为?
我正在寻找(至少)在Nexus 5设备上运行KitKat(Android 4.4)的解决方案
谢谢。
删除Android 4.4不需要的代码
//context = a valid context
AudioManager am = (AudioManager) context.getSystemService(context.AUDIO_SERVICE);
MediaPlayer mp = new MediaPlayer();
Uri loc = Uri.parse("android.resource://com.example.test/" + R.raw.music);
try {
mp.setDataSource(context, loc);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
mp.prepare();
} catch (IllegalArgumentException | SecurityException| IllegalStateException | IOException e) {
e.printStackTrace();
}
am.requestAudioFocus(null, AudioManager.STREAM_ALARM,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
mp.start();
也许看看这个应用程序的源代码会有所帮助。我发现一个类asynchringtoneplayer(https://Android . Google source . com/platform/packages/apps/desk clock//master/src/com/Android/desk clock/asynchringtoneplayer . Java)可能可以完成这项工作。
我想,诀窍是使用不同的Audiostream。让我们看一下start警报方法:
private void startAlarm(MediaPlayer player) throws IOException {
// do not play alarms if stream volume is 0 (typically because ringer mode is silent).
if (mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
if (Utils.isLOrLater()) {
player.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
}
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.setLooping(true);
player.prepare();
mAudioManager.requestAudioFocus(null, AudioManager.STREAM_ALARM,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
player.start();
}
}
播放器对象的音频流类型将被设置为AudioManager。流_报警。我想这可能是解决办法。我没有测试它,但这是我在源代码中发现的第一件事。
还请注意Android清单中列出的一些所需权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<!-- WRITE_SETTINGS is required to record the upcoming alarm prior to L -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- READ_PHONE_STATE is required to determine when a phone call exists prior to M -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- READ_EXTERNAL_STORAGE is required to play custom ringtones from the SD card prior to M -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
(https://android.googlesource.com/platform/packages/apps/DeskClock/ /master/AndroidManifest.xml)
在我的应用程序中,有一个使用设备音频插孔的读卡器。现在,我的问题是,当读卡器在设备的耳机插孔中完好无损时,我想从内置扬声器中发出声音。 以下是我尝试过的代码: 1) 使用反射方法 2)使用setMode方法 但这两种代码仅在具有默认FM应用程序的设备中运行。但我想在所有设备中都具有此功能。 请分享你的经验!!
我正在开发一个应用程序,我们只需要将耳机插孔用作按钮。 要求:连接耳机时通过听筒播放默认音频(通话)(无需通过耳机收听音频) 有许多通过扬声器和耳机以及蓝牙耳机路由音频的示例,但没有任何关于通过连接耳机的设备的耳式扬声器路由音频的内容。我已经尝试了很多,有些链接是 Android:强制音频路由(在我的场景中不起作用) 我查过sound about(https://play . Google . c
问题的标题可能看起来重复,但我的问题有时是一个问题,会导致故障。当插入耳机时,我使用以下代码通过扬声器播放。 上面的代码以以下方式播放音频:1.很少时候,它可以完美播放。2.大多数时候,它在背景中播放循环声音。3.很少时候,它什么都不播放。 插入耳机时,系统声音播放似乎没有错误。例如-设置铃声正确播放相应的铃声,没有任何故障。请帮助我了解如何在插入耳机的情况下通过扬声器正确播放声音。
我想用插入式耳机通过扬声器播放音频文件。 但我得到了 IllegalStateException 有什么想法可以解决这个问题吗?
我试图让用户能够在我的应用程序中切换音频输出,我可以使用AVAudioSession在扬声器和背部之间切换,但我找不到在连接的蓝牙设备和耳机之间切换的方法,以任何顺序。 谢谢你的帮助。
我在我的应用程序中为某些通知添加声音,就像这样: 播放通知声音时,即使将耳机插入手机,也会通过扬声器播放,因此扬声器和耳机都会播放该声音。 如果插上耳机,有没有办法只通过耳机播放声音?