Как остановить или приостановить Pandora и Spotify

У меня есть приложение для запуска приложения, станции Pandora или ярлыка. Это все работает отлично. Позже я хочу остановить приложение, которое я запустил. Это работает для большинства вещей, кроме Pandora и Spotify, которые не всегда закрываются. Иногда они делают, но не всегда. Кажется, это связано с текущим состоянием интерфейса. Например, он отлично работает, когда у меня отображается Pandora или домашний экран. Когда активирован режим Home Dock или Car Mode, он не работает. Вы можете увидеть весь мой исходный код здесь:http://code.google.com/p/a2dpvolume/ service.java - это файл с этой функциональностью.

Вот часть этого кода, которая пытается остановить воспроизведение музыки, а затем остановить приложение.

<code>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();

        }
    }
</code>

Вот функция stopApp ().

<code>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();
        }

    }
}
</code>

Кто-то еще сталкивался с этой проблемой? Как я могу надежно остановить запущенное приложение? Мне нужно сначала заставить его остановиться и поставить его на задний план. Это проблема, с которой я столкнулся. Это работает для большинства ситуаций, но не для всех. В некоторых случаях Pandora и Spotify не реагируют на отправляемое ключевое событие и просто продолжают играть. Это сохраняет значок уведомления активным и делает приложение активным, поэтому я не могу его остановить.

Ответы на вопрос(3)

Намерение android.intent.action.HEADSET_PLUG больше не разрешено для трансляции, если вы не работаете в качестве системы.

Решение Вопроса

что 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);

HEADSET_PLUG & quot; intent теперь поддерживается только в том случае, если он вызывается системой, я обнаружил, что конкретные намерения приложения - это путь:

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

По сути, то, что это делает, это называется «ИГРАТЬ» из приложения spotify.

Я получил идею отстатья и применил его к нормальному андроиду.

Ваш ответ на вопрос