在 Android 中注册耳机按钮,单击 BroadcastReceiver

2022-09-01 11:56:15

我有一个带单个按钮的耳机,当按下按钮时,我想做一个简单的吐司。

现在我有以下代码:

public class MediaButtonIntentReceiver extends BroadcastReceiver {

public MediaButtonIntentReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent intent) {
    String intentAction = intent.getAction();
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
        return;
    }
    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();
}
}

我的主要活动如下:

public class mainActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver();
    registerReceiver(r, filter); 

}
}

不过,当我按下按钮时,什么也没发生。

我很确定清单中的权限/ xml有问题。以下是到目前为止的接收器 XML:

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

....

和:

<uses-permission android:name="android.permission.BLUETOOTH" /> 

我注意到在LogCat中,当我按下按钮时,我收到来自“BluetoothIntentReceiver”的错误,说“onReceive()操作:android.intent.action.MEDIA_BUTTON”


答案 1

只是想回答我自己的问题,以防其他人遇到类似的问题。

代码确实有效,只是我没有看到Toast,因为我安装了另一个耳机按钮控制器应用程序(并在后台运行),所以我想它优先于我的。但是当我把

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON"
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver();
    filter.setPriority(1000); //this line sets receiver priority
    registerReceiver(r, filter);

即使安装了其他应用程序,它也能够正常工作。此外,您不需要上述和XML,其中一个或另一个可以作为注册意图接收器的方法。


答案 2

以下是我在Android 4.2.2中工作的内容

在我的清单中.xml我这样做:

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

注意:这不是调用registerReceiver

在我的主要活动中,我需要调用音频管理器:onCreate

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(
    new ComponentName(
         getPackageName(), 
         MediaButtonIntentReceiever.class.getName()));

我发现它可以在没有AudioManager调用的情况下工作,但不会持续太久!


推荐