web-dev-qa-db-ja.com

ヘッドセットがAndroidデバイスに接続されているかどうかを検出します。

ヘッドセットがAndroidデバイスに接続されているかどうかを確認するにはどうすればよいですか?

28
Coder_sLaY

「ヘッドセット」と言うとき、「有線ヘッドセット」という意味ですか?もしそうなら、プラグインされているかどうかを検出する意図があります:_ACTION_HEADSET_PLUG_。

ステータスを確認するには、AudioManager.isWiredHeadsetOn()を使用できますが、Bluetoothヘッドセットもある場合はfalseを返し、代わりに音声がルーティングされます。

29
EboMike

放送受信機を使用できます。

そのため、「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」を設定します。したがって、「AndroidManifest」の代わりにActivityまたはServiceクラスで以下のようなコードを記述する必要があります。

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 );


}

この記事がお役に立てば幸いです。さようなら!

これは「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);
    }
}
45
cmcromance

AudioManager.isWiredHeadsetOn()は常にfalseを返します。ユーザー許可が必要なためですMODIFY_AUDIO_SETTINGS

答えを見つけながら数日を過ごしました。公式文書にはこれに関する情報はありません。そして、このbugはすでにBugTrackerに登録されています。

15
user1777060
4
Ravi Vyas