0

次のようなパスがあります。

content://media/external/audio/media/7181

このようにして取得したもの String mSelectedPath = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "/"; に、曲の ID を追加します。

/mnt/sdcard/..のようなパスに変換したい。

どうすればいいですか?

4

2 に答える 2

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
        }
}
于 2012-09-12T13:04:39.900 に答える
1

あなたはそうしない。ファイルがない (たとえば、バイトがデータベースの BLOB 列に格納されている、コンテンツがストリームを表している) か、ファイルがプロセスからアクセスできない場所にある可能性があります。

于 2012-09-12T12:52:02.657 に答える