Не удается получить голосовые команды при работе приложения Android Auto Media

У меня есть приложение для Android с работающими функциями Auto, которое было отклонено из магазина, потому что:

"Ваше приложение не поддерживает все необходимые голосовые команды. Например, ваше приложение не содержит фильтра намерений для действия"android.media.action.MEDIA_PLAY_FROM_SEARCH"."

Поэтому я попытался, по крайней мере, заставить приложение реагировать на "воспроизведение музыки в приложении X", но, посмотрев документацию, я не могу заставить его работать. Я добавил это к своей основной деятельности (которая не является активностью запуска, она управляет службой через связыватель)

<intent-filter>
  <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

который вызывает MediaBrowserServiceCompatкоторый инициализируется таким образом: manifest:

<service
            android:name=".Services.RadioService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.media.browse.MediaBrowserService" />
            </intent-filter>
        </service>

часть кода:

   @Override
    public void onCreate() {
        super.onCreate();
        audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        mSession = new MediaSessionCompat(this, "RService");
        mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
                | MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS);
        mSession.setCallback(mCallback);
        mSessionConnector = new MediaSessionConnector(mSession);
        setSessionToken(mSession.getSessionToken());
        setMediaBrowser();
        initializeReceiver();
        C_F_App.createNotificationChannelPlayer(getApplicationContext());
        rNController = new RadioNotificationController(this, mSession, getApplicationContext());
    }

final MediaSessionCompat.Callback mCallback =
            new MediaSessionCompat.Callback() {
                @Override
                public void onPlayFromMediaId(String mediaId, Bundle extras) {
                    playForAuto(mediaId);
                }

                @Override
                public void onPlayFromSearch(String query, Bundle extras) {
                    super.onPlayFromSearch(query, extras);
                    Log.d("Test", "Test");
                }

                @Override
                public void onStop() {
                    playPause();
                }

                @Override
                public void onPlay() {
                    playPause();
                }

                @Override
                public void onPause() {
                    playPause();
                }
            };

public void setMediaBrowser() {
    mediaBrowser = new MediaBrowserCompat(getApplicationContext(),
            new ComponentName(getApplicationContext(), this.getClass()),
            new MediaBrowserCompat.ConnectionCallback() {
                @Override
                public void onConnected() {
                    super.onConnected();
                }

                @Override
                public void onConnectionSuspended() {
                    super.onConnectionSuspended();
                }

                @Override
                public void onConnectionFailed() {
                    super.onConnectionFailed();
                }
            }, null);

    mediaBrowser.connect();
}

@Override
public long getSupportedPrepareActions() {
    return PlaybackStateCompat.ACTION_PREPARE_FROM_MEDIA_ID |
            PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID |
            PlaybackStateCompat.ACTION_PREPARE_FROM_SEARCH |
            PlaybackStateCompat.ACTION_PLAY_FROM_SEARCH;
}

Авто возможности работают нормально.

Когда я пытаюсь вызвать это приложение на Авто из эмулятора для воспроизведения музыки, оно просто ничего не делает, не говорит об ошибках или других вещах, оно просто закрывает Google Speaker, а затем возвращается к нормальному отображению. Метод onPlayFromSearch никогда не вызывается, и это должен быть тот, который будет вызывать Auto при отправке голосовой команды.

Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Google Doc довольно бесполезен, Google UAP, похоже, не имеет такой возможности, как старая версия, но, глядя на старую версию UAP, я не могу понять, что я делаю неправильно.

PS. Приложение еще не опубликовано с этой функциональностью

Заранее спасибо.

1 ответ

Чтобы очистить процесс обзора, вам нужно всего лишь заставить "Play X" (пока приложение работает на переднем плане) работать. После добавления фильтра намерений, и если приложение обрабатывает поисковый запрос во время его работы, я бы начал обзор другого приложения.

В противном случае, я считаю, что это скорее функция Google Assistant, которая обрабатывает "Play X on Y", когда приложение не на переднем плане. У меня нет всех подробностей по этому поводу, но помощник может запрашивать у своих серверов имя приложения и пакет. Если он еще не опубликован, он может не работать локально.

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

Лучший способ проверить фильтр намерений, чтобы очистить обзор приложения, - вызвать намерение из adb на мобильном устройстве с помощью:

Оболочка adb запускается -a android.media.action.MEDIA_PLAY_FROM_SEARCH

Если ваше приложение отображается в следующей панели списка мультимедиа, фильтр намерений настроен правильно. Затем вы должны увидеть журнал "Test" onPlayFromSearch при отправке "Play music", когда приложение работает на Android Auto через настольное головное устройство.

Другие вопросы по тегам