我只是在EE Stack附近磕磕绊绊,发现这篇文章:耳机插孔使用什么协议.它给我带来了一些好奇心,我想,如果iPhone可以做到这一点,我也想.
有没有人知道现在正在做的任何项目,或者是否有可能?
UPDATE
RIP
我正在尝试创建一个Web应用程序,其中它响应来自耳机按钮的事件.我知道head set的keyCode是79
.(我使用关键事件阅读器应用程序检查了它.)使用它时没有任何反应.有没有办法检测它?
是的,我知道Android已经实现了蓝牙耳机配置文件,但它是音频网关角色,而不是HeadSet角色.
我想要做的是在Android手机上开发一个应用程序,它将充当蓝牙耳机,因此它可以通过蓝牙连接到我的笔记本电脑.当我试着打电话给某人时,我可以用我的手机拨打他,我的应用程序会通过蓝牙将语音转发到我的笔记本电脑上,另外一台笔记本电脑上运行的应用程序将获取语音数据并将其转发给Skype或GTalk或者某些其他VoIP程序.
换句话说,如何在Android手机上实现耳机角色的耳机配置文件?提前致谢!
如何验证目前是否有任何蓝牙耳机连接到android?
喜欢:
如果有耳机连接,声音必须通过此耳机
但如果没有耳机,声音必须留在扬声器上
这必须在应用期间检查,因为如果耳机的电池熄灭,它必须向扬声器发回声音
解决方案/
public class BluetoothReceiver extends BroadcastReceiver {
private AudioManager localAudioManager;
private static final int STATE_DISCONNECTED = 0x00000000;
private static final String EXTRA_STATE = "android.bluetooth.headset.extra.STATE";
private static final String TAG = "BluetoothReceiver";
private static final String ACTION_BT_HEADSET_STATE_CHANGED = "android.bluetooth.headset.action.STATE_CHANGED";
private static final String ACTION_BT_HEADSET_FORCE_ON = "android.bluetooth.headset.action.FORCE_ON";
private static final String ACTION_BT_HEADSET_FORCE_OFF = "android.bluetooth.headset.action.FORCE_OFF";
@Override
public void onReceive(final Context context, final Intent intent) {
Log.i(TAG,"onReceive - BluetoothBroadcast");
localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
final String action = intent.getAction();
if …
Run Code Online (Sandbox Code Playgroud) 我创建了一个GitHub库与示例项目,显示了下面的问题我问这里:
https://github.com/paulpv/audio-loopback/tree/simplified/src/com/twistpair/wave/experimental/loopback
(请坚持使用"简化"分支并忽略"主"分支)
这两个主要文件是:
免责声明:我目前只使用一台运行CyanogenMod 10 Jelly Bean的三星Epic SPH-D700进行编码和测试.我没有在其他设备上试过这个,但也许这可能有助于阻止我拔掉头发并发疯.
我一直争取让Android的蓝牙SCO以可靠地启动和停止和捕获/回放音频几个月!
一旦我可以将手机转入SCO模式,通过AudioRecord和AudioTrack(分别)进行捕获和回放可以正常工作.
我遇到的问题是我无法可靠地将手机送入SCO模式!
使用startBluetoothSco()和setBluetoothScoOn(true)的"互联网"上的示例看起来都很简单直接,但是当我在我的设备上使用它们时,它们几乎永远无法可靠地工作.
我创建了自己的测试应用程序,除了启动和停止SCO之外什么都不做,我甚至无法让它可靠地工作!
我的代码监听BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED EXTRA_STATE==CONNECTED.
我可以可靠地检测何时连接或断开任何耳机.
当检测到连接时,我的处理程序立即调用startBluetoothSco().
A可能会发誓,至少有一次这已经踢到SCO_AUDIO_STATE
了C O
NNECTED,但99%的时间它只会导致过渡DISCONNECTED->CONNECTING->DISCONNECTED
.
这是我的GitHub示例应用程序的带注释日志输出:
10-03 17:00:13.970: I/dalvikvm(29487): Debugger is active
10-03 17:00:14.158: I/System.out(29487): Debugger has connected
10-03 17:00:15.779: I/System.out(29487): waiting for debugger to settle...
10-03 17:00:15.978: I/System.out(29487): debugger has settled (1325)
Run Code Online (Sandbox Code Playgroud)
我的应用程序开始关闭Jawbone耳机并更新UI ...
10-03 17:00:16.568: D/MainActivity(29487): updateScreen()...
10-03 17:00:16.572: D/AudioStateManager(29487): mAudioManager.isBluetoothScoOn()=false
Run Code Online (Sandbox Code Playgroud)
... UI更新完成
粘贴广播告诉我当前的SCO_AUDIO_STATE ...
10-03 17:00:16.689: D/AudioStateManager(29487): onReceive: intent=Intent …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android
应用程序,我希望它与headset
按钮点击进行交互.我正在使用Android KitKat 4.4在Nexus 5中测试它.
我首先尝试使用简单的耳机(不是无线耳机).收到的按钮事件是KEYCODE_HEADSETHOOK
(79).我创建了一个MEDIA_BUTTON
receiver
来处理它的点击:
<receiver android:name="com.example.mytest.SearchActivity$MediaButtonIntentReceiver">
<intent-filter>
<intent-filter android:priority="1000000000">
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这是持有接收者的活动:
public class SearchActivity extends Activity {
private AudioManager mAudioManager;
private ComponentName mAudioReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
mAudioReceiver = new ComponentName(getPackageName(),
MediaButtonIntentReceiver.class.getName());
}
@Override
protected void onResume() {
super.onResume();
mAudioManager.registerMediaButtonEventReceiver(mAudioReceiver);
}
@Override
protected void onPause() {
super.onPause();
mAudioManager.unregisterMediaButtonEventReceiver(mAudioReceiver);
}
public static class MediaButtonIntentReceiver …
Run Code Online (Sandbox Code Playgroud) 我试图使用插入式耳机的按钮(类似于压力的东西)在我自己的应用程序内触发不同的动作.然而我注意到无论我是否使用MPRemoteCommandCenter
或remoteControlReceivedWithEvent
委托,我都会收到明显滞后的事件.更糟糕的是,如果我尝试双按快按钮,我只会得到一个UIEventTypeRemoteControl
.
有没有人遇到类似的问题,知道这个的原因,甚至更好地了解一些解决方法?在ios8和ios9下测试.
当我在我的电脑上使用蓝牙时,我可以选择几种不同类型的设备来寻找.一种选择是"耳机".我想创建一个连接到另一台设备的应用程序,好像它只是一个耳机一样.因此音频和麦克风将从Android手机路由到另一台设备.这可能在蓝牙api中吗?如果是蓝牙聊天示例,那么最好从这样的事情开始?我能找到的大部分信息都与相反的情况有关(使用带有Android设备的实际耳机.)
"连续发生了多个重复键事件,或正在传递复杂字符串.如果键码不是{#link KEYCODE_UNKNOWN,则{#link getRepeatCount()方法返回给定键码应执行的次数否则,如果密钥代码是KEYCODE_UNKNOWN,那么这是getCharacters()返回的一系列字符."
但它没有说明如何实际生成该事件.
如何生成KeyEvent.ACTION_MULTIPLE(作为用户,使用耳机控件)?
我正在开发VoIP-Android-App.我想通过活动中的连接蓝牙耳机接受和拒绝来电.
到目前为止我尝试了什么:
使用媒体会话接收媒体按钮点击.
问题:如果我们启动BluetoothSCO,我们不会收到任何Media Button点击.如果我们不启动BluetoothSCO,我们会收到Media Button点击,但我们无法区分长按和短按,因为停机时间始终为0,键码始终为KEYCODE_MEDIA_PLAY,ACTION_DOWN后面紧跟ACTION_UP.只有通过蓝牙连接时才会出现这些问题.如果我们通过有线耳机连接,我们会获得相应的密钥代码(KEYCODE_HEADSETHOOK),停机时间不为0.
使用BroadcastReceiver监听蓝牙SCO连接的变化.
private val scoReceiver = object : BroadcastReceiver() {
fun onReceive(context: Context, intent: Intent) {
val state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1)
val previousState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, -1)
if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED && previousState == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
Log.e(TAG, "SCO Disconnected")
hangupCall()
}
}
}
protected fun onStart() {
super.onStart()
val intentFilter = IntentFilter()
intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)
registerReceiver(scoReceiver, intentFilter)
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法,我可以检测用户何时挂断电话,例如长按蓝牙耳机,因为这会触发SCO断开连接.
问题:我们无法检测用户是否想接听来电.
使用dispatchKeyEvent,onKeyDown和onKeyUp.
问题:他们从来没有被召唤过.
有没有人有任何建议或最佳实践如何正确处理蓝牙耳机?非常感谢任何帮助.提前致谢!
android headset android-bluetooth android-broadcastreceiver voip-android