注册耳机按钮单击Android中的BroadcastReceiver

JDS*_*JDS 29 java android

我有一个带单键的耳机,按下按钮时想要做一个简单的Toast.

现在我有以下代码:

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();
}
}
Run Code Online (Sandbox Code Playgroud)

我的主要活动如下:

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

}
}
Run Code Online (Sandbox Code Playgroud)

虽然我按下按钮但没有任何反应.

我很清楚清单中的权限/ xml有问题.到目前为止,这是接收器XML:

    <receiver android:name=".MediaButtonIntentReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

....

和:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
Run Code Online (Sandbox Code Playgroud)

我注意到在LogCat中,当我按下按钮时,我从"BluetoothIntentReceiver"收到错误,说"onReceive()动作:android.intent.action.MEDIA_BUTTON"

JDS*_*JDS 32

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

代码确实有效,只是我没有看到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);
Run Code Online (Sandbox Code Playgroud)

它甚至能够安装其他应用程序.此外,您不需要上述和XML,一个或另一个可以作为注册意图接收器的方法.

  • 正确,我很长一段时间没有重新访问这个应用程序.但它不适用于较新的Android版本; 最初的开发是在2.2的时候完成的!编辑 - 我相信谷歌已经添加了一个API,以更容易的方式获取这些耳机按钮点击输入.尝试四处寻找. (3认同)

noe*_*cus 5

以下是我在Android 4.2.2中使用的内容

在我的manifest.xml中,我这样做:

<receiver android:name=".MediaButtonIntentReceiver">
<intent-filter>
    <action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

注意:这不是打电话registerReceiver.

在我的主要活动中,onCreate我需要调用AudioManager:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(
    new ComponentName(
         getPackageName(), 
         MediaButtonIntentReceiever.class.getName()));
Run Code Online (Sandbox Code Playgroud)

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