4

私は Android 2.1 で作業しており、ヘッドセットが差し込まれている/取り出されていることを検出したいと考えています。私はアンドロイドにかなり慣れていません。

それを行う方法は、ブロードキャストレシーバーを使用することだと思います。これをサブクラス化し、AndroidManifest.xml に次のコードも追加しました。しかし、アクティビティのように、受信者を別の場所に登録する必要がありますか? これにはたくさんのスレッドがあることは承知していますが、彼らが何について話しているのかよくわかりません。また、AndroidManifest.xml に登録することと、アクティビティに動的に登録することの違いは何ですか?

<receiver android:enabled="true" android:name="AudioJackReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.HEADSET_PLUG" >
            </action>
        </intent-filter>
    </receiver>

そして、これがクラスの実装(およびインポート)でした

public class AudioJackReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.w("DEBUG", "headset state received");
}

}

動作するかどうかを確認しようとしましたが、アプリケーションの実行中にヘッドセットを抜き差ししても何も表示されません。

編集:ドキュメントにはこれは記載されていませんが、マニフェストに登録されている場合、これが機能しない可能性はありますか? アプリケーションの 1 つに受信者を登録すると、応答することができました (または、とにかくそれを行う必要がありますか?)。

4

3 に答える 3

11

グレッグの答えを補足するだけで、2つの部分に分割する必要があるコードは次のとおりです

  1. Service を最初のアクティビティ (ここでは と呼びますMainActivity.java) に登録します。

  2. ACTION_HEADSET_PLUGアクションの結果を に切り替えますBroadCastReceiver

ここに行きます:

public class MainActivity extends Activity  {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myReceiver = new MusicIntentReceiver();
}

@Override public void onResume() {
    IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(myReceiver, filter);
    super.onResume();
}

private class MusicIntentReceiver extends BroadcastReceiver {
    @Override public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            int state = intent.getIntExtra("state", -1);
            switch (state) {
            case 0:
                Log.d(TAG, "Headset is unplugged");
                break;
            case 1:
                Log.d(TAG, "Headset is plugged");
                break;
            default:
                Log.d(TAG, "I have no idea what the headset state is");
            }
        }
    }
}
于 2013-08-01T15:20:59.377 に答える
2

より詳細に説明するのに役立つ 2 つのサイトを次に示します。

意図を定義する必要があります。そうしないと、システム関数にアクセスできません。放送受信機。リッスンしたい変更をアプリケーションに警告します。

すべてのレシーバーをサブクラス化する必要があります。を含める必要がありますonReceive()。を実装するには、 ContextIntentonReceive()の 2 つの項目を含むメソッドを作成する必要があります。

おそらくサービスは理想的です。ただし、サービスを作成し、それを通じてコン​​テキストを定義します。文脈で; あなたの意図を定義します。

例:

context.startService
      (new Intent(context, YourService.class));

非常に基本的な例。でも; 特定の目標は、システム全体のブロードキャストを利用することです。アプリケーションに を通知する必要がありますIntent.ACTION_HEADSET_PLUG

マニフェストを介してサブスクライブする方法:

<receiver
    android:name="AudioJackReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>

または、アプリケーションを通じて単純に定義することもできます。しかし。あなたの特定の要求; Bluetooth を検出する場合は、ユーザー権限が必要ですMODIFY_AUDIO_SETTINGS

于 2012-11-12T19:42:35.870 に答える
-1

ブロードキャスト レシーバーを有効にしてexported、属性をtrue次のように設定する必要があります。

<receiver
    android:name="AudioJackReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>
于 2012-11-11T00:34:07.503 に答える