当前位置: 首页 > 知识库问答 >
问题:

Android,如何在插入耳机时将音频路由到扬声器?

戴瑞
2023-03-14

我正在寻找一种方法来播放Android设备扬声器中的音频,即使是在插入耳机的情况下。

事实上,典型的行为是,当插入耳机时,扬声器不会输出任何音频。然而,一些应用程序,例如默认的时钟应用程序(com.google.android.deskclock),即使插入耳机,也能够将音频路由到扬声器。

如何以编程方式获得此行为?

我正在寻找(至少)在Nexus 5设备上运行KitKat(Android 4.4)的解决方案

谢谢。

共有2个答案

公西光华
2023-03-14

删除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();
范轶
2023-03-14

也许看看这个应用程序的源代码会有所帮助。我发现一个类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在扬声器和背部之间切换,但我找不到在连接的蓝牙设备和耳机之间切换的方法,以任何顺序。 谢谢你的帮助。

  • 我在我的应用程序中为某些通知添加声音,就像这样: 播放通知声音时,即使将耳机插入手机,也会通过扬声器播放,因此扬声器和耳机都会播放该声音。 如果插上耳机,有没有办法只通过耳机播放声音?