我有一个应用程序,当在电话上使用时,它会显示一个免持话筒切换按钮。切换开关可在电话的耳机和免持话筒之间切换音频路由。然而,当应用程序在平板电脑(或任何没有耳机的设备)上运行时,我想取消切换,因为所有的音频都是通过免提电话发送的。
理想情况下,我希望使用某种isEarpiecePresent()
调用,或者可能检查某个配置对象上的标志来查找此信息,但我在应用程序接口中找不到任何此类信息。
我试图通过调用AudioManager.setSpeakerphoneOn(false)
,然后检查AudioManager.isSpeakerphoneOn()
来解决这个问题,希望它仍然返回true,然后我可以关闭它。即使音频仍通过扬声器传输,系统仍返回false
。
我目前正在考虑检查电话功能,尽管这并不完全适合。还有其他想法吗?
发布于 2012-09-20 16:22:33
正如您现在可能知道的,这不能使用当前的Android API来完成。
音频硬件接口是专有的,即由制造商为其硬件编写的,并且必须支持Android系统的某些调用,以使其与使用Android SDK开发的应用程序兼容。
即使您找到了一种方法来解决缺少对一种设备的API支持的问题,这可能并不是在所有设备上都有效。您的AudioManager.setSpeakerphoneOn(false)
示例可能非常适用于设备,因为这完全取决于音频硬件接口是如何编写的。我的假设是,如果没有耳机,大多数平板电脑都会对耳机和扬声器的音频路由进行同样的处理。
如果你想查看Nexus7的音频硬件接口代码,it's here
发布于 2022-02-11 09:02:33
从Android S/12 (API 31)开始,我们有了检查内置耳机状态的新方法。全面的复制-粘贴方法如下,在较旧的系统版本中,它使用@milosmns answer中的反射(谢谢!)
private static Boolean hasEarpiece = null;
public static boolean hasEarpiece(Context context) {
if (hasEarpiece != null) return hasEarpiece;
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (Build.VERSION.SDK_INT >= 31) {
List<AudioDeviceInfo> devices = audioManager.getAvailableCommunicationDevices();
for (AudioDeviceInfo device : devices) {
if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) {
hasEarpiece = true;
break;
}
}
if (hasEarpiece == null) {
// just for safety
AudioDeviceInfo currDevice = audioManager.getCommunicationDevice();
hasEarpiece = currDevice != null &&
currDevice.getType() == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE;
}
Log.i("EarpieceBuiltInChecker", "hasEarpiece detected:%s", hasEarpiece);
return hasEarpiece;
}
try {
Method method = AudioManager.class.getMethod("getDevicesForStream", Integer.TYPE);
Field field = AudioManager.class.getField("DEVICE_OUT_EARPIECE");
int earpieceFlag = field.getInt(null);
int bitmaskResult = (int) method.invoke(audioManager, AudioManager.STREAM_VOICE_CALL);
hasEarpiece = (bitmaskResult & earpieceFlag) == earpieceFlag;
Log.i("EarpieceBuiltInChecker", "hasEarpiece detected:" + hasEarpiece);
} catch (Throwable error) {
hasEarpiece = false;
Log.i("EarpieceBuiltInChecker", "hasEarpiece detection FAILED!");
}
return hasEarpiece;
}
我的流是AudioManager.STREAM_VOICE_CALL
类型(如果适用)
发布于 2012-09-20 18:39:37
public boolean isEarPieceConnected() {
AudioManager audio = (AudioManager) this
.getSystemService(Context.AUDIO_SERVICE);
if (audio.isWiredHeadsetOn()) {
Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
return true;
} else {
Toast.makeText(this, "Not Connected", Toast.LENGTH_SHORT).show();
return false;
}
}
您还可以检查audio.isSpeakerphoneOn()
如果我把你的问题解决了,我希望这能行得通。
https://stackoverflow.com/questions/6943068
复制相似问题