Я пытаюсь расширить функциональность кнопки дистанционного управления проводным микрофоном с помощью службы и приемника, которые находятся поверх приложения 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;
}
};