2012-04-26 1 views
3

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

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

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 не будут отвечать на отправляемое ключевое событие, и они просто продолжают играть. Это удерживает значок уведомления активным и делает приложение приоритетным, поэтому я не могу его остановить.

ответ

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

0

Как «HEADSET_PLUG» намерение теперь поддерживается только при вызове системой, я нашел приложение конкретные намерения быть путь:

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

По сути, что это делает, это он называет «PLAY "из приложения spotify.

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