【问题标题】:How to get info of currently playing music using broadcastreceiver while the app isn't running?如何在应用程序未运行时使用广播接收器获取当前播放音乐的信息?
【发布时间】:2015-04-14 19:09:45
【问题描述】:

我想在应用处于后台时接收来自音乐播放器的广播。

我找到了以下代码here:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    IntentFilter iF = new IntentFilter();
    iF.addAction("com.android.music.metachanged");
    iF.addAction("com.android.music.playstatechanged");
    iF.addAction("com.android.music.playbackcomplete");
    iF.addAction("com.android.music.queuechanged");

    registerReceiver(mReceiver, iF);
}

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String cmd = intent.getStringExtra("command");
        Log.v("tag ", action + " / " + cmd);
        String artist = intent.getStringExtra("artist");
        String album = intent.getStringExtra("album");
        String track = intent.getStringExtra("track");
        Log.v("tag", artist + ":" + album + ":" + track);
        Toast.makeText(CurrentMusicTrackInfoActivity.this, track, Toast.LENGTH_SHORT).show();
    }
};

它有效,但仅在活动运行时。所以我尝试制作一个静态广播接收器:

<receiver
    android:name=".receiver.MusicBroadcastReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="com.android.music.metachanged" />
        <action android:name="com.android.music.playstatechanged" />
        <action android:name="com.android.music.playbackcomplete" />
        <action android:name="com.android.music.queuechanged" />
    </intent-filter>
</receiver>

班级:

public class MusicBroadcastReceiver extends BroadcastReceiver {
    public MusicBroadcastReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String cmd = intent.getStringExtra("command");
        Log.v("tag ", action + " / " + cmd);
        String artist = intent.getStringExtra("artist");
        String album = intent.getStringExtra("album");
        String track = intent.getStringExtra("track");
        Log.v("tag", artist + ":" + album + ":" + track);
        Toast.makeText(context, track, Toast.LENGTH_SHORT).show();
    }
}

而且它不起作用。 我开始搜索,发现this question,它声称上面的代码应该可以工作。但事实并非如此,当我开始播放音乐或跳过曲目时,不会调用 onReceive。我一定是做错了什么,但我不知道是什么。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 快速提问,使用您当前的代码,如果您打开应用程序,转到后台并更改音乐,onRecieve 是否有效?
  • 您可以尝试使用 android:name 属性的完整路径名
  • 哪一个?我没有尝试过动态的,因为我认为它会在活动被破坏的那一刻被破坏。静态的不行。我尝试使用完整路径,但没有任何区别。

标签: android broadcastreceiver


【解决方案1】:

尝试设置android:exported="true"

http://developer.android.com/guide/topics/manifest/receiver-element.html

android:exported
广播接收器是否可以从其应用程序之外的源接收消息 - 如果可以,则为“true”,否则为“false”。如果为“false”,则广播接收器只能接收由同一应用程序的组件或具有相同用户 ID 的应用程序发送的消息。

【讨论】:

  • 虽然我确实收到了 Lint 警告。我会调查的。
  • 好吧,它现在可以工作了...当它设置为 true 时,我一定是做错了什么。
  • 即使我将 android:exported 设置为 true,它仍然无法正常工作。请帮助我@Mattia Maestrini
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多