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
}
}