从音频Uri获取真实路径

时间:2012-11-22 13:58:26

标签: android

在我的应用中,用户可以使用RingtonePreference选择通知。从后者我能够检索所选通知的Uri,并使用以下代码提取真实文件名:

private String getUriRealPath(Uri contentUri) {
    if (BuildConfig.DEBUG) {
        Log.d(TAG, "Getting real path of uri: " + contentUri.toString());
    }

    String path = null;
    final String[] projection = new String [] { MediaStore.Audio.Media.DATA };
    final Cursor cursor;

    try {
        cursor = mContext.getContentResolver().query(contentUri, projection, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            int idx = cursor.getColumnIndex(projection[0]);
             if (idx != -1) {
                 path = cursor.getString(idx);

                 if (BuildConfig.DEBUG) {
                     Log.d(TAG, "Real path is: " + path);
                 }
             }
             else {
                 if (BuildConfig.DEBUG) {
                     Log.d(TAG, "Path can't be resolved.");
                 }
             }
        }
    } catch (Exception e) {
        Log.e(TAG, "getUriRealPath - " + e);
    }

    return path;
}

但是,一旦用户选择通过第3方下载的通知,上述代码就无法找到真实路径。 提取的原因是我需要在SoundPool对象中播放通知的路径。

我可能已经看到了这个,但是getContentResolver()为我的应用程序返回了一个ContentResolver实例。我应该使用“全局”ContentResolver吗?

1 个答案:

答案 0 :(得分:0)

  

但是,一旦用户选择通过第3方下载的通知,上述代码就无法找到真实路径。

无论如何,您可能无法访问实际文件。首先,它可能不作为文件存在,而只作为流存在。其次,它可能不在您具有读访问权限的存储中。您只能通过提供给您的Uri可靠地访问此媒体。

  

提取的原因是我需要在SoundPool对象中播放通知的路径。

然后,您必须停止使用SoundPool并切换到MediaPlayerAudioTrack或其他内容。

  

我应该使用“全局”ContentResolver吗?

没有“全球”ContentResolver