Как я могу запустить MusicPlaybackService из внешнего приложения?

Я пытаюсь расширить функциональность кнопки дистанционного управления проводным микрофоном с помощью службы и приемника, которые находятся поверх приложения Google Play Music и общаются с ним через трансляции. Я использую ICS с Google Nexus S.

У меня проблема в том, что мой код отлично работает после запуска MusicPlaybackService, что не всегда так. Как запустить эту службу без отображения пользовательского интерфейса (без ведома пользователя). Мой код имеет следующие определения:

public static final String SERVICECMD = "com.android.music.musicservicecommand";
public static final String CMDNAME = "command";
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String TOGGLEPAUSE_ACTION = "com.android.music.musicservicecommand.togglepause";

Я пробовал следующие варианты:

1) На основе этого вопроса SO. Я не уверен, что насчет SERVICECMD, поскольку в вопросе говорится, что я должен использовать «com.android.music.musicservicecommand», хотя для ICS я считаю, что имена пакетов изменились.

Intent i = new Intent(SERVICECMD); 
i.putExtra(CMDNAME, CMDTOGGLEPAUSE); 
sendBroadcast(i);

Я также попытался заменить SERVICECMD на TOGGLEPAUSE_ACTION.

2) Из этой проблемы проекта Android.

Intent musicIntent = new Intent();
musicIntent.setClassName("com.google.android.music", "com.google.android.music.MusicPlaybackService");
musicIntent.setAction(TOGGLEPAUSE_ACTION);
musicIntent.putExtra(CMDNAME, CMDTOGGLEPAUSE); // or "next" or "previous"
sendBroadcast(musicIntent);

3) Этот код вылетает с ошибкой ниже. Я не уверен, как пойти дальше с этой опцией.

Вызвано: android.content.ActivityNotFoundException: невозможно найти явный класс активности {com.google.android.music/com.google.android.music.MusicPlaybackService}; Вы объявили эту активность в своем AndroidManifest.xml?

Intent intent = new Intent();
intent.putExtra(CMDNAME, CMDTOGGLEPAUSE); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.google.android.music", "com.google.android.music.MusicPlaybackService");
startActivity(intent);

4) Я заметил, что когда гарнитура снимается с моего телефона, запускается служба MusicPlaybackService, потому что она отвечает на трансляцию Intent.ACTION_HEADSET_PLUG, которую получает WiredAccessoryObserver. Я попытался продублировать эту трансляцию в своем коде, используя значения, показанные в LogCat.

Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
intent.putExtra("state", 0);
intent.putExtra("name", "h2w");
intent.putExtra("microphone", 1);
sendBroadcast(intent);

Я действительно ищу метод, который работает все время, просто запуская службу. Я открыт ко всему. Мне все еще нужно попытаться привязаться к службе, которая использует IMediaPlaybackService.aidl, которая должна прерываться случайным образом и не идеальна. Заранее спасибо за помощь.

РЕДАКТИРОВАТЬ

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

Вызвано: java.lang.SecurityException: не разрешено привязываться к намерению службы { cmp=com.google.android.music/.MusicPlaybackService }

В моей функции OnCreate

if (mPlaybackService == null) { 
    Intent i = new Intent(); 
    i.setClassName("com.google.android.music","com.google.android.music.MusicPlaybackService" ); 
    bindService(i, connection, Context.BIND_AUTO_CREATE); 
}

В моем классе

IMediaPlaybackService mPlaybackService = null;
ServiceConnection connection = new ServiceConnection() {
    public void onServiceConnected(ComponentName name, IBinder service) {     
        mPlaybackService = IMediaPlaybackService.Stub.asInterface(service);
}

    public void onServiceDisconnected(ComponentName name) { 
         mPlaybackService = null; 
    } 
};

person rarp    schedule 20.04.2012    source источник


Ответы (1)


Я не думаю, что это возможно. Мой обходной путь - позволить приложениям собственный широковещательный приемник разбудить службу при нажатии кнопки. Я просто запрашиваю аудиофокус для своего приложения и жду, пока он не потеряется.

person rarp    schedule 23.04.2012
comment
ты получил решение? - person Debugger; 28.12.2014