Android 如何从谷歌云或设备读取歌曲
大画面:GUI向用户显示播放列表列表。用户选择一个。程序将所选播放列表传递给下一个活动,该活动将显示该播放列表中的歌曲 问题:我可以显示播放列表并注册用户选择,但我似乎无法显示该播放列表中的歌曲 是的,我看到了以下问题: 正如您在我的代码中所看到的,我已经尽了最大的努力来实现这些解决方案,但没有任何效果 要记住的事情:我正在Galaxy Nexus上测试这个,所以没有SD卡。云中只有内部存储和音乐。我需要它在任何场景(内部、外部或云)中工作。它目前在所有这些领域都不起作用Android 如何从谷歌云或设备读取歌曲,android,mediastore,Android,Mediastore,大画面:GUI向用户显示播放列表列表。用户选择一个。程序将所选播放列表传递给下一个活动,该活动将显示该播放列表中的歌曲 问题:我可以显示播放列表并注册用户选择,但我似乎无法显示该播放列表中的歌曲 是的,我看到了以下问题: 正如您在我的代码中所看到的,我已经尽了最大的努力来实现这些解决方案,但没有任何效果 要记住的事情:我正在Galaxy Nexus上测试这个,所以没有SD卡。云中只有内部存储和音乐。我需要它在任何场景(内部、外部或云)中工作。它目前在所有这些领域都不起作用 //@Suppr
//@SuppressWarnings ("serial)")
public class CreationActivity extends Activity {
private final String [] STAR= {"*"};
//reads in all songs to an array
@Override
public void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//set layout view and assign to variable
setContentView(R.layout.creation);
TableLayout myLayout = (TableLayout)findViewById(R.id.creationLayout);
try {
Bundle extras = getIntent().getExtras();
if (extras!=null){
//get the desired playlist and ID
String playlist = extras.getString("playlist");
Long playlistID = extras.getLong("playlistID");
ArrayList<song> songs = new ArrayList<song>();
//read in the songs from the playlist
String[] proj = {MediaStore.Audio.Playlists.Members.TITLE,
MediaStore.Audio.Playlists.Members.ARTIST,
MediaStore.Audio.Playlists.Members.DURATION};
//method 1
Cursor songCursor = getContentResolver().query(MediaStore.Audio.Playlists.Members.getContentUri(null,playlistID),
proj,
null,
null,
null);
//method 2
/*
Cursor songCursor = getContentResolver().query(Uri.parse("content://com.google.android.music.MusicContent/playlists/members"),
proj,
null,
null,
null);
*/
//method 3
/*
Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri("internal", playlistID);
Cursor membersCursor = managedQuery(membersUri, STAR, null, null, null);
*/
//then this part with methods 1 and 2
/*
if (songCursor.getCount() > 0) {
songCursor.moveToFirst();
do {
song currSong = new song();
currSong.title = songCursor.getString(0);
currSong.artist = songCursor.getString(1);
songs.add(currSong);
} while (songCursor.moveToNext());
}
songCursor.close();
*/
//or this part with method 3
/*
membersCursor.moveToFirst();
for(int s= 0; s<membersCursor.getCount(); s++,
membersCursor.moveToNext()){
song currSong = new song();
currSong.title = songCursor.getString(0);
currSong.artist = songCursor.getString(1);
songs.add(currSong);
}
membersCursor.close();
*/
}else{
Toast.makeText(getBaseContext(), "No songs",Toast.LENGTH_LONG).show();
}
} catch (NumberFormatException e){
}
}
}
/@SuppressWarnings(“串行”)
公共课堂创造性活动扩展了活动{
私有最终字符串[]星={“*”};
//将所有歌曲读入数组
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//设置布局视图并指定给变量
setContentView(R.layout.creation);
TableLayout myLayout=(TableLayout)findViewById(R.id.creationLayout);
试一试{
Bundle extras=getIntent().getExtras();
如果(附加值!=null){
//获取所需的播放列表和ID
String playlist=extras.getString(“播放列表”);
Long playlid=extras.getLong(“playlid”);
ArrayList歌曲=新建ArrayList();
//从播放列表中读入歌曲
String[]proj={MediaStore.Audio.Playlists.Members.TITLE,
MediaStore.Audio.Playlists.Members.ARTIST、,
MediaStore.Audio.Playlists.Members.DURATION};
//方法1
Cursor songCursor=getContentResolver().query(MediaStore.Audio.Playlists.Members.getContentUri(null,playlID),
项目,
无效的
无效的
无效);
//方法2
/*
游标songCursor=getContentResolver().query(Uri.parse(“content://com.google.android.music.MusicContent/playlists/members"),
项目,
无效的
无效的
无效);
*/
//方法3
/*
Uri membersUri=MediaStore.Audio.Playlists.Members.getContentUri(“内部”,playlatid);
游标membersCursor=managedQuery(membersUri,STAR,null,null,null);
*/
//然后本部分采用方法1和方法2
/*
如果(songCursor.getCount()>0){
songCursor.moveToFirst();
做{
歌曲=新歌();
currSong.title=songCursor.getString(0);
currSong.artist=songCursor.getString(1);
歌曲。添加(歌曲);
}while(songCursor.moveToNext());
}
songCursor.close();
*/
//或使用方法3的此部分
/*
MembersCorsors.moveToFirst();
对于(int s=0;s,我找到了答案。关键是将播放列表ID用作URI中的字符串。请参阅下面的代码
这是将获取播放列表名称和ID的部分:
String[] proj = {MediaStore.Audio.Playlists.NAME, MediaStore.Audio.Playlists._ID};
Uri playlistUri = Uri.parse("content://com.google.android.music.MusicContent/playlists");
Cursor playlistCursor = getContentResolver().query(playlistUri, proj, null, null, null);
if (playlistCursor.getCount() > 0) {
playlistCursor.moveToFirst();
do {
nameList.add(playlistCursor.getString(0));
idList.add(playlistCursor.getLong(1));
} while (playlistCursor.moveToNext());
}
一旦你有了播放列表ID,你就可以在播放列表中查询歌曲了。这是代码中实际查询信息并将其全部放入数组列表的部分。注意:“song”是我在别处定义的一个类,其中readSong是一个为各种值(标题、艺术家等)赋值的方法
ArrayList songs=new ArrayList();
//从正确的播放列表将歌曲读入曲库
String[]proj={MediaStore.Audio.Playlists.Members.TITLE,MediaStore.Audio.Playlists.Members.ARTIST,MediaStore.Audio.Playlists.Members.DURATION,MediaStore.Audio.Playlists.Members.\u ID};
Uri songUri=Uri.parse(“content://com.google.android.music.MusicContent/playlists/“+播放ID+”/成员”);
Cursor songCursor=getContentResolver().query(songUri,proj,null,null,null);
如果(songCursor.getCount()>0){
songCursor.moveToFirst();
做{
//创建虚拟歌曲
歌曲=新歌();
//将信息读取到虚拟变量
currSong.readSong(songCursor);
//将实例添加到集合
歌曲。添加(歌曲);
}while(songCursor.moveToNext());
}
songCursor.close();
我希望这能帮助其他为此而挣扎的人!!如果您对我的方法或改进方法有任何意见,请告诉我!您是否尝试过调试?查看变量的值是什么?请这样做,并告诉我们问题是什么。如果您所说的都是错误的,那么很难帮助您“不幸的是,音乐应用程序出人意料地退出了”。这就像是告诉你的医生这件事,而不是“有什么事困扰着我”“。具体点。可以……再过几天,但我会给你回复的。我认为从游标中取出东西放在一些列表中并不是很明智。继续使用游标-游标适配器等这对我很有帮助,谢谢你发布它!
ArrayList<song> songs = new ArrayList<song>();
//read songs into library from the correct playlist
String[] proj = {MediaStore.Audio.Playlists.Members.TITLE, MediaStore.Audio.Playlists.Members.ARTIST, MediaStore.Audio.Playlists.Members.DURATION, MediaStore.Audio.Playlists.Members._ID};
Uri songUri = Uri.parse("content://com.google.android.music.MusicContent/playlists/" + playlistID + "/members");
Cursor songCursor = getContentResolver().query(songUri, proj, null, null, null);
if (songCursor.getCount() > 0) {
songCursor.moveToFirst();
do {
//create dummy song
song currSong = new song();
//read info to dummy var
currSong.readSong(songCursor);
//add instance to collection
songs.add(currSong);
} while (songCursor.moveToNext());
}
songCursor.close();