Search code examples
androidbroadcastreceiver

Broadcast Receiver doesn't work if registered in AndroidManifest


I have broadcast receiver that should get currently playing song info. It works fine if I register it in activity, but it doesn't work if I register it in manifest file.

How I register receiver in AndroidManifest:

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

    <receiver
        android:name=".SongReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="com.android.music.playstatechanged" />
            <action android:name="com.android.music.metachanged" />
        </intent-filter>
    </receiver>
</application>

My BroadcastReceiver:

class SongReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

    val action = intent.action
    val cmd = intent.getStringExtra("command")
    Log.d("mIntentReceiver", "$action / $cmd")
    val artist = intent.getStringExtra("artist")
    val track = intent.getStringExtra("track")
    Toast.makeText(context, "$artist - $track", Toast.LENGTH_LONG).show()

}
}

I've tried using full package name like this, but it didn't help:

    <receiver
        android:name="com.fullpackage.SongReceiver"
        ...
    </receiver>

Solution

  • In Android Oreo, an app cannot use anymore broadcast receiver in the manifest unless the intent is listed in whitelist, see doc