将Uri转换为非Uri android

时间:2012-09-12 12:45:07

标签: android file parsing uri converter

我有这样的道路:

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

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

我想将其转换为路径,例如/ mnt / sdcard /..

我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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允许您使用IO流读取数据,如果提供程序已实现该功能(IIRC这样做)。因此,您可以阅读由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
        }
}