如需基于搜索查询播放音乐,请使用 INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
Intent。应用可能会触发此 Intent 来响应用户的音乐播放语音命令。 接收此 Intent 的应用会在其库存音乐内搜索与给定查询匹配的现有内容,并在找到后开始播放该内容。
此 Intent 应该包括 EXTRA_MEDIA_FOCUS
字符串 extra,以指定预期搜索模式。 例如,搜索模式可指定搜索的目标是艺术家姓名还是歌曲名称。
-
操作
-
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
数据 URI 架构
- 无 MIME 类型
- 无 Extra
-
-
表示搜索模式(用户是否在寻找特定艺术家、专辑、歌曲或播放列表)。 大多数搜索模式都需要额外的 extra。例如,如果用户有意收听某一首歌曲,Intent 可能需要额外增加三个 extra:歌曲名称、艺术家和专辑。 对于
EXTRA_MEDIA_FOCUS
的每个值,此 Intent 都支持下列搜索模式:-
播放任意音乐。接收 Intent 的应用应该根据智能选择(如用户最后收听的播放列表)播放音乐。
额外 extra:
QUERY
(必需)- 一个空字符串。始终提供此 extra,以实现向后兼容性:不了解搜索模式的现有应用可将此 Intent 作为非结构化搜索进行处理。
-
播放通过非结构化搜索查询找到的特定歌曲、专辑或类型。当应用无法识别用户想要收听的内容类型时,可能会生成一个具有此搜索模式的 Intent。 应用应尽可能使用更确切的搜索模式。
额外 extra:
QUERY
(必需)- 一个包含艺术家、专辑、歌曲名称或类型任意组合的字符串。
-
播放特定类型的音乐。
额外 extra:
"android.intent.extra.genre"
(必需)- 类型。QUERY
(必需)- 类型。始终提供此 extra,以实现向后兼容性:不了解搜索模式的现有应用可将此 Intent 作为非结构化搜索进行处理。
-
播放特定艺术家的音乐。
额外 extra:
EXTRA_MEDIA_ARTIST
(必需)- 艺术家。"android.intent.extra.genre"
- 类型。QUERY
(必需)- 一个包含艺术家或类型任意组合的字符串。 始终提供此 extra,以实现向后兼容性:不了解搜索模式的现有应用可将此 Intent 作为非结构化搜索进行处理。
-
播放特定专辑的音乐。
额外 extra:
EXTRA_MEDIA_ALBUM
(必需)- 专辑。EXTRA_MEDIA_ARTIST
- 艺术家。"android.intent.extra.genre"
- 类型。QUERY
(必需)- 一个包含专辑或艺术家任意组合的字符串。 始终提供此 extra,以实现向后兼容性:不了解搜索模式的现有应用可将此 Intent 作为非结构化搜索进行处理。
-
播放特定歌曲。
额外 extra:
EXTRA_MEDIA_ALBUM
- 专辑。EXTRA_MEDIA_ARTIST
- 艺术家。"android.intent.extra.genre"
- 类型。EXTRA_MEDIA_TITLE
(必需)- 歌曲名称。QUERY
(必需)- 一个包含专辑、艺术家、类型或名称任意组合的字符串。 始终提供此 extra,以实现向后兼容性:不了解搜索模式的现有应用可将此 Intent 作为非结构化搜索进行处理。
-
播放特定播放列表或符合额外 extra 指定的某些条件的播放列表。
额外 extra:
EXTRA_MEDIA_ALBUM
- 专辑。EXTRA_MEDIA_ARTIST
- 艺术家。"android.intent.extra.genre"
- 类型。"android.intent.extra.playlist"
- 播放列表。EXTRA_MEDIA_TITLE
- 播放列表所基于的歌曲名称。QUERY
(必需)- 一个包含专辑、艺术家、类型、播放列表或名称任意组合的字符串。 始终提供此 extra,以实现向后兼容性:不了解搜索模式的现有应用可将此 Intent 作为非结构化搜索进行处理。
任意 -
"vnd.android.cursor.item/*"
非结构化 -
"vnd.android.cursor.item/*"
类型 -
Audio.Genres.ENTRY_CONTENT_TYPE
艺术家 -
Audio.Artists.ENTRY_CONTENT_TYPE
专辑 -
Audio.Albums.ENTRY_CONTENT_TYPE
歌曲 -
"vnd.android.cursor.item/audio"
播放列表 -
Audio.Playlists.ENTRY_CONTENT_TYPE
-
MediaStore.EXTRA_MEDIA_FOCUS
(必需) -
示例 Intent:
如果用户想收听特定艺术家的音乐,搜索应用可生成以下 Intent:
public void playSearchArtist(String artist) {
Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH);
intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS,
MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist);
intent.putExtra(SearchManager.QUERY, artist);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
示例 Intent 过滤器:
<activity ...>
<intent-filter>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
处理此 Intent 时,您的 Activity 应通过检查传入
Intent
中
EXTRA_MEDIA_FOCUS
extra 的值来确定搜索模式。您的 Activity 识别出搜索模式后,应该读取该特定搜索模式额外 extra 的值。您的应用随后便可利用这些信息在其库存音乐内进行搜索,以播放与搜索查询匹配的内容。 例如:
protected void onCreate(Bundle savedInstanceState) {
...
Intent intent = this.getIntent();
if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) {
String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS);
String query = intent.getStringExtra(SearchManager.QUERY);
// Some of these extras may not be available depending on the search mode
String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM);
String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST);
String genre = intent.getStringExtra("android.intent.extra.genre");
String playlist = intent.getStringExtra("android.intent.extra.playlist");
String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE);
// Determine the search mode and use the corresponding extras
if (mediaFocus == null) {
// 'Unstructured' search mode (backward compatible)
playUnstructuredSearch(query);
} else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) {
if (query.isEmpty()) {
// 'Any' search mode
playResumeLastPlaylist();
} else {
// 'Unstructured' search mode
playUnstructuredSearch(query);
}
} else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) {
// 'Genre' search mode
playGenre(genre);
} else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) {
// 'Artist' search mode
playArtist(artist, genre);
} else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) {
// 'Album' search mode
playAlbum(album, artist);
} else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) {
// 'Song' search mode
playSong(album, artist, genre, title);
} else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) {
// 'Playlist' search mode
playPlaylist(album, artist, genre, playlist, title);
}
}
}