无法使BroadcastReceiver工作 [英] Cannot get BroadcastReceiver working

查看:127
本文介绍了无法使BroadcastReceiver工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用我的三星耳机上的HEADSETHOOK按钮(键代码79),但无法使其正常工作。从本质上讲,我正在遵循中给出的答案这样的问题。我的手机是运行Android v8的Samsung Galaxy S7。



清单的相关部分是:

 < receiver android:name =。MainActivity $ HeadsetBtnReceiver android:enabled = true> 
<意图过滤器android:priority = 10000000>
< action android:name = android.intent.action.MEDIA_BUTTON />
< / intent-filter>
< / receiver>
< activity android:name =。MainActivity>
< intent-filter>
< action android:name = android.intent.action.MAIN />
< category android:name = android.intent.category.LAUNCHER />
< / intent-filter>
< / activity>

我的活动(包括BroadcastReceiver)是:

 公共类MainActivity扩展了AppCompatActivity {

静态AudioManager mAudioManager;
静态ComponentName mReceiverComponent;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
mReceiverComponent =新的ComponentName(this,HeadsetBtnReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);

}
@Override
public void onResume(){
super.onResume();
}

@Override
public void onPause(){
super.onPause();
}

@Override
public void onBackPressed(){
Log.e( Udp, Backpress MainActivity);
finish();
}

@Override
public void onDestroy(){
Log.e( UDP svc,销毁MainActivity);
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);
finish();
super.onDestroy();
}

公共静态类HeadsetBtnReceiver扩展了BroadcastReceiver {

//构造函数是必需的

public HeadsetBtnReceiver()
{
super();
}
@Override
public void onReceive(Context context,Intent intent){
String intentAction = intent.getAction();
Log.e( Udp svc,intentAction.toString()+发生了);
if(!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)){
Log.e( Udp svc,无媒体按钮信息);
的回报;
}
KeyEvent事件=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if(event == null){
Log.e( Udp svc, no keypress);
的回报;
}

KeyEvent键=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
Log.e( UDP svc, KeyEvent:);

if(key.getAction()== KeyEvent.ACTION_UP){
int keycode = key.getKeyCode();
if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT){
Log.e( Udp svc,下一步按下);
}否则if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS){
Log.e( Udp svc,上一个按下);
}否则if(keycode == KeyEvent.KEYCODE_HEADSETHOOK){
Log.e( Udp svc,按下Head Set Hook);
}
}
}
}

}



当我运行该应用程序时,没有收到Logcat消息,所有发生的事情是我同时获得了音量按钮和另一个按钮的默认操作。 / p>

我认为不建议使用BroadcastReceiver来支持MediaSession,但据我所知,它只能识别音量按钮。



我在做什么错了?

解决方案

将清单中的接收者移动到常规接收者对象中,您将进行注册在运行时。清单中声明的​​广播接收器不再可用于android O(适用少数例外)。


作为Android 8.0的一部分(API级别26)后台执行限制,面向API级别26或更高级别的
应用程序无法再为其清单中的隐式广播注册
广播接收者。


更多详细信息: https://developer.android。 com / about / versions / oreo / background#broadcasts


I want to use the HEADSETHOOK button (keycode 79) on my Samsung earphones but cannot get it to work. I am, essentially, following the answer given in this SO question. My phone is a Samsung Galaxy S7 running Android v8.

The relevant part of my manifest is:

    <receiver android:name=".MainActivity$HeadsetBtnReceiver" android:enabled="true" >
        <intent-filter android:priority="10000000" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

My Activity (which includes the BroadcastReceiver) is:

public class MainActivity extends AppCompatActivity {

static AudioManager mAudioManager;
static ComponentName mReceiverComponent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    mReceiverComponent = new ComponentName(this, HeadsetBtnReceiver.class);
    mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);

}
@Override
public void onResume() {
    super.onResume();
}

@Override
public void onPause() {
    super.onPause();
}

@Override
public void onBackPressed() {
    Log.e("Udp", "Backpress MainActivity");
    finish();
}

@Override
public void onDestroy() {
    Log.e("UDP svc", "Destroying MainActivity");
    mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);
    finish();
    super.onDestroy();
}

public static class HeadsetBtnReceiver extends BroadcastReceiver {

    // Constructor is mandatory

    public HeadsetBtnReceiver()
    {
        super ();
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        Log.e("Udp svc", intentAction.toString() + " happened");
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            Log.e("Udp svc", "no media button information");
            return;
        }
        KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (event == null) {
            Log.e("Udp svc", "no keypress");
            return;
        }

        KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        Log.e("UDP svc", "KeyEvent : ");

        if(key.getAction() == KeyEvent.ACTION_UP) {
            int keycode = key.getKeyCode();
            if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
                Log.e("Udp svc", "Next Pressed");
            } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
                Log.e("Udp svc", "Previous pressed");
            } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
                Log.e("Udp svc", "Head Set Hook pressed");
            }
        }
    }
}

}

When I run the app I get no Logcat messages, all that happens is that I get the default actions for both the volume buttons and the other, single, button.

I believe that the BroadcastReceiver has been deprecated in favour of MediaSession but as far as I can make out that only recognises the volume buttons.

What am I doing wrong?

解决方案

Move your receiver from manifest into a regular receiver object You will register at runtime. Broadcasts receivers declared in manifest no longer work from android O (few exceptions apply).

As part of the Android 8.0 (API level 26) Background Execution Limits, apps that target the API level 26 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest.

More details: https://developer.android.com/about/versions/oreo/background#broadcasts

这篇关于无法使BroadcastReceiver工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆