如何停止或暂停 Pandora 和 Spotify

Posted

技术标签:

【中文标题】如何停止或暂停 Pandora 和 Spotify【英文标题】:How to stop or pause Pandora and Spotify 【发布时间】:2012-05-06 17:58:15 【问题描述】:

我的应用程序具有启动应用程序、Pandora 工作站或快捷方式的功能。这一切都很好。稍后我想停止我启动的应用程序。这适用于大多数事情,除了 Pandora 和 Spotify 并不总是关闭。有时他们会这样做,但并非总是如此。它似乎与当前的 UI 状态有关。例如,当我显示 Pandora 或显示主屏幕时,它工作正常。当 Home Dock 或 Car Mode 处于活动状态时,它不起作用。你可以在这里看到我所有的源代码:http://code.google.com/p/a2dpvolume/ service.java 是具有此功能的文件。

这是尝试停止播放音乐然后停止应用程序的代码部分。

if (bt2.hasIntent()) 
        // if music is playing, pause it
        if (am2.isMusicActive()) 
            // first pause the music so it removes the notify icon
            Intent i = new Intent("com.android.music.musicservicecommand");
            i.putExtra("command", "pause");
            sendBroadcast(i);
            // for more stubborn players, try this too...
            Intent downIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
            KeyEvent downEvent2 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP);
            downIntent2.putExtra(Intent.EXTRA_KEY_EVENT, downEvent2);
            sendOrderedBroadcast(downIntent2, null);
        

        // if we opened a package for this device, try to close it now
        if (bt2.getPname().length() > 3 && bt2.isAppkill()) 
            // also open the home screen to make music app revert to
            // background
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            // now we can kill the app is asked to

            final String kpackage = bt2.getPname();
            CountDownTimer killTimer = new CountDownTimer(6000, 3000) 
                @Override
                public void onFinish() 
                    try 
                        stopApp(kpackage);
                     catch (Exception e) 
                        e.printStackTrace();
                        Log.e(LOG_TAG, "Error " + e.getMessage());
                    
                

                @Override
                public void onTick(long arg0) 

                    if (am2.isMusicActive()) 

                        // for more stubborn players, try this too...
                        Intent downIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
                        KeyEvent downEvent2 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP);
                        downIntent2.putExtra(Intent.EXTRA_KEY_EVENT, downEvent2);
                        sendOrderedBroadcast(downIntent2, null);
                    

                    try 
                        stopApp(kpackage);
                     catch (Exception e) 
                        e.printStackTrace();
                        Log.e(LOG_TAG, "Error " + e.getMessage());
                    
                
            ;
            killTimer.start();

        
    

这里是函数 stopApp()。

protected void stopApp(String packageName) 
    Intent mIntent = getPackageManager().getLaunchIntentForPackage(
            packageName);
    if (mIntent != null) 
        try 

            ActivityManager act1 = (ActivityManager) this
                    .getSystemService(ACTIVITY_SERVICE);
            // act1.restartPackage(packageName);
            act1.killBackgroundProcesses(packageName);
            List<ActivityManager.RunningAppProcessInfo> processes;
            processes = act1.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo info : processes) 
                for (int i = 0; i < info.pkgList.length; i++) 
                    if (info.pkgList[i].contains(packageName)) 
                        android.os.Process.killProcess(info.pid);
                    
                
            
         catch (ActivityNotFoundException err) 
            err.printStackTrace();
            Toast t = Toast.makeText(getApplicationContext(),
                    R.string.app_not_found, Toast.LENGTH_SHORT);
            if (notify)
                t.show();
        

    

其他人遇到过这个问题吗?如何可靠地停止启动的应用程序?我需要先让它暂停并将其置于后台。这就是我遇到的问题。它适用于大多数情况,但不是全部。在某些情况下,Pandora 和 Spotify 不会响应正在发送的关键事件,它们只是继续播放。这使通知图标保持活动状态并使应用程序成为前台活动,因此我无法停止它。

【问题讨论】:

【参考方案1】:

我终于发现,当 Pandora 看到耳机断开连接时,它确实会暂停音乐。所以,我只需要发送断开连接的意图,这样 Pandora 就会暂停。一旦暂停,它就可以被推到后台并被杀死。

//Try telling the system the headset just disconnected to stop other players
            Intent j = new Intent("android.intent.action.HEADSET_PLUG");
            j.putExtra("state", 0);
            sendBroadcast(j);

【讨论】:

【参考方案2】:

对于其他尝试这个的人;除非您作为系统运行,否则不再允许广播 android.intent.action.HEADSET_PLUG Intent。

【讨论】:

【参考方案3】:

由于“HEADSET_PLUG”意图现在仅在被系统调用时才受支持,我发现应用特定的意图是要走的路:

           Intent pauseSpotify = new Intent("com.spotify.mobile.android.ui.widget.PLAY");
           pauseSpotify.setPackage("com.spotify.music");
           sendBroadcast(pauseSpotify);

本质上,它的作用是从 spotify 应用程序中调用“PLAY”。

我从article 那里得到了这个想法,并将其应用于普通的 android。

【讨论】:

以上是关于如何停止或暂停 Pandora 和 Spotify的主要内容,如果未能解决你的问题,请参考以下文章

按 f1 按钮时如何停止 Spotify

从 iPhone 应用程序暂停/恢复 Pandora

如何在 Skype 上打来电话时以编程方式暂停 spotify

向 Sonos Controller 发送“停止播放”

如何使用 Spotify Web API 的 PUT 命令通过 Android 应用程序暂停我的 Spotify

如何捕捉 SKScene 暂停或 audioEngine 停止的时刻?