0

我有这样的路径:

内容://媒体/外部/音频/媒体/7181

像这样获得的 String mSelectedPath = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "/"; ,然后我将歌曲 ID 附加到这个。

我想将其转换为 /mnt/sdcard/.. 等路径

我该怎么做呢?

4

2 回答 2

1

你没有。可能没有文件(例如,字节存储在数据库的 BLOB 列中,内容表示流),或者文件位于您的进程无法访问的位置。

于 2012-09-12T12:52:02.657 回答
1

Android 的媒体数据库将文件路径存储在DATA列中。你可以通过阅读

long id = 7181;
Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);

ContentResolver cr = getContentResolver();
String[] projection = { MediaColumns.DATA };
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor c = cr.query(uri, projection, selection, selectionArgs, sortOrder);
String path = null;
if (c != null) {
    if (c.moveToFirst()) {
        path = c.getString(0);
    }
    c.close();
}
Log.d("XYZ", "Path of " + id + " is:" + path);

但就像@CommonsWare 所说的那样(尤其是在未来的 android 版本上)可能没有您可以访问的文件,甚至根本没有路径,这意味着您获得的路径可能一文不值。

幸运 的是ContentProvider,如果提供者实现了该功能(IIRC 这个功能),您可以使用 IO 流读取数据。Uri所以你可以像下面的例子一样读取由它表示的数据。

long id = 7181;
Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);

ContentResolver cr = getContentResolver();
InputStream is = null;
try {
    is = cr.openInputStream(uri);
    is.read(); // replace with useful code.
} catch (FileNotFoundException e) {
    Log.w("XYZ", e);
} catch (IOException e) {
    Log.w("XYZ", e);
} finally {
    if (is != null)
        try {
            is.close();
        } catch (IOException e) {
            // ignored
        }
}
于 2012-09-12T13:04:39.900 回答