如何接收外部应用程序的广播元数据?

Posted

技术标签:

【中文标题】如何接收外部应用程序的广播元数据?【英文标题】:How do I receive an external app's broadcast metadata? 【发布时间】:2015-11-07 00:47:07 【问题描述】:

我正在尝试向我的应用程序添加一项功能,该功能从 Spotify 接收广播数据/意图操作并使用该数据执行某些操作。但是,我不确定如何进行。在之前的问题的帮助下,我已经能够拼凑出以下代码,但是这些问题并未详细介绍如何实际启动数据接收。我有一个广播接收器:

<receiver
    android:name=".Receiver"
    android:enabled="true"
    android:exported="true">

    <intent-filter>
        <action android:name="com.spotify.music.playbackstatechanged"/>
        <action android:name="com.spotify.music.metadatachanged"/>
        <action android:name="com.spotify.music.queuechanged"/>
    </intent-filter>

</receiver>

我有一个广播接收器类(全部设置):

public class Receiver extends BroadcastReceiver 

    static final class BroadcastTypes 
        static final String SPOTIFY_PACKAGE = "com.spotify.music";
        static final String PLAYBACK_STATE_CHANGED = SPOTIFY_PACKAGE + ".playbackstatechanged";
        static final String METADATA_CHANGED = SPOTIFY_PACKAGE + ".metadatachanged";
    

    @Override
    public void onReceive(Context context, Intent intent) 

        long timeSentInMs = intent.getLongExtra("timeSent", 0L);
        String action = intent.getAction();

        if (action.equals(BroadcastTypes.METADATA_CHANGED)) 

            String trackId = intent.getStringExtra("id");
            String artistName = intent.getStringExtra("artist");
            String albumName = intent.getStringExtra("album");
            String trackName = intent.getStringExtra("track");
            int trackLengthInSec = intent.getIntExtra("length", 0);

            //send data to main class?

         else if (action.equals(BroadcastTypes.PLAYBACK_STATE_CHANGED)) 

           boolean playing = intent.getBooleanExtra("playing", false);
            int positionInMs = intent.getIntExtra("playbackPosition", 0);

            //send data to main class?
        
    

我的主要活动中也有以下方法:

public void mute(AudioManager audioManager)

    audioManager.setStreamMute(am.STREAM_SYSTEM, true);



public void unMute(AudioManager audioManager)

    audioManager.setStreamMute(am.STREAM_SYSTEM,false);


我想在接收和分析来自我的 Receiver 类的广播数据后调用它。

总结:

所以现在我不确定如何在我的主要活动中实际开始从 Spotify 获取数据(我是否必须手动“呼叫”我的接收器,或者它是否会在我的主要活动中自动在后台收听广播)活动正在运行)。

非常感谢详细的解释,并将获得奖励。

【问题讨论】:

【参考方案1】:

只需要通过清单静态注册一个接收器类。应用程序将自动侦听接收器意图过滤器中定义的意图操作,例如

在接收到指定操作之一时,应用程序将自动启动后台线程以运行 onReceive 方法。

据我所知,您已完成静态接收器注册所需的所有设置。

但请注意,从 Android 3.1 开始,如果用户从未启动过相应的应用程序或用户通过 Android 菜单明确停止了应用程序,Android 系统默认会排除所有接收方接收意图

还要确保 Spotify 启用了媒体通知:https://developer.spotify.com/technologies/spotify-android-sdk/android-media-notifications/#enabling-media-notifications

【讨论】:

以上是关于如何接收外部应用程序的广播元数据?的主要内容,如果未能解决你的问题,请参考以下文章

GAP Roles

私人广播发送者和接收者权限

如何在不发出单独请求的情况下将元数据和音轨从广播流中分离出来

如何使用警报管理器将数据从片段传递到广播接收器

如何将元数据从 ExoPlayer 发送到蓝牙?

如何将消息/数据从广播接收器(process1)发送到android中的服务线程(process2)?