Вопрос по android, pandora, spotify – Как остановить или приостановить Pandora и Spotify

3

У меня есть приложение для запуска приложения, станции 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   ответа
0

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

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

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

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

3

что 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 больше не разрешено для трансляции, если вы не работаете в качестве системы.

Похожие вопросы