3

元のサムスンのヘッドセット ボタンを強く押すことを (BroadcastReciever 経由で) 検出しようとしています。

コードは簡単です:

public class MediaButtonIntentReceiver extends BroadcastReceiver {

public MediaButtonIntentReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent intent) {
    String intentAction = intent.getAction();
    Toast.makeText(context, "Action: "+intentAction, Toast.LENGTH_SHORT).show(); 
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
        return;
    }
    Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); 
    KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    if (event == null) {
        return;
    }
    int action = event.getAction();
    if (action == KeyEvent.ACTION_DOWN) {
    // do something
        Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); 
    }
    abortBroadcast();
}

マニフェスト:

 <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name=".MediaButtonIntentReceiver" >
        <intent-filter android:priority="100000000000000" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
</application>

Galaxy s1(2つのルート化されたデバイス、何も起こらなかった)とgalaxy NOTE(メディアが開始/停止され、ボリュームがそれに応じて変更されましたが、コードから何も起こらなかった..)でテストしました.HTCではすべて正常に動作しました. 何度か変更したので、優先順位の問題ではないことは 99% 確信しています。

誰かがそこで何が起こっているのか知っていれば幸いです。ありがとう。ウディ

4

2 に答える 2

2

イベントを受信するには、AudioManagerでregisterMediaButtonEventReceiverを呼び出す必要もあります。その状態は、他の何かが registerMediaButtonEventReceiver() を呼び出すか、 unregisterMediaButtonEventReceiver ()を呼び出すまで保持されます。

たとえば、次のようなアクティビティです。

public class MediaButtonActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                                                                                                   this,
                                                                                                   MediaButtonIntentReceiver.class));
    }
}

マニフェストに登録された MediaButtonIntentReceiver が ACTION_MEDIA_BUTTON イベントを取得できるようにします。

于 2014-05-06T08:02:04.553 に答える