Jak zatrzymać lub zatrzymać Pandorę i Spotify

Mam aplikację, która ma funkcję uruchamiania aplikacji, stacji Pandora lub skrótu. To wszystko działa dobrze. Później chcę zatrzymać uruchomioną aplikację. Działa to w większości rzeczy, z wyjątkiem Pandory i Spotify nie zawsze się zamyka. Czasem tak się dzieje, ale nie zawsze. Wydaje się, że jest to związane z bieżącym stanem interfejsu użytkownika. Na przykład działa dobrze, gdy wyświetla się Pandora lub wyświetlany jest ekran główny. Gdy aktywny jest Home Dock lub Car Mode, nie działa. Możesz zobaczyć cały mój kod źródłowy tutaj:http://code.google.com/p/a2dpvolume/ service.java to plik, który ma tę funkcję.

Oto część tego kodu, która próbuje zatrzymać odtwarzanie muzyki, a następnie zatrzymać aplikację.

<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>

Oto funkcja 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>

Czy ktoś inny napotkał ten problem? Jak mogę niezawodnie zatrzymać uruchomioną aplikację? Najpierw muszę go przerwać i umieścić w tle. To jest problem, który mam. Działa w większości sytuacji, ale nie we wszystkich. Niektóre przypadki Pandora i Spotify nie odpowiedzą na wysyłane kluczowe zdarzenie i po prostu grają dalej. Dzięki temu ikona powiadomienia jest aktywna, a aplikacja działa na pierwszym planie, więc nie mogę jej zatrzymać.

questionAnswers(3)

yourAnswerToTheQuestion