我正在开发一款应用程序,我们只需将耳机插孔用作按钮。
要求:连接耳机时通过耳机播放默认音频(通话)(无需通过耳机播放音频)
有许多通过扬声器和耳机以及蓝牙耳机路由音频的示例,但如果连接耳机,则无需通过设备的耳机扬声器传送音频。 我已经尝试了很多,有些链接是
Android : Force audio routing(在我的方案中不起作用)
我检查过SoundAbout(https://play.google.com/store/apps/details?id=com.woodslink.android.wiredheadphoneroutingfix&hl=en) 应用程序,它将音频路由到各种端口,如耳机,扬声器和耳机。
如果连接了耳机,我的扬声器音频: 这是我的代码
if (Build.VERSION.SDK_INT >= 21) {
ForegroundService.audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
ForegroundService.audioManager.setSpeakerphoneOn(true);
SplashScreen.preferences.edit().putBoolean("isKey", true).commit();
} else {
Class audioSystemClass = null;
try {
audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
SplashScreen.preferences.edit().putBoolean("isKey", true).commit();
ForegroundService.audioManager.setSpeakerphoneOn(true);
}
答案 0 :(得分:3)
耳机从不用于Android中的媒体,只有在手机处于“通话”或“通讯”(VoIP)状态时才能使用。
我猜您注意到没有“FORCE_EARPIECE”常量,因此无法在调用setForceUse
时指定。
此外,耳机在呼叫的输出设备选择中具有最低优先级,因此如果手机连接了任何(并且在您的情况下有假耳机),则该设备将是选中(见https://android.googlesource.com/platform/frameworks/av/+/322b4d2/services/audiopolicy/enginedefault/src/Engine.cpp#381)。
很抱歉,似乎无法实现您的目标。
<强>更新强>
在SoundAbout强制使用媒体耳机时检查media.audio_policy
状态后,我发现了此应用使用的以下技巧:
它调用AudioSystem.setPhoneState(MODE_IN_COMMUNICATION)
来强制执行“通信”电话状态(通常用于VoIP呼叫)。
如果连接了耳机(或耳机),为了防止由于更高的优先级将声音路由到它,应用程序会呼叫AudioSystem.setDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET, DEVICE_STATE_UNAVAILABLE, ...)
以诱使音频管理器认为没有耳机。
这些都是黑客攻击,需要应用程序密切监视手机状态。它也不会一直有效。
另一个缺点是使用耳机禁用片上音频解压缩,因此电池使用率更高。
一般情况下,我不建议使用这些技术。