Android模拟器 - 如何模拟耳机插入.
是否可以模拟插入耳机的动作?
基本上,我希望这个意图被解雇 - Intent.ACTION_HEADSET_PLUG.除了模拟插入的耳机之外,还有其他方法吗?
我知道如何检测耳机是否插入,但有些耳机(如三星EHS60ANNBE)来与暂停/播放(又名KeyEvent的.KEYCODE_HEADSETHOOK)按钮只,没有了上一页/下一页...
我希望能够检测当前插入Android设备的耳机是否具有PREV/NEXT(又名KeyEvent.KEYCODE_ MEDIA_PREVIOUS /KeyEvent.KEYCODE_ MEDIA_NEXT).
这可能吗?
我需要检查OS 2.0 - 2.3中当前连接的BT耳机(不仅仅是配对).在引入蓝牙耳机类的API版本11之前,此类功能不存在.但是在先前的API中已经存在一个名为BluetoothHeadset的类,但它不能公开访问.这是它的文档:http://www.kiwidoc.com/java/l/x/android/android/9/p/android.bluetooth/c/BluetoothHeadset.所以,我试图使用反射来调用"isConnected"方法,但我在反射时非常可怕,而且我收到了一个错误java.lang.IllegalArgumentException: object is not an instance of the class.
我得到了一个使用配对设备的列表BluetoothDevice.getBondedDevices(),我尝试isConnected()在每个设备上使用该方法.这是代码:
public boolean isBtDevConnected(BluetoothDevice btDev){
boolean connected = false;
try {
Class<?> BTHeadset = Class.forName("android.bluetooth.BluetoothHeadset");
Method isConnected = BTHeadset.getMethod("isConnected", new Class[] {BluetoothDevice.class});
connected = isConnected.invoke(BTHeadset, new Object[] {btDev});
}
}
} catch (Exception e) {
WriteToLog(e);
}
return connected;
}
Run Code Online (Sandbox Code Playgroud)
我在调用该方法的行上得到了异常,但我不确定我做错了什么.
我想检查是否插入了heaset ...我是这样做的
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
Log.i("am.isWiredHeadsetOn()", am.isWiredHeadsetOn()+"");
Run Code Online (Sandbox Code Playgroud)
但我总是得到虚假的价值......
为什么会这样?
我正在尝试检查是否有蓝牙耳机连接到设备
BluetoothAdapter mAdapter;
mAdapter = BluetoothAdapter.getDefaultAdapter();
Log.d("TAG","HEADSET: " + mAdapter.getProfileConnectionState(BluetoothProfile.HEADSET));
Log.d("TAG","HEALTH: " + mAdapter.getProfileConnectionState(BluetoothProfile.HEALTH));
Log.d("TAG","A2DP: " + mAdapter.getProfileConnectionState(BluetoothProfile.A2DP));
Run Code Online (Sandbox Code Playgroud)
这始终返回 HEADSET 2(已连接)、Health 0(已断开连接)和 A2DP 0(已断开连接)。我是否连接了蓝牙耳机并不重要,只有在禁用蓝牙时,耳机连接状态才为 0
我正在开发一个应用程序,我必须识别蓝牙耳机语音.我有很多麻烦,但仍然没有得到任何解决方案.
我正在关注此链接:
每次我从它那里得到假的mBluetoothAdapter.getProfileProxy(mContext,mHeadsetProfileListener,BluetoothProfile.HEADSET)
在startBluetooth11()方法中.
请帮忙.
我的应用程序已经进行了语音识别。一位用户告诉我它不适用于蓝牙耳机。大多数情况下,我能够通过蓝牙耳机进行语音识别(感谢另一位 Stack Overflow 贡献者,而不是官方 Android 文档)。
然而,有一个恼人的问题:当切换到使用蓝牙耳机时,它可能会在切换过程中短暂地消除音频输出。特别是,它有时可以省略通常提示用户进行语音识别的蜂鸣声。
我目前的解决方法是在蓝牙耳机连接到 SCO 音频通道后,在进行语音识别之前延迟一秒钟。
我的问题:有没有更可靠的方法来避免这种冲突?
static AudioManager sAudioManager;
static BluetoothHeadset sBluetoothHeadset;
static BluetoothDevice sBluetoothDevice;
static public void initBluetooth(Context pContext)
{
sAudioManager = (AudioManager) pContext.getSystemService(Context.AUDIO_SERVICE);
// Register to get notifications about Bluetooth profiles
sBluetoothAdapter.getProfileProxy(
pContext, new BluetoothProfileListener(), BluetoothProfile.HEADSET);
// Register to receive notification when the headset is dis/connected
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
pContext.registerReceiver(
new BluetoothHeadsetBroadcastReceiver(), intentFilter);
}
public static void startSpeechRecognition()
{
sAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
sAudioManager.startBluetoothSco();
sAudioManager.setBluetoothScoOn(true);
sBluetoothHeadset.startVoiceRecognition(sBluetoothDevice);
}
public static void stopSpeechRecognition()
{
sBluetoothHeadset.stopVoiceRecognition(sBluetoothDevice); …Run Code Online (Sandbox Code Playgroud) 所以我目前正在开发一个SIP拨号应用程序,我想知道如何更改蓝牙CarKit上显示的信息.我使用以下方法将音频路由到carkit:
AudioManager localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
localAudioManager.setMode(0);
localAudioManager.setBluetoothScoOn(true);
localAudioManager.startBluetoothSco();
localAudioManager.setMode(AudioManager.MODE_IN_CALL);
Run Code Online (Sandbox Code Playgroud)
我想知道:我如何在蓝牙设备上设置来电信息?我无法在任何地方找到这个.更清楚这是我在积极对话中看到的:
我还使用一个名为PortSIP的 SIP会话库.也许他们对展示什么有影响?我不知道.欢迎任何想法.我已经尝试过搜索AudioManager的选项,我能想象的唯一选择是为audioManager.setParameters()留下空间,但我找不到这个函数的可能键值参数.
更新:还尝试显示trackinfo等信息,但仍然没有成功.这是我试过的代码:
Intent intent = new Intent("com.android.music.metachanged");
intent.putExtra("track", "test");
intent.putExtra("artist", "atest");
intent.putExtra("album", "btest");
context.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud) 我已经构建了一个部署在 android google playstore 中的音频播放器。我正在使用 crashlytics 来监控崩溃和 ANR。最近我遇到了很多 MediaButtonReceiver 崩溃的情况。耳机的咔嗒声在许多设备上都能正常工作。但有些设备会出现这个问题。
Crashlytics 报告 -
Fatal Exception: java.lang.RuntimeException: Unable to start receiver android.support.v4.media.session.MediaButtonReceiver: java.lang.IllegalStateException: Could not find any Service that handles android.intent.action.MEDIA_BUTTON or implements a media browser service.
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2866)
at android.app.ActivityThread.access$1700(ActivityThread.java:182)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1551)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5706)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1033)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)
Run Code Online (Sandbox Code Playgroud)
媒体会话代码 -
private void initMediaSession() throws RemoteException {
if (mediaSessionManager != null) return; //mediaSessionManager exists
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE); …Run Code Online (Sandbox Code Playgroud) android audio-player headset android-mediaplayer android-mediasession
这个话题有时会弹出,但我不能让那个东西工作。我的应用程序曾经处理媒体按钮,但 Android 5.0 之后的 API 发生了变化,它需要调整此应用程序以“捕获”蓝牙按钮并以“我的方式”处理它们。
我做了很多搜索,发现:
final MediaSession session = new MediaSession(this, "spy tag");
session.setCallback(new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
Toast.makeText(me, "on media button event", Toast.LENGTH_SHORT);
Log.i("TAG", "GOT EVENT");
return super.onMediaButtonEvent(mediaButtonIntent);
}
});
session.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
PlaybackState state = new PlaybackState.Builder()
.setActions(
PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE |
PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PAUSE |
PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS)
.setState(PlaybackState.STATE_PLAYING, 0, 1)
.build();
session.setPlaybackState(state);
session.setActive(true);
Run Code Online (Sandbox Code Playgroud)
但是……还是不行。每当我按下任何媒体按钮时,我都会在 Logcat 中得到这个:
2019-06-16 19:40:14.458 2936-4422/? D/MediaSessionService:发送 KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MEDIA_NEXT, scanCode=0, metaState=0, flags=0x0, repeatCount=0, eventTime=0, …
android ×10
headset ×10
bluetooth ×6
audio ×1
audio-player ×1
emulation ×1
phone-call ×1
reflection ×1
sip ×1