无法在 Android Auto Media App 上运行语音命令

Posted

技术标签:

【中文标题】无法在 Android Auto Media App 上运行语音命令【英文标题】:Can't get voice commands on Android Auto Media App work 【发布时间】:2018-12-21 11:14:06 【问题描述】:

我有一个具有自动功能的 android 应用,但已被商店拒绝,原因是:

“您的应用程序不支持所有必需的语音命令。 例如,您的应用不包含操作“android.media.action.MEDIA_PLAY_FROM_SEARCH”的 Intent 过滤器。”

所以我希望至少让应用程序响应“在 X 应用程序上播放音乐”,但通过查看文档我无法让它工作。我将此添加到我的主要活动中(这不是启动器活动,它通过活页夹控制服务)

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

触发MediaBrowserServiceCompat,以这种方式初始化: 清单:

<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;

自动功能运行良好。

当我尝试从模拟器自动调用此应用程序来播放音乐时,它什么也不做,它不会说错误或其他东西,它只是关闭谷歌语音,然后返回正常显示。 onPlayFromSearch 方法永远不会被调用,它应该是 Auto 在发送语音命令时调用的方法。

有人可以帮我弄清楚我做错了什么吗? Google doc 这样就没什么用了,Google UAP 看起来不像旧版本那样具有此功能,但是查看旧 UAP 版本我无法弄清楚我做错了什么。

PS。该应用尚未发布具有此功能的应用

提前致谢。

【问题讨论】:

【参考方案1】:

要清除审核过程,您只需让“Play X”(当应用在前台运行时)运行。添加意图过滤器后,如果应用在运行时处理了搜索查询,我将启动另一个应用审查。

否则,我相信它更像是一个 Google 助理功能,可以在应用不在前台时处理“在 Y 上播放 X”。我没有这方面的所有详细信息,但助手可能正在向他们的服务器查询应用程序名称和包。如果尚未发布,则可能无法在本地运行。

编辑

测试您的意图过滤器以清除应用审查的最佳方法是从移动设备上的 adb 调用意图:

adb shell am start -a android.media.action.MEDIA_PLAY_FROM_SEARCH

如果您的应用出现在以下媒体列表抽屉中,则表明 Intent 过滤器设置正确。然后,当应用通过桌面主机在 Android Auto 上运行时发送“播放音乐”时,您应该会看到 onPlayFromSearch“测试”日志触发。

【讨论】:

我尝试添加意图过滤器,但 Google 助理总是打开另一个应用程序,如 Youtube Music 或只是 Youtube,而不是我的应用程序。我该如何测试它?如果它是调试或发布的 APK,它可能会改变吗? @salminnella 我添加了一个 adb 命令来帮助测试。应用程序发布后,需要一些时间(可能是几天或更长时间)才能为应用程序标记和索引,以便 Google 助理运行“在 X 应用程序上播放音乐”。在调试或发布变体中运行不会对本地产生任何影响,因为助手是它自己的野兽,我们无法控制。很难找到任何真正的证据,但汽车用户社区论坛或 Google 的问题跟踪器上也有类似的问题。 感谢您的提问和回答。令我惊讶的是,谷歌的 Android Auto 开发者文档是多么糟糕,他们的应用审查过程是多么隐秘,以及究竟需要通过什么......以及谷歌助手知道应用名称并编组“播放”需要时间X on app Y" 向您的应用发出的请求。既然这样做了,我似乎至少让我的应用程序不会因为不支持语音命令而被拒绝。我说似乎是因为我已经看到了应用程序今天没有被拒绝但明天提交时没有任何更改并且失败的情况。 @salminnella 我面临着助手无法识别我的应用程序 adb 命令显示我的应用程序的类似情况。我现在不想支持 Android auto 我只需要从助手开始歌曲。我确实注册了 ACTION_PLAY_FROM_SEARCH 并实现了 onPlayFromSearch() 但没有运气。我的应用程序已经在商店里存放了 3 天。所以你知道问题可能是什么吗?请分享***.com/questions/62771616/… 同意@ThomasCarlisle。谷歌的 android 自动文档和指南非常不清楚,而且工作效率低下。垃圾

以上是关于无法在 Android Auto Media App 上运行语音命令的主要内容,如果未能解决你的问题,请参考以下文章

Android Media Player 随机引发错误并且无法播放

Android 11:无法从外部存储加载文件

Phonegap Media API (Android) - 未定义媒体

当Android设备设置为AP时在wireshark上捕获手机流量

HTML5 音频无法在移动设备上播放

@media print样式 关于table断页