【问题标题】:Control the default music player of android or any other music player控制安卓或任何其他音乐播放器的默认音乐播放器
【发布时间】:2013-09-18 23:03:38
【问题描述】:

如何控制安卓或其他播放器的默认音乐播放器?通过控制我的意思是暂停,播放,下一个等。我必须绑定服务吗?我曾尝试使用IMediaPlaybackService,但它不起作用。肯定有一条出路,因为我在 android 市场上看到了控制音乐播放器的应用程序。有什么想法吗?

【问题讨论】:

    标签: android android-service


    【解决方案1】:
    AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    
    if(mAudioManager.isMusicActive()) {
        Intent i = new Intent(SERVICECMD);
        i.putExtra(CMDNAME , CMDSTOP );
        YourApplicationClass.this.sendBroadcast(i);
    }
    

    您可以通过获取音频管理器然后向它发送命令。

    这些是命令。

     public static final String CMDTOGGLEPAUSE = "togglepause";
     public static final String CMDPAUSE = "pause";
     public static final String CMDPREVIOUS = "previous";
     public static final String CMDNEXT = "next";
     public static final String SERVICECMD = "com.android.music.musicservicecommand";
     public static final String CMDNAME = "command";
     public static final String CMDSTOP = "stop";
    

    【讨论】:

    • 能否请您告诉我如何播放音乐,所有其他命令都在工作,但无法弄清楚如何播放音乐?谢谢你:)
    • 请问如何找到所有音乐播放器的SERVICECMD
    • 谢谢。它运作良好。是否可以使用默认相机应用使用相同的命令拍照?
    • @AbdellahBenhammou 你知道吗,如何在谷歌播放音乐中设置随机和重复模式。
    • 非常感谢@Ahmed Ekri。你节省了我很多时间:)
    【解决方案2】:

    为广播接收器发送Intent 的问题是,用户必须至少打开一次音乐播放器,而且它不适用于许多第三方音乐播放器。

    下面给出的代码适用于所有音乐播放器。

    long eventtime = SystemClock.uptimeMillis();
    
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
    KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
    sendOrderedBroadcast(downIntent, null);
    
    Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
    KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
    upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
    sendOrderedBroadcast(upIntent, null);
    
    /*NEXT*/
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
    KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN,   KeyEvent.KEYCODE_MEDIA_NEXT, 0);
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
    sendOrderedBroadcast(downIntent, null);
    
    /*PREVIOUS*/
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
    KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0);
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
    sendOrderedBroadcast(downIntent, null);
    

    我已经在 Sony、Htc 和 Samsung 设备上测试了此代码。

    此代码模仿免提(耳机)的播放/暂停按钮操作。

    【讨论】:

    • 我猜它只会播放/暂停音乐。我将如何实现下一个、上一个等功能?
    • 您能告诉我如何获取正在播放的歌曲的详细信息吗?我是否在广播接收器中获得回调以获取歌曲详细信息?
    • 嗨,我在 android 7 中运行此代码并且它正在运行。我的设备是华为 GR5 2017。但是我可以在生产应用程序中依赖它吗?有人用过这个吗?它是否适用于大多数 android 设备和版本?
    【解决方案3】:

    如果你想控制音乐播放器(当前播放的),有一种方法可以向它发送 KeyEvents:

    if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
    
    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
    mAudioManager.dispatchMediaKeyEvent(event);
    

    这是一种更安全的方式,因为通常广播 keyEvent 可能会导致一次播放多个玩家。

    注意:它需要具有 minSdk 19 或更高版本。

    【讨论】:

    • 这里再添加一个:对于少数音乐应用程序(例如 Spotify),您甚至必须调度“KeyEvent.ACTION_UP”事件才能工作。
    【解决方案4】:

    似乎引用的 KeyEvent 方法不适用于我在最新的 SDK 上。使用 AudioManager 的 dispatchMediaKeyEvent() 方法和定义的 KeyEvent 对我有用。

    见:here

    代码示例:

    this.mAudioManager = (AudioManager) this.context.getSystemService(Context.AUDIO_SERVICE);
    
    long eventtime = SystemClock.uptimeMillis();
    
    KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
    mAudioManager.dispatchMediaKeyEvent(downEvent);
    
    KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
    mAudioManager.dispatchMediaKeyEvent(upEvent);
    

    【讨论】:

    • downIntentupIntent 不是必需的,upIntent 行中有错字,但这非常有效!谢谢!
    • 感谢@mpkasp!您是否有机会知道我们是否可以获取当前播放歌曲的信息?干杯
    • @RJFares 是的,设置广播接收器并收听音乐播放器的变化mMusicReceiver = new BroadcastReceiver(this); mIntentFilter = new IntentFilter(); mIntentFilter.addAction("com.apple.android.music.metachanged"); mIntentFilter.addAction("com.apple.android.music.playstatechanged"); 您可以通过this.track = intent.getStringExtra("track"); 等获取曲目、专辑等
    【解决方案5】:

    Android 4.4 中有一个名为 RemoteController 的新方法,但它很麻烦,我无法让它工作。它还要求您将用户定向到全局安全设置并允许您的应用访问他们的所有通知!!!我不确定 Google 在这里的想法。

    无论如何我都按照说明进行操作,但 registerRemoteController() 仍然返回 false,所以我无能为力(显然 Google 从未听说过错误代码)。

    鉴于 user2572182 的方法似乎不适用于 Android 4.4,这似乎是不可能的。

    编辑:我在所有地方的 XDA 上找到了一个使用 RemoteController 的示例应用程序(谁知道那里有有用的内容?)。它可以在我的手机上使用,但您仍然需要告诉您的用户去更改一些模糊的安全设置,所以它并不理想:

    http://forum.xda-developers.com/showthread.php?p=51535568

    编辑 2: Google have changed this again in Android "L". 我猜他们意识到 RemoteControlClient 太复杂了。

    【讨论】:

    • 您的第二个链接重定向到 7.0 的“新功能”
    【解决方案6】:

    KeyEvent 在最新的 Android 中无法正常工作,也不支持 Spotify 等应用程序。最好的解决方案是使用MediaController。对于当前正在播放的每个应用程序并且您想要控制它,您必须创建不同的 MediaController。它需要上下文和 MediaSession.Token。令牌“识别”播放音乐的进程。例如,如果您播放 Google Play 音乐,而现在播放 Spotify,您可以为两者创建 MediaController。如何检索令牌?有两种方式:

    • MediaSessionManager 获取列表。你可以在Google example project找到它
    • 从通知中获取 - 如果您有权访问通知 (NotificationListenerService),则可以搜索来自音乐应用程序的通知并获取其当前令牌。

    您从 MediaController 检查当前会话状态:

    getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING
    

    并使用传输控件控制应用程序,例如:

    getTransportControls().skipToNext()
    

    根据您的 minSDK 是否使用 Compat 版本。您可以使用以下方法将 MediaSession.Token 转换为 MediaSessionCompat.Token:

    MediaSessionCompat.Token.fromToken(token)
    

    【讨论】:

    • 我喜欢一年半后这仍然是相关的。它实际上将 2 行命令变成了一个完整的架构。我只是想跳过后台播放的内容,而 KeyEvent 方法并不可靠,尤其是当您断开与感兴趣的设备的连接时,例如从 google cast 播放。
    【解决方案7】:

    所有最新和旧版本的解决方案(低于 Android 10 的 kitkat)

    /*global variable for audiomanager*/
     AudioManager mAudioManager;
    /*initalize audiomanager in oncreate or onCreateView if using fragment*/
     mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    /*trigger keyEvent to play system music */
    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                            mAudioManager.dispatchMediaKeyEvent(event);
                        }
                        else
                        {
                            Intent i = new Intent(SERVICECMD);
                            i.putExtra(CMDNAME , CMDPLAY );
                            sendBroadcast(i);
                        }
    /*you can use same code for stop system music but you need to change MEDIA_PLAY to MEDIA_STOP*/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多