MediaStore.Audio.Playlists.Members.getContentUri的字符串参数'volumeName'是指什么?

15

我想查询给定播放列表的成员。我有正确的播放列表ID,并希望使用managedQuery()来查看相关的播放列表成员。

我的代码是这样的:

private String [] columns = { 
     MediaStore.Audio.Playlists.Members.PLAYLIST_ID,
     MediaStore.Audio.Playlists.Members.TITLE,
     };
Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri(volume, playlistId);
Cursor tCursor = managedQuery(membersUri, columns, null, null, null);

我不知道volume参数需要填什么。我尝试过使用MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI.toString()作为"volume"参数。

这会给我返回一个看起来像这样的有效内容URI:

content://media/external/audio/playlists/2/members

然而我的光标返回null。我可能完全错了——我知道我想做的事情非常简单。


我已经缩小了范围——我相信我正在寻找的是"external"参数。我认为这是因为我可以使用任何虚假字符串并获得相同的空游标,但是使用外部URI时,URI看起来是正确的(如上所述,它看起来像我粘贴了我使用"external"时的版本)。此外,使用"external",我会得到不同的行为。当调用managedQuery时,我会得到一个NullPointerException,带有一个非常没有帮助的堆栈跟踪。 在android.content.ContentResolver.query(ContentResolver.java:149) 在android.app.Activity.managedQuery(Activity.java:1499) - Brett
2个回答

9

MediaStore.Audio.Playlists.Members.getContentUri(volume, playlistId)中,字符串"external"作为音量参数。

该活动会列出Android设备上的歌曲、播放列表及其内容。

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;

public class PlaylistActivity extends Activity {
    private final String [] STAR= {"*"};
    private final String TAG= "list";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);

        Log.i(TAG, "All the titles");
        Uri allaudio_uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor ca= managedQuery(allaudio_uri, STAR, null,null,null);
        for(ca.moveToFirst(); !ca.isAfterLast(); ca.moveToNext()){
            if(ca.isFirst()){   // print all the fields of the first song
                for(int k= 0; k<ca.getColumnCount(); k++)
                    Log.i(TAG, "  "+ca.getColumnName(k)+"="+ca.getString(k));
            }else{              // but just the titles of the res
                Log.i(TAG, ca.getString(ca.getColumnIndex("title")));
            }
        }
        Log.i(TAG, "--------------------------");
        Log.i(TAG, "All the playlists");
        Uri playlist_uri= MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;    
        Cursor cursor= managedQuery(playlist_uri, STAR, null,null,null);
        cursor.moveToFirst();
        for(int r= 0; r<cursor.getCount(); r++, cursor.moveToNext()){
            Log.i(TAG, "-----");
            Log.i(TAG, "Playlist " + cursor.getString(cursor.getColumnIndex("name")));
            for(int k= 0; k<cursor.getColumnCount(); k++)           
                Log.i(TAG, cursor.getColumnName(k)+"="+cursor.getString(k));

            // the members of this playlist
            int id= cursor.getInt(0);
            Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri("external", id);
            Cursor membersCursor = managedQuery(membersUri, STAR, null, null, null);
            membersCursor.moveToFirst();
            for(int s= 0; s<membersCursor.getCount(); s++, membersCursor.moveToNext())
                Log.i(TAG, "  "+membersCursor.getString(membersCursor.getColumnIndex("title")));
            membersCursor.close();
        }
        cursor.close();
    }
}

11
并没有真正回答问题。体积是多少?除了“外部”之外,还有哪些可能的值?这里的“外部”指的是什么——它与http://developer.android.com/guide/topics/data/data-storage.html中使用的“外部”相同吗?等等。 - Yang
@hexatron,字符串“external”的常量值是多少?我正在寻找类似于const val VOLUME_EXTERNAL = "external"这样的声明。 - Sourav Kannantha B

0
根据android.provider.MediaStore中的代码,它可以是“内部”或“外部”。

/**
 * The content:// style URI for the internal storage.
 */
public static final Uri INTERNAL_CONTENT_URI =
        getContentUri("internal");

/**
 * The content:// style URI for the "primary" external storage
 * volume.
 */
public static final Uri EXTERNAL_CONTENT_URI =
        getContentUri("external");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接