如何强制Android系统选择3.5mm插孔作为我的麦克风源?我正在使用AudioRecord类进行录制.
我正在使用外置麦克风.当检测到一切正常时,但有时无法自动检测外部麦克风.TRRS分配器(便宜3美元的东西)用于将3.5毫米插孔分成单独的麦克风和耳机插孔(我需要同时录制和播放).
不推荐使用AudioManager.setWiredHeadsetOn(),并且说明不要使用它.
1)我是否需要额外的外部硬件来提供正确的麦克风阻抗?
2)我可以强制输入代码吗?
3)这个级别的自定义ROM归档音频控制 - 也许这是最好的选择吗?
谢谢
有没有办法检测耳机的播放/暂停按钮点击?
我设法使用以下方法检测音量按钮点击:
AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume , audioVolumeChangeListenerCallback, self );
Run Code Online (Sandbox Code Playgroud)
但我找不到中心按钮的AudioSessionProperty.这样做的方法是什么?
我想让我的Android设备作为蓝牙耳机工作.我搜索Android API,但我发现一些界面可以让Android设备作为主设备工作,而不是作为设备(蓝牙耳机).我也准备修改Android操作系统的源代码,并重建操作系统.我希望,当Android设备连接到带蓝牙的手机时,Android设备可以作为蓝牙耳机使用.我不知道是否有接口可以做到这一点,还是我应该修改Android操作系统?谢谢!
我正在使用ACTION_MEDIA_BUTTON处理程序执行一个应用程序,但它似乎总是被MX Player或Apollo截获,我没有得到Intent
我已尝试在标记中设置1000和2147483647优先级,并在构造函数后直接使用setPriority
当没有MX Player或Apollo时,应用程序可以正常运行
我也试过使用谷歌播放的Headset拦截器应用程序,我试图通过自动启动应用程序拒绝事件到MX Player - 没什么帮助
in onCreate:
IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
filter.addAction(Intent.ACTION_HEADSET_PLUG);
filter.setPriority(1000);
registerReceiver(receiver, filter);
Run Code Online (Sandbox Code Playgroud)
在接收者
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
// NEVER REACHES HERE WHEN MX PLAYER PRESENT. WORKS IF NOT
Run Code Online (Sandbox Code Playgroud)
在清单中
<receiver
android:name="BCreceiver"
android:enabled="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_BUTTON" />
<action android:name="android.intent.action.HEADSET_PLUG" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud) 我正在尝试从耳机或汽车控制(播放/暂停/等)接收媒体按钮事件
这是我的应用清单.
<service android:name=".mediaPlayerService.MediaPlayerService"
android:exported="true">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<!--
A receiver that will receive media buttons and send as
intents to your MediaBrowserServiceCompat implementation.
Required on pre-Lollipop. More information at
http://developer.android.com/reference/android/support/v4/media/session/MediaButtonReceiver.html
-->
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这是我的MediaPlayerService的一部分
public class MediaPlayerService extends MediaBrowserServiceCompat {
@Override
public void onCreate()
{
super.onCreate();
initMediaSessions();
}
private void initMediaSessions()
{
mSession = new MediaSessionCompat(getApplicationContext(), MediaPlayerService.class.getSimpleName());
setSessionToken(mSession.getSessionToken());
mSession.setCallback(new MediaSessionCompat.Callback()
{
//callback code is here.
}
);
}
@Override
public int onStartCommand(Intent …Run Code Online (Sandbox Code Playgroud) 这是我努力制作一个工作代码来处理耳机按钮事件的最佳方式.我阅读了Android开发人员指南,但这显然是错误的,因为他们要求开始监听注册类名.
am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Wrong
Run Code Online (Sandbox Code Playgroud)
所以我查看其他示例以更正代码.例如,在这个问题中已经发布了许多秘密建议,我还尝试了其他代码,例如这个,以及MediaSession的另一个解决方案,并清理不需要的我写了这段代码:
我实现了RemoteControlReceiver类.显然,不需要静态内部类,事实上,请看这条评论:
public class RemoteControlReceiver extends BroadcastReceiver {
public RemoteControlReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在MainActivity onCreate(){ ...中注册了意图
AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
ComponentName mReceiverComponent = new ComponentName(this, RemoteControlReceiver.class);
am.registerMediaButtonEventReceiver(mReceiverComponent);
Run Code Online (Sandbox Code Playgroud)
registerMediaButtonEventReceiver被弃用了......
在清单中我记录了过滤器,在活动标记之后:
<activity>
... …Run Code Online (Sandbox Code Playgroud) 我有一个蓝牙耳机.将其连接到Windows 10时,它会在"播放设备"列表中安装两个配置文件:
免提.(HSP简介)
立体声.(A2DP简介)
第二个(立体声)设置为系统上的"默认设备"和"默认通信设备".
当我启动任何使用麦克风的程序(录音机,聊天,VoIP呼叫,游戏等)时声音突然停止工作我只能使用麦克风直到我停止录音机或通话.
为了再次启用声音,我需要使Hand-Free(HSP)配置文件处理输入和输出(声音和麦克风).不幸的是,HSP的音质非常差.
我想知道如果有方法,使用代码,我可以改变蓝牙行为,以便两个配置文件同时工作.一个处理声音,一个处理麦克风,所以我可以有高品质的声音,同时使用麦克风.
如果我的Android手机已经连接了蓝牙耳机(配对并连接).我如何获得有关该特定耳机的信息.
使用getBondedDevices()方法我获得所有配对设备的列表.我只需要有关CONNECTED设备的信息.
我不能等待广播接收器检查状态,因为我在申请开始时需要这些信息.所以请建议有没有办法获得这些信息,而无需等待广播.
我正在尝试使用该android.net.rtp库来制作VoIP应用程序.它的音频流可以正确发送和接收.
我的问题是:被叫方手机的扬声器工作正常,但耳机始终静音(即使我关闭扬声器).
我的代码:
AudioManager Audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
Audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
Audio.setSpeakerphoneOn(true);
Audio.setMicrophoneMute(false);
sender = new RtpStreamSender(null, "169.0.199.19", AudioCodec.PCMU);
Run Code Online (Sandbox Code Playgroud) 我使用以下组件创建了一个简单的蓝牙设备
我想知道是否可以从我的 BT 设备发送命令,就像这些命令是从蓝牙耳机发送的一样?
我的意思是:
以下是 android 使用的键码的完整列表:http://developer.android.com/reference/android/view/KeyEvent.html
我可能可以创建一个单独的应用程序,它将读取传入的命令并模拟耳机按钮的按下,但这不是我想要的。就我而言 - 一些耳机是即插即用的,这意味着 Android 设备上不需要安装任何其他应用程序。这是我目前用来向 Android 手机发送命令的代码:
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX | TX
enum { LED_PIN = 6 };
enum LedState { LED_ON, LED_OFF, LED_BLINK };
LedState led_state;
void setup()
{
led_state = LED_OFF;
pinMode(LED_PIN, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
Serial.begin(9600);
Serial.println("Enter AT commands:");
BTSerial.begin(38400); // HC-05 default speed in AT command …Run Code Online (Sandbox Code Playgroud)