Как определить, подключена ли гарнитура к устройству Android или нет?
Обнаружение подключения минигарнитуры к устройству Android или нет.
Ответ 1
Когда вы говорите "гарнитура", вы имеете в виду "проводную гарнитуру"? Если это так, есть намерение определить, подключен или отключен один из них: ACTION_HEADSET_PLUG
.
Чтобы проверить статус, вы можете использовать AudioManager.isWiredHeadsetOn()
, хотя это может вернуть значение false, если есть также Bluetooth-гарнитура, и вместо этого звук направляется на него.
Ответ 2
Вы можете использовать широковещательный приемник.
Итак, вы можете написать этот код в "AndroidManifest.xml"
<receiver android:name="com.juno.brheadset.HeadsetStateReceiver">
<intent-filter>
<action android:name="android.intent.action.HEADSET_PLUG"/>
</intent-filter>
</receiver>-->
Но это не работает. Когда OS отправляет это намерение "HEADSET_PLUG", OS устанавливает флаг "Intent.FLAG_RECEIVER_REGISTERED_ONLY". Итак, вы должны написать код, как показано ниже, в классе Activity или Service вместо "AndroidManifest".
public class BRHeadsetActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
HeadsetStateReceiver receiver = new HeadsetStateReceiver();
registerReceiver( receiver, receiverFilter );
}
Я надеюсь, что эта статья поможет вам. Bye!
Это часть "HeadsetObserver.java", Android SDK Source.
private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) {
if ((headsetState & headset) != (prevHeadsetState & headset)) {
// Pack up the values and broadcast them to everyone
Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
**intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);**
int state = 0;
int microphone = 0;
if ((headset & HEADSETS_WITH_MIC) != 0) {
microphone = 1;
}
if ((headsetState & headset) != 0) {
state = 1;
}
intent.putExtra("state", state);
intent.putExtra("name", headsetName);
intent.putExtra("microphone", microphone);
if (LOG) Slog.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone);
// TODO: Should we require a permission?
ActivityManagerNative.broadcastStickyIntent(intent, null);
}
}
Ответ 3
AudioManager.isWiredHeadsetOn()
всегда возвращает false
, потому что для этого требуется разрешение пользователя MODIFY_AUDIO_SETTINGS
.
Я провел несколько дней, пока нашел ответ. Об этом в официальной документации нет. И этот bug
уже зарегистрирован в BugTracker
.
Ответ 4
Это должно помочь вам: http://developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG
Ответ 5
Сначала создайте приемник в своем манифесте:
<receiver android:name="com.yourapplication.BroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.HEADSET_PLUG"/>
</intent-filter>
</receiver>
не забудьте изменить приложение com.yourapplication в соответствии с названием вашего проекта
Создайте две переменные в заголовке своей деятельности:
private BroadcastReceiver mReceiver ;
boolean Microphone_Plugged_in = false;
Определите свой получатель внутри onCreate вашей деятельности:
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
int iii=2;
if (Intent.ACTION_HEADSET_PLUG.equals(action)) {
iii=intent.getIntExtra("state", -1);
if(Integer.valueOf(iii)==0){
Microphone_Plugged_in = false;
Toast.makeText(getApplicationContext(),"microphone not plugged in",Toast.LENGTH_LONG).show();
}if(Integer.valueOf(iii)==1){
Microphone_Plugged_in = true;
Toast.makeText(getApplicationContext(),"microphone plugged in",Toast.LENGTH_LONG).show();
}
}
}};
IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
registerReceiver( mReceiver, receiverFilter );
добавить onResume и onStope:
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
getApplicationContext().registerReceiver(mReceiver, filter);
}
@Override
protected void onStop() {
super.onStop();
getApplicationContext().unregisterReceiver(mReceiver);
}